簡體   English   中英

如何通過C編譯器解析類型轉換?

[英]How is typecasting parsed by C compilers?

在語法上,不知道f / g是函數調用還是類型轉換,而不知道它們是如何聲明的。 編譯器是否知道解析步驟中的差異,或者他們通常在第二次傳遞中解決這個問題?

void f(int x){};
typedef short g;

int main(void){
   ((f)(1));
   ((g)(1));
   return 0;
}

非常早期的C版本(在K&R的第一版於1978年出版之前)沒有typedef功能。 在該C版本中,始終可以在語法上識別類型名稱。 intfloatcharstruct等是關鍵字; 類型名稱的其他元素是標點符號,例如*[] (解析器可以區分不是關鍵字的關鍵字和標識符,因為它們只有很小且固定的數量。)

添加typedef時,必須將其添加到現有語言中。 typedef為現有類型創建新名稱。 該名稱是單個標識符 - 在語法上與任何其他普通標識符不同。

AC編譯器在解析其輸入時必須維護一個符號表。 當遇到標識符時,需要查詢符號表以確定它是否是類型名稱。 沒有這些信息,語法就不明確了。

從某種意義上說, typedef聲明可以被認為是創建一個新的臨時關鍵字。 但它們是可以被內部范圍中的新聲明隱藏的關鍵字。

例如:

{
    typedef short g;
    /* g is now a type name, and the parser has
     * to treat it almost like a keyword
     */
    {
        int g;
        /* now g is an ordinary identifier as far as the parser is concerned */
    }
    /* And now g is a type name again */
}

解析C很難。

我認為他們懶洋洋地這樣做:每當解析一個令牌時,下一個令牌的解析會被延遲,直到該符號的語義信息已知。 然后,當解析下一個標記時,編譯器已經知道所引用的符號是否是類型名稱(它必須先前已聲明),並且可以相應地執行操作。
(因此在這種方法中,語義和句法分析交織在一起,不能分開。)

暫無
暫無

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

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