В общем, я пытаюсь создать приложение на основе 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)