2011-12-12 90 views
0

我有以下ANTLR語法,它是Terrence Parr給出的一個例子。ANTLR語法pred

grammar b; 
backtrack 
    : (cast ';')=> cast ';' 
    | (e ';')=> e ';' 
    |    e '.' 
    ; 

cast: '(' ID ')' ; 

e : '(' e ')' 
    | ID 
; 

ID : 'a'..'z'+ ; 

然而,當我試圖解釋(a)與原路返回規則,我得到一個MisMatchedToken例外。我問這個問題是因爲我有一個更大的語法,我用它來編譯器。我在那裏遇到了確切的問題。如果我刪除了其中一條規則,那麼一切正常(當然,除了通過刪除規則的輸入分析之外),但是當我添加語法謂詞時,我會在解析時得到一個錯誤,即使語法編譯(與b完全一樣語法)。

任何建議或想法,爲什麼這可能是?謝謝。

回答

1

ANTLRWorks中的解釋器是臭名昭着的錯誤,並且根本不處理任何謂詞。所以不要使用它。

請注意,你說你解析了"a()",但這不會被正確解析。解析器會抱怨它缺少一個"."。我相信你的意思是你真實解析"a();"

如果您運行下面的演示:通過執行

grammar b; 

@parser::members { 
    public static void main(String[] args) throws Exception { 
    bLexer lexer = new bLexer(new ANTLRStringStream("(a);")); 
    bParser parser = new bParser(new CommonTokenStream(lexer)); 
    parser.backtrack(); 
    } 
} 

backtrack 
: (cast ';')=> cast ';' {System.out.println("cast");} 
| (e ';')=> e ';' {System.out.println("e");} 
|    e '.' 
; 

cast 
: '(' ID ')' 
; 

e 
: '(' e ')' 
| ID 
; 

ID : 'a'..'z'+ ; 

java -cp antlr-3.3.jar org.antlr.Tool b.g 
javac -cp antlr-3.3.jar *.java 
java -cp .:antlr-3.3.jar bParser

(在Windows上,最後的命令應該是:java -cp .;antlr-3.3.jar bParser

你會看到cast被打印到控制檯排除ANTLR的任何錯誤或警告。

0

如果你在ANTLRWorks中遇到這個錯誤,我會嘗試在示例程序中加載語法,看看你是否得到相同的錯誤。 ANTLRWorks有時可能會對有效輸入提供錯誤。