你的問題的要點是:
但如何編譯器具有Java來與其他說法,的System.out.println(「*」)工作;是否必須忽視它,還是必須確定其要素?
首先,試試看看Java編譯器在這樣的例子中實際給了你什麼錯誤消息。 (顯然,你需要調整你的測試用例來隔離處理該特定情況......)
你很可能會發現編譯器不會做一個完美的恢復工作。我期望處理在行尾沒有關閉的字符串的策略是假定字符串文字被關閉,並繼續在非引用模式下「lexing」。但在你的例子中,這很可能會帶來進一步的錯誤。
這使我想到了第二點。我建議你不要試圖從詞法錯誤中恢復。重點在於在輸入有效的情況下讓詞法分析器/編譯器工作。你可以隨時回來改善錯誤恢復......當你有更重要的事情正常工作時。
(而@ EJP的評論是現貨上的「重型」的錯誤恢復是在解析器水平通常進行,而不是詞法分析器級別。)
最後:您的要求:
String c = "abcdefg";
它具有打印
String -> type
c -> variable
= -> assignment operator
"abcdefg" -> constant String
; -> Delimit
如果您解析真正的Java,T如果一個(純粹的)詞法分析器不能做到這一點。問題是,不可能確定String
是一個類型(或者應該是一個類型),而a
是詞法分析器中的一個變量名稱(或者應該是一個變量名稱)。事實上,如果你忽略語法上下文(這通常對詞法分析器不可用),那麼String
可能是各種各樣的東西,包括類名稱,包名稱,方法名稱,字段名稱,局部變量名稱和等等。
處理這個問題的正常方法是讓詞法分析器將String
和a
作爲「標識符」......並將其留給解析器和/或語義分析器整理。
解析器參與錯誤恢復,其中包括丟棄令牌,直到重新建立可能的解析狀態。 – EJP 2014-10-19 00:35:50
...和彈出解析狀態。 – EJP 2014-10-19 00:55:23