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: {<[" ", " ", " ", " "]>} 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部分