【自制编译器】读书笔记 -- JavaCC使用的JJ文件格式

复制代码
options {
    STATIC = false;
}
PARSER_BEGIN(Adder)
import java.io.*;

class Adder {
    static public void main(String[] args) {
        for (String arg: args) {
            try {
               System.out.println(evaluate(arg));
            }
            catch (ParseException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }
    static public long evaluate(String src) throws ParseException {
        Reader reader = new StringReader(src);
        return new Adder(reader).expr();
    }
}
PARSER_END(Adder)

SKIP: {<[" ", "\t", "\r", "\n"]>}
TOKEN: {
    <INTEGER: (["0"-"9"])+>
}
TOKEN: {
    <VOID : "void">
   |<CHAR : "char">
   |<INT  : "short">
}

long expr():
{
    Token x,y;
}
复制代码

PASER_BEGIN, PARSER_END 定义了parser使用到的类

SKIP,TOKEN 等是保留的单词,存在的意义是用于解析代码

long是类型,代表的是long类型的符号字面量和它的实际用到的语义

expr():{...} 这里表示了一个表达式,在编译原理课程中是指生成式

其他的还有一些通用的函数如name()

这些语法都用在JavaCC使用的jj后缀文件里,在JavaCC里可以用来写语法制导的翻译,还有AST(抽象语法树的生成

利用javacc 编译jj后缀的文件得到java文件,编译后得到parser类,用于后续处理。至于解析后单元翻译成的代码,要继续看IR部分

 

posted @   stackupdown  阅读(1330)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示