簡體   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