ANTL4 Grammar compile Исключение Nullpointer - PullRequest
0 голосов
/ 31 января 2020

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

1 Ответ

1 голос
/ 31 января 2020

Нашел ответ. Только лексер поддерживает параметр 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

...