[英]Making generated parser work in Java for ANTLR 4.8
我一直無法讓我生成的解析器在 ANTLR 4.8 的 Java 中工作。 這個問題還有其他答案,但似乎 ANTLR 自 4.7 以來發生了變化,所有其他答案都在此更改之前。 我的代碼是:
String formula = "(fm.a < fm.b) | (fm.a = fm.b)";
CharStream input = CharStreams.fromString(formula);
Antlr.LogicGrammerLexer lexer = new Antlr.LogicGrammerLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
Antlr.LogicGrammerParser parser = new Antlr.LogicGrammerParser(tokens);
ParseTree pt = new ParseTree(parser);
它似乎正在將公式正確地讀入 CharStream,但是我過去嘗試做的任何事情都根本不起作用。 例如,如果我嘗試打印解析樹,則不會打印任何內容。 以下行將不打印任何內容:
System.out.println(lexer._input.getText(new Interval(0, 100)));
任何建議表示贊賞。
編輯:添加了語法文件:
grammar LogicGrammer;
logicalStmt: BOOL_EXPR | '('logicalStmt' '*LOGIC_SYMBOL' '*logicalStmt')';
BOOL_EXPR: '('IDENTIFIER' '*MATH_SYMBOL' '*IDENTIFIER')';
IDENTIFIER: CHAR+('.'CHAR*)*;
CHAR: 'a'..'z' | 'A'..'Z' | '1'..'9';
LOGIC_SYMBOL: '~' | '|' | '&';
MATH_SYMBOL: '<' | '≤' | '=' | '≥' | '>';
這一行:
ParseTree pt = new ParseTree(parser);
是不正確的。 您需要在解析器 object 上調用啟動規則方法來獲取解析樹
Antlr.LogicGrammerParser parser = new Antlr.LogicGrammerParser(tokens);
ParseTree pt = parser.whateveryourstartruleis();
就打印出您的輸入而言,通常以_
開頭的字段(如_input
)不適合外部使用。 雖然我懷疑失敗可能是您的輸入 stream 中沒有 100 個字符,所以Interval
無效。 (我還沒有嘗試看到確切的失敗)
如果你包括你的語法,我們中的一個人可以很容易地嘗試生成和編譯,也許更具體。
BOOL_EXPR
不應該是詞法分析器規則。 我建議你改為這樣做:
grammar LogicGrammer;
parse
: logicalStmt EOF
;
logicalStmt
: logicalStmt LOGIC_SYMBOL logicalStmt
| logicalStmt MATH_SYMBOL logicalStmt
| '(' logicalStmt ')'
| IDENTIFIER
;
IDENTIFIER
: CHAR+ ( '.'CHAR+ )*
;
LOGIC_SYMBOL
: [~|&]
;
MATH_SYMBOL
: [<≤=≥>]
;
SPACE
: [ \t\r\n] -> skip
;
fragment CHAR
: [a-zA-Z1-9]
;
可以通過運行以下代碼進行測試:
String formula = "(fm.a < fm.b) | (fm.a = fm.b)";
LogicGrammerLexer lexer = new LogicGrammerLexer(CharStreams.fromString(formula));
LogicGrammerParser parser = new LogicGrammerParser(new CommonTokenStream(lexer));
ParseTree root = parser.parse();
System.out.println(root.toStringTree(parser));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.