ANTLR3 throws internal error with java.lang.NullPointerException

帅比萌擦擦* 提交于 2019-12-06 16:21:58

问题


I tried to use ANTLR3 to build a simple Regexpression parser, but it throws the internal error

Here is the Sample.g

grammar Sample;

options {
    memoize=true;
    output=AST;
}

tokens {
    RegExp;
}

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

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

I run the command: java -jar antlr-3.5.2-complete.jar -print Sample.g

and it gives this:

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

... ...

Updated according to comments

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

tokens {
    RegExp;
}

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

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

And here are the errors after running the 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:


You're trying to use a rewrite rule (tree construction) on a lexer rule. That doesn't make sense.

In ANTLR, all rules with name starting with an uppercase letter are lexer rules. The tree construction is used on AST nodes, not on tokens themselves, so you have to use it on parser rules (starting with lowercase letter).

When you do that, keep in mind that your NL is a fragment now (you cannot use fragments in parser rules) and make sure your ANY token doesn't collide with anything else, i.e. define all needed tokens (/, NL etc.) and put them above the ANY token definition.



来源:https://stackoverflow.com/questions/54029954/antlr3-noviablealtexception-and-missingtokenexception

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!