2015-09-05 51 views
0

我試圖將System.out.println()語句解析爲OutputStatement for Java語法。下面是EBNF產生式規則:無法解析JavaCC中的System.out.println()

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方法。

回答

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