2012-07-10 167 views
1

时,当我用我的Antlr定义的语言我,只要我输入第一个引号(“)得到一个错误我的Java编辑器类型的字符串ANTLR的错误输入字符串

输入:

StatusString = "; 
    break; 

错误:

java.lang.IllegalStateException: Lexer [email protected] 
    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. 

我怀疑这是因为我如何定义我的字符串文字在我的GRA mmer。

语法定义

STRING_LITERAL 
    : '"' (EscapeSequence | ~('\\'|'"'))* '"' {setText(getText().substring(1, getText().length()-1));} 
    ; 

fragment 
EscapeSequence 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | OctalEscape 
    ; 

我怀疑所发生的事情是,一旦它看到第一个报价是试图提取的字符串。这是实时完成的,因为它是一个使用词法分析器对语法进行颜色编码的IDE。有什么我可以用我的语法来防止这个错误吗?

编辑:我在想的是让它检查到行尾。 IDE将只从报价开始为行输入橙色,直到用户完成报价为止,如netbeans或eclipse。我只是不知道如何去通过语法,所以它反映在词法分析器/解析器

回答

1

如果你要尝试和防止错误,那么你也会错过错误,如果你真的忘了报价的地方,而不仅仅是当你输入一个开始报价。

我想通过让你的IDE等待几毫秒(1/2秒左右),使你有一些时间来进入一个右引号,或者让IDE自动插入右引号解决这个问题?

试图调整语法,以便它也允许无效的输入是不是一个好主意,海事组织。

+0

我想这样做的什么是有它检查到该行的末尾。 IDE会从报价开始着色橙色行,直到报价完成,如netbeans或eclipse。我只是不知道如何去通过这个语法所以它体现在词法分析器/分析器 – merjr 2012-07-10 19:54:56

+0

@merjr,再次:我没有在语法做到这一点,但在某些方面的IDE。 – 2012-07-10 20:03:14

+0

我的字符串文字声明是正确的,至少?该错误是扔我了,因为在技术上它找到另一个“进一步代码,以便为这一个实例它实际上完成的字符串,但仍发生这个错误。 – merjr 2012-07-10 20:47:01