繁体   English   中英

使生成的解析器在 Java 中为 ANTLR 4.8 工作

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM