【自制编译器】读书笔记 -- 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部分

猜你喜欢

转载自www.cnblogs.com/wangzming/p/10344531.html