2014-04-23 68 views

回答

0

與大多數此類問題一樣,唯一可能的答案是「取決於」。但總體而言,除非您在單通解析器中進行直接的計算器式解釋,否則使用多個數字標記類型是不必要的,因爲它只會使語法複雜化。

有許多腳本語言只有一種類型的編號(例如awk),所以所有的數字標記都在詞法分析器中轉換爲雙精度浮點,並且根本不需要額外的標記類型。

C/C++的詞法分析器需要能夠識別「預處理數字」,一組包含各種格式的整數和浮點文字的集合以及大量根本無效的數字的字符串(「 42itous「),但不包括字符或布爾常量。一旦預處理完成,這些需要解決(或拒絕);在那之後,對於任何語法目的來說,區分不同的數字類型並不是真的必要,儘管它最終是代碼生成所必需的。

因此,relexer(即,後處理詞彙分析器)生成其語義值包括更詳細的類型信息的標記類型的「常量」並不令人驚訝。

在一個典型的表達語法,你將不得不一個CONSTANT令牌類型,其語義值是包括恆定的實際類型和值變體,或你將有一個constant非終結,其產品有不同的令牌類型與對應的列表用常量的實際類型和值填充變體語義值的動作。顯然,這些策略之間沒有太大的區別。個人而言,我幾乎總是會選擇詞法解析器,但那只是我自己。

堅持像數組聲明只包含維數的整數文字,迫使文法區分整數文字記號和其他文字記號通常是誘人的。但是語法並不總是產生像這樣的錯誤的錯誤消息的最佳位置;它可能更容易在語義分析期間生成有意義的錯誤消息。

相關問題