【发布时间】:2015-09-05 16:33:49
【问题描述】:
我试图将 System.out.println() 语句解析为 Java 语法的 OutputStatement。这是 EBNF 中的产生式规则:
Statement::=( LabeledStatement | AssertStatement | Block | EmptyStatement | StatementExpression | SwitchStatement | IfStatement | WhileStatement | DoStatement | ForStatement | BreakStatement | ContinueStatement | ReturnStatement | ThrowStatement | SynchronizedStatement | TryStatement|OutputStatement)
OutputStatement::="System.out.print"["ln"]"("Arguments")" ";"
这是严格按照javacc文件夹文件C:\javacc-6.0\examples\JavaGrammars\Java 1.0.2.jj中指定的Java语法进行的
现在,当我在 JavaCC 中编写生产规则时,它变成了:
OutputStmt OutputStatement():
{
Token tk;
Expression args;
boolean ln=false;
int line;
int column;
}
{
{line=token.beginLine;column=token.beginColumn;args=null;ln=false;}
tk=<STRING_LITERAL> LOOKAHEAD({tk.image.equals("System")})
"."
tk=<STRING_LITERAL> LOOKAHEAD({tk.image.equals("out")})
"."
tk=<STRING_LITERAL> LOOKAHEAD({tk.image.equals("print")})
[
tk=<STRING_LITERAL> LOOKAHEAD({tk.image.equals("ln")})
{
ln=true;
}
]
"("
args=Expression()
")" ";"
{
return new OutputStmt(line,column,token.endLine,token.endColumn,ln,args);
}
}
现在这会在生成的解析器中引发LOOKAHEAD 警告和错误。有人可以帮忙吗?
编辑:主要问题似乎是 JavaCC 正在生成未初始化 Token tk 的方法,这给了我错误 tk not resolved。
【问题讨论】:
标签: java parsing compiler-construction javacc