2010-07-10 98 views
2

我正在讀龍書。從書中引用的文本(3.1.4詞法錯誤,PNO 114)詞法分析問題

這是難的詞法分析器 訴說,沒有其他 組件的幫助下,有一個 源代碼錯誤。例如,如果 字符串fi在 情況下遇到了 首次在C程序:

fi (a == f(x)) ... 

一個詞法分析器無法分辨是否 fi是關鍵字 if或未經申報的拼寫錯誤功能 標識符。由於fi是有效 詞位的令牌ID,詞法 分析儀必須返回令牌id到 解析器而讓 一些其他階段的編譯器 - 大概在 解析器這種情況下 - 處理錯誤由於 換位的信件。

看完這個後我有點困惑。我的理解是詞法分析器開始從左向右處理文本,並在模式匹配時返回令牌。因此,對於if是匹配關鍵字的語言,fi如何匹配?

有什麼想法?

回答

7

它與if令牌不匹配,但是代表「標識符」的id令牌。如果沒有關鍵字匹配,這就是全部。詞法分析器不知道在某些位置「期望」什麼。它只是返回令牌,解析器會知道它期望的。 A C解析器接受下面的語句,例如,這是一個函數調用

fi (a == f(x)); 
+0

啊..現在有道理。謝謝 – 2010-07-10 18:17:08

1

你將如何分辨if是在給定點的唯一期望的輸入?

int a = 42; 
if (a == 42) 
    puts("ok"); 

int a = 42; 
fi (a == 42) 
    puts("ok"); 

fi可能是一個函數調用。例如,在上述可能的誤拼寫:

int a = 42; 
fi(a == 42); 
puts("ok"); 

其中fi是一個函數服用int和返回void

1

這是詞法分析錯誤解釋示例的糟糕選擇。本文試圖告訴你的是,編譯器無法識別你拼錯了「if」關鍵字(向後寫)。它只是看到「fi」,例如一個有效的變量名稱,因此會將該「id」(例如)「VARIABLE」返回給解析器。解析器然後在後面實現語法錯誤。

它與從左到右或從右到左無關。編譯器當然會從左到右讀取源代碼。正如我所說 - 這種解釋的關鍵字選擇不佳。

2

您必須區分語法分析和詞法分析。

  • 詞法分析的任務是將一系列字符轉換爲一個令牌字符串。可以有各種類型的標記,例如標識符,加法運算符,結束語句運算符等。詞法分析只有在遇到不符合任何標記的文本字符串時纔會出錯。在你的情況下fi (a == f(x)) ...將轉化爲<IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET> .....

  • 一旦生成了一串標記,就執行語法分析。這通常涉及從標記構造某種語法樹。解析器知道語言中允許的所有有效語句的形式。如果解析器找不到允許上述令牌序列的語法規則,則它將失敗。

+0

謝謝。現在很清楚。 – 2010-07-10 18:18:26