ANTLR3使用java.lang.NullPointerException引发内部错误

时间:2019-01-04 10:45:35

标签: antlr3

我尝试使用ANTLR3来构建一个简单的Regexpression解析器,但是会引发内部错误

这是样品。g

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 :(得分:1)

您正在尝试在词法分析器规则上使用重写规则(树结构)。那没有道理。

在ANTLR中,所有名称以大写字母开头的规则都是词法分析器规则。树结构用于AST节点,而不是令牌本身,因此您必须在解析器规则(以小写字母开头)上使用它。

当您这样做时,请记住,您的NL现在是一个片段(您不能在解析器规则中使用片段),并确保您的ANY令牌不会与其他任何东西冲突,即定义所有需要的令牌(/NL等),并将它们放在ANY令牌定义上方。