当我使用我的Antlr定义语言在我的Java编辑器中键入一个字符串时,只要输入第一个引号(“),我就会收到错误。
输入
StatusString = ";
break;
错误:
java.lang.IllegalStateException: Lexer com.lexer.IpIdeLexer@5ab38d6b
returned null token but lexerInput.readLength()=21
lexer-state: null
tokenStartOffset=557, readOffset=578, lookaheadOffset=579
Chars: "";\n break;\n}\n\n" - these characters need to be tokenized.
Fix the lexer to not return null token in this state.
我怀疑这是因为我在语法中定义了我的字符串文字。
语法定义
STRING_LITERAL
: '"' ( EscapeSequence | ~('\\'|'"') )* '"' {setText(getText().substring(1, getText().length()-1));}
;
fragment
EscapeSequence
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| OctalEscape
;
我怀疑发生的事情是,只要它看到第一个引用它就试图提取字符串。这是实时完成的,因为它是一个使用词法分析器对语法进行颜色编码的IDE。我可以用语法来防止这个错误吗?
编辑:我想要做的是让它检查到行尾。 IDE只会从引用开始为橙色着色,直到用户完成引用,就像netbeans或eclipse那样。我只是不确定如何通过语法来解决这个问题,因此它反映在词法分析器/解析器
中答案 0 :(得分:1)
如果您要尝试防止错误,那么如果您确实忘记了某个地方的引用,那么您也会错过错误,而不仅仅是在您输入起始引用时。
我通过让您的IDE等待几毫秒(1/2秒左右)来解决这个问题,以便您有时间输入结束报价,或者让IDE自动插入结束报价?
尝试调整语法以便它也允许无效输入不是一个好主意,IMO。