ANTLR3 выдает внутреннюю ошибку с java.lang.NullPointerException - PullRequest
0 голосов
/ 04 января 2019

Я пытался использовать ANTLR3 для создания простого синтаксического анализатора выражения, но он выдает внутреннюю ошибку

Вот образец.

grammar Sample;

options {
    memoize=true;
    output=AST;
}

tokens {
    RegExp;
}

RegExpression: 
    '/' (a=~('/' | NL))+ '/'
      -> ^(RegExp[$RegExpression.start, $RegExpression.text] $a+ )
     ;

fragment NL: '\n' | '\r';
ANY : . ;

Я запускаю команду: java -jar antlr-3.5.2-complete.jar -print Sample.g

и это дает:

error(10):  internal error: Sample.g : java.lang.NullPointerException
org.antlr.grammar.v3.DefineGrammarItemsWalker.rewrite_atom(DefineGrammarItemsWalker.java:3896)

... ...

Обновлено в соответствии с комментариями

grammar Sample{
    memoize=true;
    output=AST;
}

tokens {
    RegExp;
}

regExpression: 
    '/' (a=~('/' | NL))+ '/'
      -> ^(RegExp[$regExpression.start, $regExpression.text] $a+ )
     ;

NL: '\n' | '\r';

А вот ошибки после запуска java -jar antlr-3.5.2-complete.jar Sample.g

error(10):  internal error: Sample.g : java.lang.NullPointerException
org.antlr.grammar.v3.CodeGenTreeWalker.getTokenElementST(CodeGenTreeWalker.java:311)
org.antlr.grammar.v3.CodeGenTreeWalker.notElement(CodeGenTreeWalker.java:2886)
org.antlr.grammar.v3.CodeGenTreeWalker.element(CodeGenTreeWalker.java:2431)
org.antlr.grammar.v3.CodeGenTreeWalker.element(CodeGenTreeWalker.java:2446)
org.antlr.grammar.v3.CodeGenTreeWalker.alternative(CodeGenTreeWalker.java:2250)
org.antlr.grammar.v3.CodeGenTreeWalker.block(CodeGenTreeWalker.java:1798)
org.antlr.grammar.v3.CodeGenTreeWalker.ebnf(CodeGenTreeWalker.java:3014)
org.antlr.grammar.v3.CodeGenTreeWalker.element(CodeGenTreeWalker.java:2495)
org.antlr.grammar.v3.CodeGenTreeWalker.alternative(CodeGenTreeWalker.java:2250)
org.antlr.grammar.v3.CodeGenTreeWalker.block(CodeGenTreeWalker.java:1798)
org.antlr.grammar.v3.CodeGenTreeWalker.rule(CodeGenTreeWalker.java:1321)
org.antlr.grammar.v3.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:955)
org.antlr.grammar.v3.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:877)
org.antlr.grammar.v3.CodeGenTreeWalker.grammar_(CodeGenTreeWalker.java:518)
org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:415)
org.antlr.Tool.generateRecognizer(Tool.java:674)
org.antlr.Tool.process(Tool.java:487)
org.antlr.Tool.main(Tool.java:98)

1 Ответ

0 голосов
/ 07 января 2019

Вы пытаетесь использовать правило перезаписи (построение дерева) в правиле лексера. Это не имеет смысла.

В ANTLR все правила с именем, начинающимся с заглавной буквы, являются правилами лексера. Конструкция дерева используется на узлах AST, а не на самих токенах, поэтому вы должны использовать ее в правилах синтаксического анализатора (начиная с строчной буквы).

Когда вы делаете это, имейте в виду, что ваш NL теперь является фрагментом (вы не можете использовать фрагменты в правилах синтаксического анализа) и убедитесь, что ваш ANY токен не конфликтует ни с чем другим, то есть определите все необходимые токены (/, NL и т. Д.) И поместите их выше определения токена ANY.

...