1

当我使用我的 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 一样。我只是不确定如何通过语法来解决这个问题,所以它反映在词法分析器/解析器中

4

1 回答 1

1

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

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

尝试调整语法以使其也允许无效输入不是一个好主意,IMO。

于 2012-07-10T19:51:12.650 回答