gpt4 book ai didi

java - ANTLR4语法编译空指针异常

转载 作者:行者123 更新时间:2023-12-02 09:03:24 25 4
gpt4 key购买 nike

总的来说,我正在尝试创建一个基于 Java 的应用程序,在其中我可以编译支持简单正则表达式的术语字典。然后,该词典将用于创建一个简单的实体标记器,其中在文本中标记已识别的术语。我认为 ANTLR 可能会提供我所需要的一切。尝试创建一个不依赖于编译的语法和词法分析器文件的 Java 应用程序,因为语法必须在运行时每隔几分钟更新一次。

这是我简单的“Hello World”应用程序:

LexerGrammar lg = new LexerGrammar(
"lexer grammar L;\n" +
"A : ('a'|'A');\n" +
"B : ('b'|'B');\n" +
"C : ('c'|'C');\n" +
"D : ('d'|'D');\n" +
"FILL_TOKEN : (.);\n");

Grammar g = new Grammar(
"parser grammar T;\n" +
"t_abc : A FILL_TOKEN? B FILL_TOKEN? C;\n" +
"t_abcd : A FILL_TOKEN? B FILL_TOKEN? C FILL_TOKEN? D;\n" +

"rule0 : t_abcd|t_abc;\n" +

"ws : '.' -> skip ;\n",
lg);

LexerInterpreter lexEngine =
lg.createLexerInterpreter(new ANTLRInputStream("Test A BCD"));
CommonTokenStream tokens = new CommonTokenStream(lexEngine);
ParserInterpreter parser = g.createParserInterpreter(tokens);
Rule rule = g.rules.get("rule0");
ParseTree t = parser.parse(rule.index);

System.out.println(t.getText());

当我尝试编译应用程序时,出现以下错误

Exception in thread "main" java.lang.NullPointerException
at org.antlr.v4.runtime.atn.ATNSerializer.serialize(ATNSerializer.java:73)
at org.antlr.v4.runtime.atn.ATNSerializer.getSerialized(ATNSerializer.java:601)
at org.antlr.v4.runtime.atn.ATNSerializer.getSerializedAsChars(ATNSerializer.java:605)
at org.antlr.v4.tool.Grammar.createParserInterpreter(Grammar.java:1337)
at main.OnTheFly.main(OnTheFly.java:98)

当我注释掉 "ws : '.' -> 跳过 ;\n", 语法部分,程序运行,但它提示 Test 未知。

我做错了什么或者默认语法不支持skip参数?使用Antlr 4.7.2和Java 1.8.0 (131)

最佳答案

找到答案了。只有词法分析器支持 skip 参数,此外,我只需要词法分析器。可以通过查看结果标记来检索匹配项:

... 
// using code from above with grammar part, including SKIP rule.
// In additions, all tokens have to be defined in
// ...

// required to process the input stream
tokens.fill();
for (Token token : tokens.getTokens()) {
int typeId = token.getType();
if (-1 == typeId) {
break;
}

String ruleName = lexEngine.getRuleNames()[token.getType() - 1];
System.out.println("Token: " + token.getText() + " - " + ruleName);
}

有关词法分析器和语法词汇的更多信息可以在此处找到:

https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md

https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md

关于java - ANTLR4语法编译空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60002238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com