簡體   English   中英

需要澄清C令牌的定義

[英]Need clarification on the definition of C tokens

來自K&R的“The C Programming Language”一書:

有六類令牌:標識符,關鍵字,常量,字符串文字,運算符和其他分隔符。 空格,水平和垂直制表符,換行符,換頁符和注釋如下所述(統稱為“空格”)將被忽略,除非它們分隔令牌。

“其他分隔符”是什么意思?

假設給出一個聲明:

result = (4 * b - a * b) / 3;

因此,根據定義, resultab應該是標識符,而=()*/-應該是運算符。 分號怎么樣; 它被認為是一種象征,如果是,它屬於哪一類?

另外,對於白色空間,它們被認為是“其他分隔符”嗎?

什么是分隔符?
任何可用於分隔令牌的東西。 例如,

int a, b, c;

操作員也可以充當分隔符

a = b*c;

*是算術運算符,也是分隔符。 它將在標記化中分離兩個標識符bc

分號怎么樣; 它被認為是一種象征,如果是,它屬於哪一類?

; 也是一個分隔符。 它將一個語句與另一個語句分開,從而將標記分開。

運算符和其他分隔符之間的區別在舊版本的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.

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