2015-12-08 58 views
0

下面的令牌數量是多少?令牌(編譯器)的數量是多少?

int a [2] [3];

我認爲令牌 - > { '詮釋', '[', ']', '[', ']', ';'}

有人能解釋什麼考慮和什麼不同時,編譯器計算令牌?

感謝

+1

輸入如何被標記化是你的標記器(掃描儀)的一個功能。原則上,例如,您提供的輸入可能被標記爲「」int「」,「」「,」「,」[2]「,」「[3]」。在實踐中,最可能的標記化選擇是「int」,「a」,「」,「」,「」,「」,「」,「」,「」,「,」3 「','」]「'。我不確定你爲什麼認爲變量名稱和維度值不會在令牌中表示 - 它們帶有語義信息,因此不能排除在外。 –

+0

是的,你是對的,我們也必須考慮「整數」。 – Vimal

回答

0

擴大對我的評論: 輸入標記化如何爲您的標記生成器(掃描儀)的功能。原則上,您提供的輸入可能被標記爲"int","a","[2]","[3]",";"。在實踐中,標記化的最可能的選擇將是"int","a""[","2","]", "[","3","]",";"。我不確定你爲什麼認爲變量名稱和維度值不會在令牌中表示 - 它們帶有語義信息,因此不能排除在外。

儘管將編譯成詞法分析步驟和語義分析步驟是常見的且被廣泛認爲是有用的,但根本不需要進行這樣的分離。在哪裏製作,標記的選擇取決於編譯器。一個人通常選擇令牌,以使每個代表一個語義上重要的單位,但有多種方法可以做到這一點。例如,我的替代實例對應於令牌序列可能被定性爲

IDENTIFIER, IDENTIFIER, DIMENSION, DIMENSION, TERMINATOR 

更有可能的做法可能被定性爲

IDENTIFIER, IDENTIFIER, OPEN_BRACKET, INTEGER, CLOSE_BRACKET, OPEN_BRACKET, 
     INTEGER, CLOSE_BRACKET, TERMINATOR 

的問題,可以考慮包括

  • 什麼源代碼單元是否包含有意義的語義信息?例如,將每個字符作爲單獨的標記或將int分成兩個標記是沒有用的,因爲這些標記不代表完整的語義單元。
  • 多少責任,你可以或應該提上詞法分析器(例如,理解上下文足以將DIMENSION,而不是OPEN_BRACKET, INTEGER, CLOSE_BRACKET

更新添加

C標準根據特定的標記化定義了預處理後語言,對於你給出的陳述將是我指定的「最有可能」的選擇(這也是最有可能的原因之一)。然而,我已經從更一般的意義上回答了這個問題,部分原因是它被標記爲[compiler-construction]。

+1

我有一個疑問,在詞法分析和'int a [2] [3]之前,編譯器(C編譯器)不會進行預處理;''變成'int *(*(a + 2)+3)';' ?現在令牌的數量將是13. – Vimal

+0

C預處理器首先標記,至少在概念上。其行爲以「預處理令牌」的形式定義,其輸出以「令牌」形式定義。然而,這對於定義的目的而言最重要,不是對實施的限制。無論如何,是什麼讓你認爲預處理器將其中一個表達式轉換爲另一個?它們是相同的,但不需要以源代碼格式轉換成另一個。 –