• ISO/IEC 9899:2011 条款6.4——词法元素


    6.4 词法元素


    1、token(标记):

            keyword(关键字)

            identifier(标识符)

            constant(常量)

            string-literal(字符串字面量)

            punctuator(标点符号)

        preprocessing-token(预处理标记):

            header-name(头文件名)

            identifier(标识符)

            pp-number(预处理数字)

            character-constant(字符常量)

            string-literal(字符串字面量)

            punctuator(标点符号)

           每个不属于上述其中之一的非空白字符


    约束

    2、每个被转换为一个标记的预处理标记应该具有一个关键字、一个标识符、一个常量、一个字符串字面量,或一个标点符号的词法形式。

    语义

    3、一个标记是在翻译阶段7和8中最小的语言词法元素。标记的类别有:关键字、标识符、常量、字符串字面量,以及标点符号。一个预处理标记是翻译阶段3到6中的最小语言词法元素。预处理标记的类别有:头文件名、标识符、预处理数字、字符常量、字符串字面量、标点符号,以及单个非空白字符,并且它在词法上不与其它预处理标记类别匹配。[注:一个额外的类别——记位符,被内部用于翻译单元阶段4(见6.10.3.3);它不能在源文件中发生。]如果一个'或一个"字符匹配了最后一个类别,那么行为是未定义的。预处理标记可以用空白空间来分隔;空白空间由注释(稍后描述),或空白字符(空格、水平制表符、换行、垂直制表符,以及换页),或两者同时构成。正如在6.10中所描述的,在某些情况下,在翻译阶段4期间,空白空间担当了比起预处理标记分隔更多任务。空白空间可以出现在一个预处理标记内,仅作为头文件名的一部分,或在一个字符常量或字符串常量中的引号字符之间的一部分。

    4、如果输入流已经被解析为预处理标记到一个给定的字符,那么下一个预处理标记是可以构建一个预处理标记的最长字符序列。对这个规则有一个例外:头文件名预处理标记仅在#include预处理指示符内以及在实现定义的#pragma指示符内的位置被识别。在这样的上下文中,一个要么可以作为一个头文件名,要么可以作为一个字符串字面量的字符序列被识别为前者。

    5、例1  程序片段1Ex被解析为一个预处理数字标记(它并不是一个有效的浮点或整数常量标记),即使被解析为预处理标记1Ex两个标记可能产生一个有效的表达式(比如,如果Ex是一个宏,被定义为+1)。类似地,程序片段1E1被解析为一个预处理数字(它是一个有效的浮点常量标记),无论E是否为一个宏名。

    6、例2  程序片段x+++++y被解析为x ++ ++ + y,这违反了递增操作符的约束,即便将其解析为x ++ + ++ y可能产生一个正确的表达式。


    6.4.1 关键字

    6.4.2 标识符

    6.4.3 通用字符名

    6.4.4 常量

    6.4.5 字符串字面量

    6.4.6 标点符号

    6.4.7 头文件名

    6.4.8 预处理数字

    6.4.9 注释

  • 相关阅读:
    mac下的一个类似“_kbhit()”实现
    mac使用备注
    open()打开文件失败对应的各种错误码
    xcode显示行号show gutter
    下载google code中源码的几个工具
    HTML5迷你游戏作验证码
    Linux+eclipse+gdb调试postgresql源码
    S-Nim
    【求助】从大表中删除小表中存在的记录问题
    Binary Tree Zigzag Level Order Traversal (LeetCode) 层序遍历二叉树
  • 原文地址:https://www.cnblogs.com/zenny-chen/p/4773754.html
Copyright © 2020-2023  润新知