2010-03-31 42 views
2

我正在嘗試將一個語法從野牛翻譯成ANTLR。語法本身在野牛中非常簡單,但我找不到一個簡單的方法來完成這個任務。來自野牛的ANTLR語法

語法野牛:

expr = expr or expr | expr and expr | (expr) 

任何提示/鏈接/指針是歡迎的。

感謝, 尤利安

回答

4

在ANTLR,你不能創建左遞歸規則:

a : a b 
    ; 

尾遞歸是好的:

a : b a 
    ; 

有關左遞歸規則的詳細信息,請參閱ANTLR's Wiki

所以,你的例子看起來是這樣:

parse 
    : expr+ EOF 
    ; 

expr 
    : orExpr 
    ; 

orExpr 
    : andExpr ('or' andExpr)* 
    ; 

andExpr 
    : atom ('and' atom)* 
    ; 

atom 
    : Boolean 
    | '(' expr ')' 
    ; 

Boolean 
    : 'true' 
    | 'false' 
    ; 

這裏有一個小的演示中的Java:

grammar BoolExp; 

@members { 
    public static void main(String[] args) throws Exception { 
    if(args.length != 1) { 
     System.out.println("Usage:"); 
     System.out.println(" - Windows : java -cp .:antlr-3.2.jar BoolExpParser \"EXPRESSION\""); 
     System.out.println(" - *nix/MacOS : java -cp .;antlr-3.2.jar BoolExpParser \"EXPRESSION\""); 
     System.exit(0); 
    } 
    ANTLRStringStream in = new ANTLRStringStream(args[0]); 
    BoolExpLexer lexer = new BoolExpLexer(in); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    BoolExpParser parser = new BoolExpParser(tokens); 
    parser.parse(); 
    } 
} 

parse 
    : e=expr EOF {System.out.println($e.bool);} 
    ; 

expr returns [boolean bool] 
    : e=orExpr {$bool = $e.bool;} 
    ; 

orExpr returns [boolean bool] 
    : e1=andExpr  {$bool = $e1.bool;} 
    ('or' e2=andExpr {$bool = $bool || $e2.bool;} 
    )* 
    ; 

andExpr returns [boolean bool] 
    : e1=atom  {$bool = $e1.bool;} 
    ('and' e2=atom {$bool = $bool && $e2.bool;} 
    )* 
    ; 

atom returns [boolean bool] 
    : b=Boolean  {$bool = new Boolean($b.text).booleanValue();} 
    | '(' e=expr ')' {$bool = $e.bool;} 
    ; 

Boolean 
    : 'true' 
    | 'false' 
    ; 

Space 
    : (' ' | '\t' | '\n' | '\r') {skip();} 
    ; 

首先創建一個詞法&分析器(1),然後編譯所有的源文件(2 )。最後,執行BoolExpParser類(3)。

// Windows & *nix/MacOS 
java -cp antlr-3.2.jar org.antlr.Tool BoolExp.g 
// Windows 
javac -cp .;antlr-3.2.jar *.java 

// *nix/MacOS 
javac -cp .:antlr-3.2.jar *.java 
// Windows 
java -cp .;antlr-3.2.jar BoolExpParser "false and true or true" 

// *nix/MacOS 
java -cp .:antlr-3.2.jar BoolExpParser "false and true or true" 

Terence ParrANTLR reference上ANTLR書Scott在ANTLR 3上創建了一些優秀的video tutorials(使用Eclipse)。

+0

非常感謝 - 這對我來說很好。你能建議我一個鏈接/書籍,我可以閱讀更多關於此?編輯:鏈接是好的;再次感謝。 – INS 2010-03-31 14:26:24

+1

我已經更新了我的答案,並提供了一個Wiki鏈接和一本書推薦。很高興聽到它幫助你。 – 2010-03-31 14:31:18