我有一个简单的语法用ANTLR4编写的,其中包括(除其他外)空格规则:
WhiteSpace : [ trn]+ -> skip;
这是使用 org.netbeans.spi.lexer.Lexer
集成到 NetBeans 平台应用程序中的。当输入有尾随空格(在 EOF 之前)时,我得到以下异常:
java.lang.IllegalStateException: Lexer ExpressionLexer@2cdea2eb
returned null token but lexerInput.readLength()=1
lexer-state: null
tokenStartOffset=20, readOffset=21, lookaheadOffset=22
Chars: "n" - these characters need to be tokenized.
Fix the lexer to not return null token in this state.
如何使此尾随空格不会导致错误?
编辑:仅使用 ANTLR 词法分析和解析器代码即可正常工作,没有错误。此错误仅在与 NetBeans 词法分析器(可能还有其他集成)集成时出现。
更改WhiteSpace
规则以将令牌发送到隐藏通道,而不是完全跳过。
WhiteSpace : [ trn]+ -> channel(HIDDEN);
解析器不会看到空格,但 NetBeans 词法分析器会很高兴为所有输入返回一个有效的令牌。