2013-08-23 83 views
1

我有一個明顯錯誤的語法,因爲解析簡單文件會生成奇怪的錯誤消息。ANTLR4解析錯誤:在輸入沒有可行的替代

我在不改變錯誤的情況下儘可能簡化了以下語法(如果刪除'this' ANTLRWorks的樹gui輸出將示例文件的標記int顏色不同,儘管結構似乎相同)。

grammar DepClsJ_no_java_debug; 

module : (methodDecl)* ; 

methodDecl : pathType Identifier '()' block ; 

pathType : Identifier | 'this' ; 

block : '{' 
    (localDecl ';' )* 
    (statement )* 
    (expr )? 
    '}' ; 

localDecl : pathType Identifier ('=' expr)?; 

statement : block | expr ';' ; 

expr : dotExpr ('=' dotExpr )* ; dotExpr : Identifier ('.' Identifier)* ; 

Identifier : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; 

演示代碼:

void main() { 
    a = c; 
    int b; 
} 

ANTLRWorks 2給了我以下錯誤消息:

line 3:8 no viable alternative at input 'intb' 
line 3:9 mismatched input ';' expecting '()' 

回答

5

int b;localDecl,這根據你的語法不能出現後block規則第一個statement。如果通過使用以下內容來放鬆語法,那麼在解析成功完成後,您可能已經使用了分析樹偵聽器來生成有意義的錯誤消息。

block 
    : '{' 
    (localDecl ';' | statement)* 
    expr? 
    '}' 
    ; 
+2

OMG我怎麼會看不到? – Bastian