需要澄清 C 令牌的定义

Need clarification on the definition of C tokens

来自 K&R 的 "The C Programming Language" 书:

There are six classes of tokens: identifiers, keywords, constants, string literals, operators, and other separators. Blanks, horizontal and vertical tabs, newlines, formfeeds, and comments as described below (collectively, "white space") are ignored except as they separate tokens.

"other separators"是什么意思?

假设给定一个语句:

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

所以根据定义,resultab应该是标识符,而=()*/- 应该是运算符。分号 ; 呢?它是否被视为令牌,如果是,它属于哪一类?

此外,至于空格,它们是否被认为是 "other separators"?

那本书很古老。现在 C 标准使用不同的 terms/groups。 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.

什么是分隔符?
任何可用于分隔标记的东西。例如 ,

int a, b, c;

运算符也可以作为分隔符

a = b*c;

* 是算术运算符,也是分隔符。它将标记化中的两个标识符 bc 分开。

What about the semicolon, ;? Is it considered a token and if so, what category does it fall into?

;也是一个分隔符。它将一个语句与另一个语句分开,从而将标记分开。

运算符和其他分隔符之间的这种区别在旧版本的 C 中存在,但已被删除。

C89 标准列出了运算符和标点符号(标点符号是 K&R 所称 "other separators"):

operator: one of
        [  ]  (  )  .  ->
        ++  --  &  *  +  -  ~  !  sizeof
        /  %  <<  >>  <  >  <=  >=  ==  !=  ^  |  &&  ||
        ?  :
        =  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=
        ,  #  ##

punctuator: one of
        [  ]  (  )  {  }  *  ,  :  =  ;  ...  #

运算符被定义为指定要执行的操作的东西,而标点符号具有句法意义但不指定产生值的操作。

请注意,( ) [ ] 被视为运算符(在表达式中使用时)或标点符号(例如在函数或数组声明中)。

C99 标准删除了这种不必要的区分,并将所有这些符号称为 "punctuators"。

关于白色-space,它不被视为标记,因此不是运算符或标点符号。