我有一个用ANTLR4编写的简单语法,其中包括(除其他外)空格规则:
WhiteSpace : [ \t\r\n]+ -> 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词法分析器(以及可能的其他集成)集成时才会出错。
答案 0 :(得分:0)
更改WhiteSpace
规则以将令牌发送到隐藏频道,而不是完全跳过。
WhiteSpace : [ \t\r\n]+ -> channel(HIDDEN);
解析器不会看到空格,但NetBeans词法分析器会很高兴为所有输入返回了有效的令牌。