簡體   English   中英

詞法分析器中的二元和一元減號運算符

[英]Binary and unary minus operator in Lexical Analyzer

因此,我正在使用 flex 對 TOY 編程語言進行詞法分析。 我目前停留在以下幾點。

減號:正如我們所知,減號可以通過將它們定義為二元或一元運算符來具有兩種含義(我也知道您可以舍棄兩種含義,只說 -2 與 0-2 相同)。 首先,我目前只研究過詞法分析器,對解析器一無所知。 那么,我是否應該關心區分這兩個減號,有時分析器會將 -2 作為數字文字打印,有時 - 作為運算符打印,而 2 作為數字文字打印? 或者可以在解析期間完成這種兩個文字的組合嗎? 如果是,那么我應該只定義正數和 - 作為一元運算符嗎?

如果您嘗試將有符號整數作為單個標記進行分析,事情就會變得非常復雜。 例如,您必須避免將x-1分析為 { x , -1 },因為-是一個運算符。

如果您將帶符號的整數分析為兩個標記——一個符號,然后是一個 integer——那么您將得到一個合理的解析。 只有兩個問題:

  1. 您真的不想在運行時評估-1 它是一個常量值,應該在編譯時計算。 但這與任何其他常量表達式沒有什么不同。 (1+1)最好在編譯時折疊為2 常量折疊是一種相對容易實現的優化,盡管您應該首先讓事情正常進行。

  2. 在二進制補碼中,如果 integer 部分與符號分開,則最小負數 integer(如果您使用的是帶符號的 32 位整數,則為 -2147483648)是 integer 溢出。 2147483648 有很多方法可以解決這個問題,其中大多數會導致某種解析怪癖。 例如,針對 32 位int的 C 編譯器會將比int更寬的類型分配給 2147483648,這意味着 -2147483647 和 -2147483648 是出乎意料的不同類型。 (這就是為什么INT_MIN通常#define d 為(-2147483647 - 1)的原因。)另一方面,如果您只是假設編譯器在整數環繞的 2 補碼環境中運行,那么您將得到正確的結果-2147483648的值。 但是您將獲得2147483648的相同值,應該用診斷標記。 對於使用玩具語言的學生項目,這些怪癖可能是無害的,但您應該嘗試記錄它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM