[英]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版本中,始終可以在語法上識別類型名稱。 int
, float
, char
, struct
等是關鍵字; 類型名稱的其他元素是標點符號,例如*
和[]
。 (解析器可以區分不是關鍵字的關鍵字和標識符,因為它們只有很小且固定的數量。)
添加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.