Search code examples
javaparsingcompiler-constructionjavacc

Cannot parse System.out.println() in JavaCC


I was trying to parse System.out.println() statement as an OutputStatement for Java Grammar. Here's the production rule in 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")" ";"

This is strictly according to the Java Grammar as specified in the javacc folder file C:\javacc-6.0\examples\JavaGrammars\Java 1.0.2.jj

Now when I coded the production rule in JavaCC it came as:

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);
  }
}

Now this throws LOOKAHEAD Warnings and Errors in the Parser generated.Can anyone please help?

EDIT: The main problem as it seems is that JavaCC is generating methods which are not initializing Token tk and which is giving me the error tk not resolved.


Solution

  • The following will work.

    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); }
    }
    

    Note that I changed STRING_LITERAL to the more traditional ID.