2014-10-19 4811 views
0

我正在使用詞法分析器,這是構建編譯器的第一步。給定一個.txt文件,代碼識別詞彙每一個部件,例如,如果我有如何在編譯器中使用字符串文字錯誤

String c = "abcdefg"; 

它具有打印

String -> type 
c -> variable 
= -> assignment operator 
"abcdefg" -> constant String 
; -> Delimit 

,但如果我有這樣的事情:

String c = "abc 
    d"; System.out.println("*"); 

編譯會說:字符串文字沒有通過雙引號正確關閉。但是,java編譯器如何處理其他語句,如System.out.println(「*」);是否必須忽視它,還是必須確定其要素?

+2

解析器參與錯誤恢復,其中包括丟棄令牌,直到重新建立可能的解析狀態。 – EJP 2014-10-19 00:35:50

+0

...和彈出解析狀態。 – EJP 2014-10-19 00:55:23

回答

2

你的問題的要點是:

但如何編譯器具有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可能是各種各樣的東西,包括類名稱,包名稱,方法名稱,字段名稱,局部變量名稱和等等。

處理這個問題的正常方法是讓詞法分析器將Stringa作爲「標識符」......並將其留給解析器和/或語義分析器整理。

相關問題