无法解析JavaCC中的System.out.println()

时间:2015-09-05 16:33:49

标签: java parsing compiler-construction javacc

我试图将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

1 个答案:

答案 0 :(得分:0)

以下内容有效。

OutputStmt OutputStatement() :
{
  Token tk;
  Expression args;
  boolean ln;
  int line;
  int column;
}
{
  {line=token.beginLine;column=token.beginColumn;args=null;ln=false;}
  LOOKAHEAD({getToken(1).image.equals("System")})
  <ID> 
  "."
  LOOKAHEAD({getToken(1).image.equals("out")})
  <ID> 
  "."
  LOOKAHEAD({getToken(1).image.equals("println") || getToken(1).image.equals("print") })
  tk=<ID> { ln = tk.image.equals("println" ) ; }
  "("
     args=Expression()
  ")" ";"
  { return new OutputStmt(line,column,token.endLine,token.endColumn,ln,args); }
}

请注意,我将STRING_LITERAL更改为更传统的ID