2015-07-12 50 views
0

我已閱讀thisthis問題。他們是相當有幫助的,但我仍然對C語法分析器中的令牌生成有疑問。 如果詞法分析器檢測到int a2.5c;,那麼根據我的理解,將會產生7個令牌。澄清關於C中的詞彙錯誤

int keyword 
a identifier 
2 constant 
. special symbol 
5 constant 
c identifier 
; special symbol 

所以詞法分析器不會報告任何錯誤,令牌將成功生成。

我的理解是否正確?如果沒有,那麼你能幫我理解嗎?

另外如果我們聲明任何常數爲double a = 10.10.10;
它會產生任何詞法錯誤嗎?爲什麼?

更新:詢問好奇心,如果詞法分析器檢測到:-)笑臉類的東西在程序中?它會產生任何詞彙錯誤?因爲按我的理解:將作爲特殊符號對待,-將被視爲運營商和再次)將被視爲特殊符號
謝謝

+0

關於_compiler構建有很多資源可以找到。 N. Wirth的同名書籍可免費下載。 – Olaf

+0

我感謝您的幫助。我已經下載了這本書並將其讀取。 :) –

+0

在與C相關的問題中,'2'不會啓動一個新的標記,而是標識符的一部分。而'5c'之間沒有空格不是一個有效的標記。 –

回答

2

您的令牌的第一個列表幾乎是正確的 - a2是有效的標識符。

確實,第一個例子本身不會產生任何「詞法」錯誤本身,雖然在.會出現解析錯誤。

很難說第二個例子中的錯誤是詞法錯誤還是解析錯誤。浮點常量的詞法結構非常複雜。我可以想象一個編譯器抓取一串數字和.e/E,直到它調用相當於strtod有兩個小數點,這意味着它可能會報告一個「詞法錯誤」。但嚴格來說,我們在那裏有兩行浮點常量 - 10.10.10,這意味着它更可能是「解析錯誤」。

儘管如此,這些都只是錯誤。除非您正在編譯設計/構建類,否則我不確定將錯誤分類爲詞法或其他方式是多麼重要。


解決您的後續問題,是的,:-)將LEX三個令牌:-)

由於在C語言中任何標點符號都是合法的,所以在詞法上非法(即在詞法分析階段會產生錯誤)的字符序列相對較少。事實上,我能想到的唯一的是:

  • 非法字符(我認爲唯一的未使用的是`和@)
  • 與字符和字符串常量的各種問題(缺少'",壞逃生序列等)

事實上,幾乎所有你想關注的標點符號串都會通過C語言分析器,儘管它當然可以解析也可以不解析。 (A有些臭名昭著的例子是a+++++b,不幸LEXES爲a++ ++ + b,因此是一個語法錯誤。)

+0

感謝您的解釋。它現在有一定意義。其實我正在實施一個簡單的C語言分析器作爲h/w,所以我需要澄清這個疑問。 –

+0

出於好奇,如果詞法分析器在程序中檢測到':-)'笑臉類的東西?它會產生任何詞彙錯誤?因爲根據我的理解':'將被視爲'特殊符號','-'將被視爲'operator'並且'''將被視爲'特殊符號' –

+0

@HardikModha:是的,我相信這是正確的。 –

0

與c詞法分析器我寫此標記化作爲

keyid int 
white " " 
keyid a2 
const .5 
keyid c 
punct ; 
white "\n" 

哪裏KEYID是關鍵字或IDENTIFER; const是數值常數,punctuator是標點符號(白色是空格)。 我不會說有一個詞彙錯誤;但肯定是一個語法錯誤,必須由一個數字常量後跟一個標識符來診斷,這個語法規則無法減少。