Java 键入字符串时出现Antlr错误

Java 键入字符串时出现Antlr错误,java,string,antlr,literals,antlrworks,Java,String,Antlr,Literals,Antlrworks,当我使用Antlr定义的语言在Java编辑器中键入字符串时,只要键入第一个引号(“),就会出现错误 输入: StatusString = "; break; java.lang.IllegalStateException: Lexer com.lexer.IpIdeLexer@5ab38d6b returned null token but lexerInput.readLength()=21 lexer-state: null tokenStartOffset=5

当我使用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.
错误:

    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,使用lexer对语法进行颜色编码。我可以用语法做些什么来防止这个错误吗


编辑:我想做的是让它检查到行的末尾。IDE只会将从引号开始的行涂成橙色,直到用户完成引号为止,就像netbeans或eclipse那样。我只是不知道如何通过语法来实现这一点,因此如果你想如果您真的在某个地方忘记了一个引号,那么您也会错过错误,而不仅仅是在您刚刚键入起始引号时

我将通过让IDE等待几毫秒(1/2秒左右)来解决这个问题,这样您就有时间输入结束引号,或者让IDE自动插入结束引号


尝试调整语法以便允许无效输入不是一个好主意,依我看。

如果您要尝试防止错误,那么如果您真的忘记了某个引号,而不仅仅是在刚键入起始引号时,您也会错过错误

我将通过让IDE等待几毫秒(1/2秒左右)来解决这个问题,这样您就有时间输入结束引号,或者让IDE自动插入结束引号


我认为,试图调整语法以便允许无效输入不是一个好主意。

我想做的是让它检查到行的末尾。IDE只会将从引号开始的行涂成橙色,直到引号完成,就像netbeans或eclipse那样。我只是不确定如何通过g所以它反映在lexer中/parser@merjr,再次强调:我不会在语法中这样做,而是在IDE中以某种方式这样做。我对字符串文字的声明至少是正确的吗?这个错误让我很反感,因为从技术上讲,它确实找到了另一个”在代码中,对于这个实例,它确实完成了字符串,但仍然生成了错误。@merjr,
string\u LITERAL
规则在我看来还可以。不过我不能对这个错误发表评论(它似乎是你的,你只发布了一条规则)。另外,在示例输入中,
StatusString=“;break;
,只有一个引号:您的词法分析器可能会遇到问题(即
STRING\u LITERAL
规则)。如果您需要帮助,请编辑您的问题,并发布一个简短、自包含的示例,其他人可以使用它来复制您所说的错误。现在,人们只能猜测。我想做的是让它检查到行的末尾。IDE只会将从报价开始的行涂成橙色,直到报价完成,就像ne一样tbeans或eclipse是这样的。我只是不知道如何通过语法来实现这一点,所以它会反映在lexer中/parser@merjr,再次强调:我不会在语法中这样做,而是在IDE中以某种方式这样做。我对字符串文字的声明至少是正确的吗?这个错误让我很反感,因为从技术上讲,它确实找到了另一个”在代码中,对于这个实例,它确实完成了字符串,但仍然生成了错误。@merjr,
string\u LITERAL
规则在我看来还可以。不过我不能对这个错误发表评论(它似乎是你的,你只发布了一条规则)。另外,在示例输入中,
StatusString=“;break;
,只有一个引号:您的词法分析器可能会遇到问题(即
STRING\u LITERAL
规则)。如果您需要帮助,请编辑您的问题,并发布一个简短、完整的示例,其他人可以使用它来复制您所说的错误。现在,您只能猜测。