【问题标题】:Need clarification on the definition of C tokens需要澄清 C 代币的定义
【发布时间】:2015-04-17 02:31:30
【问题描述】:

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

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

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

假设给定一个语句:

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

所以根据定义,result、a 和 b 应该是标识符,=、(、)、*、/ 和 -应该成为运营商。分号; 呢?它是否被视为代币,如果是,它属于什么类别?

另外,对于空格,它们是否被视为“其他分隔符”?

【问题讨论】:

  • 仅供参考,C 中的其他分隔符为,、:、; 和.。

标签: c token


【解决方案1】:

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

C89 标准列出了运算符和标点符号(标点符号是 K&R 所说的“其他分隔符”):

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

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

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

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

C99 标准消除了这种不必要的区别,并将所有这些符号称为“标点符号”。

关于空格,它不被视为标记,因此不是运算符或标点符号。

【讨论】:

    【解决方案2】:

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

    int a, b, c;
    

    运算符也可以作为分隔符

    a = b*c;
    

    * 是算术运算符,也是分隔符。它将在标记化中分隔两个标识符 b 和 c。

    分号; 呢?它是否被视为代币,如果是,它属于什么类别?

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

    【讨论】:

      【解决方案3】:

      那本书很古老。如今,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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-06
        • 2012-10-22
        • 2011-07-24
        • 1970-01-01
        • 2011-11-09
        • 2012-07-18
        • 1970-01-01
        • 2023-03-09
        相关资源
        最近更新 更多