2017-07-04 94 views
0

我想第一次嘗試javacc與一個簡單樸素的例子,這是不工作。我的BNF如下:使用上述文件JavaCC簡單的例子不工作

options 
{ 
} 
PARSER_BEGIN(SimpleAdd) 
public class SimpleAdd 
{ 
} 
PARSER_END(SimpleAdd) 
SKIP : 
{ 
    " " 
| "\r" 
| "\t" 
| "\n" 
} 
TOKEN: 
{ 
    < NUMBER: (["0"-"9"])+ > 
} 

int expr(): 
{ 
     int leftValue ; 
     int rightValue ; 
} 
{ 
     leftValue = num() 
     "+" 
     rightValue = num() 
     { return leftValue+rightValue; } 
} 

int num(): 
{ 
     Token t; 
} 
{ 
    t = <NUMBER> { return Integer.parseInt(t.toString()); } 
} 

,我生成Java源代碼類:

<exp>:= <num>"+"<num> 
<num>:= <digit> | <digit><num> 
<digit>:= [0-9] 

在此基礎上BNF,我寫了SimpleAdd.jj如下。我的主類是如下:

public class Main { 
    public static void main(String [] args) throws ParseException { 
     SimpleAdd parser = new SimpleAdd(System.in); 
     int x = parser.expr(); 
     System.out.println(x); 
    } 
} 

當我進入通過System.in表達,我收到以下錯誤:

11+11^D 
Exception in thread "main" SimpleAddTest.ParseException: Encountered "<EOF>" at line 0, column 0. 
Was expecting: 
    <NUMBER> ... 

    at SimpleAddTest.SimpleAdd.generateParseException(SimpleAdd.java:200) 
    at SimpleAddTest.SimpleAdd.jj_consume_token(SimpleAdd.java:138) 
    at SimpleAddTest.SimpleAdd.num(SimpleAdd.java:16) 
    at SimpleAddTest.SimpleAdd.expr(SimpleAdd.java:7) 
    at SimpleAddTest.Main.main(Main.java:9) 

任何的提示來解決問題呢?

回答

1

編輯請注意,此答案回答了問題的早期版本。

當BNF生產使用返回結果的非終結符時,可以將該結果記錄到變量中。

首先聲明變量在BNF生產

int expr(): 
{ 
    int leftValue ; 
    int rightValue ; 
} 
{ 

二的聲明部分,在生產的主體,記錄在變量的結果。

leftValue = num() 
    "+" 
    rightValue = num() 

最後,使用這些變量的值來計算此生產的結果。

{ return leftValue+rightValue; } 
} 
+0

我修改了jj文件並使用了你的答案,但我得到了同樣的錯誤 – user203788

+0

你確定你修改了return語句嗎?你重新運行JavaCC並重新編譯Java? –

+0

是的,我做到了,這是一個github的文件回購,https://github.com/noorbakerally/SimpleAddJavaCC – user203788