需要澄清C令牌的定义

时间:2015-02-16 14:39:16

标签: c token

来自K& R的“The C Programming Language”一书:

  

有六类令牌:标识符,关键字,常量,   字符串文字,运算符和其他分隔符。下面描述的空白,水平和垂直制表符,换行符,换页符和注释(统称为“空格”)将被忽略,除非它们分隔令牌。

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

假设给出了一个声明:

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

因此,根据定义,resultab应为标识符,=(),{ {1}},*/应该是运营商。分号-怎么样?它被认为是一种象征,如果是,它属于哪一类?

另外,对于白色空间,它们被认为是“其他分隔符”吗?

3 个答案:

答案 0 :(得分:3)

什么是分隔符?
任何可用于分隔令牌的东西。例如

中的,示例
int a, b, c;

操作员也可以充当分隔符

a = b*c;

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

  

分号;怎么样?它被认为是一种象征,如果是,它属于哪一类?

;也是一个分隔符。它将一个陈述与另一个陈述分开,从而将其分开。

答案 1 :(得分:3)

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

C89标准给出了操作员和标点符号的列表(标点符号是K& R所称的"其他分隔符"):

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

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

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

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

C99标准消除了这种不必要的区别,并调用所有这些符号&#34;标点符号&#34;。

关于空白区域,它不被视为令牌,因此不是操作员或标点符号。

答案 2 :(得分:1)

那本书很古老。 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.