2010-04-05 49 views
3

我對ANTLR相當陌生,所以這可能是一個簡單的問題。
我已經定義了一個簡單的語法這應該包括數字和標識符算術表達式ANTLR爲什麼不解析整個輸入?

的語法如下所示(以字母開始,並繼續與一個或多個字母或數字的字符串。):

grammar while; 

@lexer::header { 
    package ConFreeG; 
} 

@header { 
    package ConFreeG; 

    import ConFreeG.IR.*; 
} 

@parser::members { 
} 

arith: 
    term 
    | '(' arith ('-' | '+' | '*') arith ')' 
    ; 

term returns [AExpr a]:  
    NUM 
    { 
     int n = Integer.parseInt($NUM.text); 
     a = new Num(n); 
    } 
    | IDENT 
    { 
     a = new Var($IDENT.text); 
    } 
    ; 

fragment LOWER : ('a'..'z'); 
fragment UPPER : ('A'..'Z'); 
fragment NONNULL : ('1'..'9'); 
fragment NUMBER : ('0' | NONNULL); 
IDENT : (LOWER | UPPER) (LOWER | UPPER | NUMBER)*; 
NUM : '0' | NONNULL NUMBER*; 

fragment NEWLINE:'\r'? '\n'; 
WHITESPACE : (' ' | '\t' | NEWLINE)+ { $channel=HIDDEN; }; 

我在ANTLR IDE Eclipse插件中使用ANTLR v3。當我使用翻譯解析表達式(8 + a45),僅生成解析樹的一部分:

alt text http://i43.tinypic.com/or4idw.png

爲什麼第二項(A45)沒有得到解析?如果兩個詞都是數字,也會發生同樣的情況

謝謝

馬丁Wiboe

+0

這是一個用於解析你的出發規則? – Gokul 2010-04-05 20:07:25

+0

使用解釋器時,我選擇'arith'作爲解析規則。 – 2010-04-05 21:48:10

回答

4

你要創建一個具有EOF(文件結束)語法分析規則令牌這麼解析器將被迫去完成整個令牌流。在這條規則,而不是arith規則

parse 
    : arith EOF 
    ; 

,並讓翻譯開始:

添加此規則,以你的語法

alt text http://i40.tinypic.com/dg5c06.png

+0

這似乎不是很直觀,但它的確有竅門:) 謝謝! – 2010-04-06 10:04:39

+0

不客氣,馬丁。 – 2010-04-06 11:24:46