【发布时间】:2020-01-31 10:36:47
【问题描述】:
一般来说,我正在尝试创建一个基于 Java 的应用程序,我可以在其中编译一个支持简单正则表达式的术语字典。然后该字典将用于创建一个简单的实体tagger,其中在文本中标记了已识别的术语。认为 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 : '.' -> skip ;\n", 部分时,程序运行,但它抱怨Test 未知。
我做错了什么或者默认语法不支持skip参数?
使用 Antlr 4.7.2 和 Java 1.8.0 (131)
【问题讨论】:
标签: java parsing antlr antlr4 tagging