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

Cannot parse System.out.println() in 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文件夹文件中指定的Java语法C:\javacc-6.0\examples\JavaGrammars\Java 1.0.2.jj

现在,当我在 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 警告和错误 generated.Can 有人帮忙吗?

编辑: 主要问题似乎是 JavaCC 正在生成未初始化 Token tk 的方法,这给了我错误tk not resolved.

以下将起作用。

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