如何解决无法从对象数组加载,因为“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);
}
}
我称之为makeDecisionToDFA()
的静态方法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 举报,一经查实,本站将立刻删除。