2012-07-10 208 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