[英]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.