[英]Need clarification on the definition of C tokens
來自K&R的“The C Programming Language”一書:
有六類令牌:標識符,關鍵字,常量,字符串文字,運算符和其他分隔符。 空格,水平和垂直制表符,換行符,換頁符和注釋如下所述(統稱為“空格”)將被忽略,除非它們分隔令牌。
“其他分隔符”是什么意思?
假設給出一個聲明:
result = (4 * b - a * b) / 3;
因此,根據定義, result
, a
和b
應該是標識符,而=
, (
, )
, *
, /
和-
應該是運算符。 分號怎么樣;
? 它被認為是一種象征,如果是,它屬於哪一類?
另外,對於白色空間,它們被認為是“其他分隔符”嗎?
什么是分隔符?
任何可用於分隔令牌的東西。 例如,
在
int a, b, c;
操作員也可以充當分隔符
a = b*c;
*
是算術運算符,也是分隔符。 它將在標記化中分離兩個標識符b
和c
。
分號怎么樣
;
? 它被認為是一種象征,如果是,它屬於哪一類?
;
也是一個分隔符。 它將一個語句與另一個語句分開,從而將標記分開。
運算符和其他分隔符之間的區別在舊版本的C中存在,但已被刪除。
C89標准給出了操作符和標點符號的列表(標點符號是K&R稱之為“其他分隔符”):
operator: one of
[ ] ( ) . ->
++ -- & * + - ~ ! sizeof
/ % << >> < > <= >= == != ^ | && ||
? :
= *= /= %= += -= <<= >>= &= ^= |=
, # ##
punctuator: one of
[ ] ( ) { } * , : = ; ... #
運算符被定義為指定要執行的操作的東西,而標點符號具有語法重要性但不指定產生值的操作。
請注意, ( ) [ ]
被認為是運算符(在表達式中使用時)或標點符號(例如在函數或數組聲明中)。
C99標准消除了這種不必要的區別,並將所有這些符號稱為“標點符號”。
關於空白區域,它不被視為令牌,因此不是操作員或標點符號。
那本書很古老。 C標准現在使用不同的術語/組。 C11附件A.1.1:
(6.4) token:
keyword
identifier
constant
string-literal
punctuator
有關上述內容的詳細信息,請參見第6.4章。 雖然如果你繼續閱讀相同(略微有趣)的附件,你會看到:
A.1.7 Punctuators
(6.4.6) punctuator: one of
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |=
, # ##
<: :> <% %> %: %:%:
如果您對這些事情感興趣(即使對於經驗豐富的C程序員來說,它們遠非必要的知識,除非您正在編寫編譯器),我建議您下載該標准的草案版本並閱讀附錄A.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.