【问题标题】:Cannot parse System.out.println() in JavaCC无法在 JavaCC 中解析 System.out.println()
【发布时间】: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


    【解决方案1】:

    以下将起作用。

    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

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 2014-02-28
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多