2
我正在嘗試將一個語法從野牛翻譯成ANTLR。語法本身在野牛中非常簡單,但我找不到一個簡單的方法來完成這個任務。來自野牛的ANTLR語法
語法野牛:
expr = expr or expr | expr and expr | (expr)
任何提示/鏈接/指針是歡迎的。
感謝, 尤利安
我正在嘗試將一個語法從野牛翻譯成ANTLR。語法本身在野牛中非常簡單,但我找不到一個簡單的方法來完成這個任務。來自野牛的ANTLR語法
語法野牛:
expr = expr or expr | expr and expr | (expr)
任何提示/鏈接/指針是歡迎的。
感謝, 尤利安
在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 Parr的ANTLR reference是上ANTLR書。 Scott在ANTLR 3上創建了一些優秀的video tutorials(使用Eclipse)。
非常感謝 - 這對我來說很好。你能建議我一個鏈接/書籍,我可以閱讀更多關於此?編輯:鏈接是好的;再次感謝。 – INS 2010-03-31 14:26:24
我已經更新了我的答案,並提供了一個Wiki鏈接和一本書推薦。很高興聽到它幫助你。 – 2010-03-31 14:31:18