野牛的ANTLR语法 [英] ANTLR grammar from bison
问题描述
我正在尝试将野牛语法转换为ANTLR.语法本身在野牛中非常简单,但我找不到实现此目的的简单方法.
I'm trying to translate a grammar from bison to ANTLR. The grammar itself is pretty simple in bison but I cannot find a simple way for doing this.
野牛语法:
expr = expr or expr | expr and expr | (expr)
欢迎使用任何提示/链接/指针.
Any hints/links/pointers are welcome.
谢谢, 尤利安
推荐答案
在ANTLR中,您无法创建左递归规则:
In ANTLR, you cannot create left recursive rules:
a : a b
;
尾递归很好:
a : b a
;
有关左递归规则的更多信息,请参见 ANTLR的Wiki .
For more information on left recursive rules, see ANTLR's Wiki.
因此,您的示例如下所示:
So, your example could look like:
parse
: expr+ EOF
;
expr
: orExpr
;
orExpr
: andExpr ('or' andExpr)*
;
andExpr
: atom ('and' atom)*
;
atom
: Boolean
| '(' expr ')'
;
Boolean
: 'true'
| 'false'
;
这是Java中的一个小演示:
Here's a small demo in 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).
First create a lexer & parser (1) and then compile all source files (2). Finally, execute the BoolExpParser
class (3).
// Windows & *nix/MacOS
java -cp antlr-3.2.jar org.antlr.Tool BoolExp.g
2
// Windows
javac -cp .;antlr-3.2.jar *.java
// *nix/MacOS
javac -cp .:antlr-3.2.jar *.java
3
// 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 Parr 的 Scott 创建了一些出色的视频教程(在ANTLR 3上使用Eclipse).
Terence Parr's ANTLR reference is the book on ANTLR. And Scott created some excellent video tutorials on ANTLR 3 (with Eclipse).
这篇关于野牛的ANTLR语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!