微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法从对象数组加载,因为“this.decisionToDFA”为空

如何解决无法从对象数组加载,因为“this.decisionToDFA”为空

更新 2):- 就好像 TestLexer.java 底部静态代码没有在我这边运行。

我更改了静态块

static { 
         _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
        for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
            _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i),i);
        }

}

我称之为ma​​keDecisionToDFA()

静态方法
protected static final DFA[] _decisionToDFA = makeDecisionToDFA();

private static DFA[] makeDecisionToDFA() {
        DFA[] decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
        for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
            decisionToDFA[i] = new DFA(_ATN.getDecisionState(i),i);
        }
                return decisionToDFA;
    }

异常然后移动到另一个位置:-

线程“main”中的异常java.lang.NullPointerException:无法从对象数组加载,因为“this.decisionToDFA”为空 在 org.antlr.v4.runtime.atn.ParserATNSimulator.adaptivePredict(ParserATNSimulator.java:341) 在 com.example.test.TestParser.statements(TestParser.java:209) 在 com.example.test.TestParser.parse(TestParser.java:154) 在 Main.main(Main.java:31)


更新 1):- 我添加了 TestLexer.g4 和 TestParser.g4


我使用 Antlr 4.9.2 生成 Java 解析器和词法分析器。

我的Java版本是:- Java(TM) SE 运行时环境(构建 15.0.1+9-18)

运行程序时出现以下异常。

Exception in thread "main" java.lang.NullPointerException: Cannot load from object array because "this.decisionToDFA" is null
at org.antlr.v4.runtime.atn.LexerATNSimulator.match(LexerATNSimulator.java:109)
at org.antlr.v4.runtime.Lexer.nextToken(Lexer.java:141)
at org.antlr.v4.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:169)
at org.antlr.v4.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:152)
at org.antlr.v4.runtime.BufferedTokenStream.setup(BufferedTokenStream.java:254)
at org.antlr.v4.runtime.BufferedTokenStream.lazyInit(BufferedTokenStream.java:249)
at org.antlr.v4.runtime.CommonTokenStream.LT(CommonTokenStream.java:92)
at org.antlr.v4.runtime.Parser.enterRule(Parser.java:628)
at com.examlpe.test.TestParser.parse(MyParser.java:142)
at Main.main(Main.java:37)

我不确定我到底做错了什么;我可能会遗漏一些东西。 如果有人能指出我正确的方向,我将不胜感激。

public class Main {

    public static void main(String[] args) throws Exception {
        CharStream stream = CharStreams.fromFileName(args[0]);
        TestLexer lexer = new TestLexer(stream);
        TestParser parser = new TestParser(new CommonTokenStream(lexer));
        parser.setBuildParseTree(true);

        TestParser.ParseContext tree = parser.parse();
    
        ParseTreeWalker walker = new ParseTreeWalker();
        TestListener listener = new TestListener();
        walker.walk(listener,tree);
    }
}

TestLexer.g4

lexer grammar TestLexer;

@header {
package com.example.test;
}

OUTPUT:'output';
PACKAGE:'package';
STRUCT:'struct';
CLASS:'class';

// §3.11 Separators
LPAREN : '(';
RPAREN : ')';
LBRACE : '{';
RBRACE : '}';
LBRACK : '[';
RBRACK : ']';
SEMI : ';';
COMMA : ',';
DOT : '.';

LIST : 'List';
MAP  : 'Map';

ID : ('a'..'z' | 'A'..'Z'| '1'..'9' | '#' | '*' | '<' | '>')+ ;

PACKAGE_NAME : ID ('.' ID)* ;
ANNOTATION_NAME : AT ID ; 

// §3.12 Operators
BACKTICK : '`';
ASSIGN : '=';
GT : '>';
LT : '<';
BANG : '!';
TILDE : '~';
QUESTION : '?';
COLON : ':';
EQUAL : '==';
LE : '<=';
GE : '>=';
NOTEQUAL : '!=';
AND : '&&';
OR : '||';
INC : '++';
DEC : '--';
ADD : '+';
SUB : '-';
MUL : '*';
DIV : '/';
BITAND : '&';
BITOR : '|';
CARET : '^';
MOD : '%';
ARROW : '->';
COLONCOLON : '::';
DOUBEQOATE : '"';


AT : '@';
ELLIPSIS : '...';

WS  :  [ \t\r\n\u000C]+ -> skip
    ;

COMMENT
    :   '/*' .*? '*/' -> skip
    ;

LINE_COMMENT 
    :   '//' ~[\r\n]* -> skip
    ;

TestParser.g4

parser grammar TestParser;

options { tokenVocab=TestLexer; }

@header {
package com.example.test;
}

parse 
    : 
    statements* EOF
    ;

statements 
    : outputDecl
    | packageDecl
    | structDecl
    | classDecl
    ;

outputDecl
    : OUTPUT outputAnnotationDecl*?
    ;
 
packageDecl 
    : PACKAGE PACKAGE_NAME
    ;

outputAnnotationDecl
    : name=ANNOTATION_NAME
    ;

structAnnotationDecl
    : name=ANNOTATION_NAME
    ;

classAnnotationDecl
    : name=ANNOTATION_NAME
    ;

structDecl 
    : structAnnotationDecl*? name=ID STRUCT LBRACE variableDecl+ RBRACE
    ;

variableDecl
    : name=ID type=ID tagsDecl?
    | name=ID LIST GT type=ID LT tagsDecl?
    | name=ID MAP GT type=ID COMMA ID LT tagsDecl?
    ;

tagsDecl
    : BACKTICK (tagDecl*?) BACKTICK
    ;

tagDecl
    :name=ID COLON DOUBEQOATE (vale=ID (COMMA?))+ DOUBEQOATE
    ;

classDecl 
    : classAnnotationDecl*? name=ID CLASS LBRACE (functionDeclType)* RBRACE
    ;

functionDeclType
    : name=ID COLON (functionDecl)*
    ;

functionDecl
    : name=ID LPAREN (functionParameterDecl (COMMA)?)*? RPAREN (COLON returnType=ID)?
    ;

functionParameterDecl
    : name=ID type=ID
    ;

提前致谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。