2010-03-31 72 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