Walter Bright撰写的关于C++汇编的文章谈到了这两个短语C++编译中有哪些不同的标记类型?
“转换为预处理令牌”。
什么是初始令牌?预处理标记是什么样的?
“将预处理标记转换为C++标记” 这是什么C++标记,为什么不是最初转换成它?
参考:http://www.drdobbs.com/blogs/cpp/228701711
Walter Bright撰写的关于C++汇编的文章谈到了这两个短语C++编译中有哪些不同的标记类型?
“转换为预处理令牌”。
什么是初始令牌?预处理标记是什么样的?
“将预处理标记转换为C++标记” 这是什么C++标记,为什么不是最初转换成它?
参考:http://www.drdobbs.com/blogs/cpp/228701711
甲预处理标记是预处理器的语法的元素。从[lex.pptoken]在C++标准:
预处理令牌:
- 标题名
- 标识符
- PP-数
- character-literal
- 用户定义字符的字面
- 字串文本
- 用户定义-字串文本
- 预处理-OP-或-PUNC
- 每个非 - 不能是上述之一的空白字符
...
甲预处理标记是3至6
在转换阶段的语言的最小词法元件所以“转换到预处理标记”是词法翻译单元和识别的过程个人令牌。
C++令牌(真的只是“令牌”)列在[lex。令牌]:
令牌:
- 标识符
- 关键字
- 字面
- 操作者
- 标点符号
所有其他的转换阶段时有发生(宏扩展等)之后,这些只存在。
有关整个过程的更多信息,我建议阅读C++标准中的[lex.phases]。
更简单的解释。
而且,您可能知道,许多编译器都有一个词法分析过程,其中源代码被分割为令牌。
此源代码:
void main()
{
int x = -3 - -5;
printf("Hello World");
} // void main()
是变身为类似于这样:
+--------------+------------------+ | TOKEN | TEXT | +--------------+------------------+ | void | "void" | +--------------+------------------+ | identifier | "main" | +--------------+------------------+ | leftcurly | "{" | +--------------+------------------+ | identifier | "int" | +--------------+------------------+ | identifier | "x" | +--------------+------------------+ | assign | "=" | +--------------+------------------+ | minus | "-" | +--------------+------------------+ | integer | "3" | +--------------+------------------+ | minus | "-" | +--------------+------------------+ | minus | "-" | +--------------+------------------+ | integer | "5" | +--------------+------------------+ | semicolon | ";" | +--------------+------------------+ | identifier | "printf" | +--------------+------------------+ | leftpar | "(" | +--------------+------------------+ | string | "Hello World" | +--------------+------------------+ | rightpar | ")" | +--------------+------------------+ | semicolon | ";" | +--------------+------------------+ | rightcurly | "}" | +--------------+------------------+ | comment | "// void main()" | +--------------+------------------+
每件这种所谓的 “令牌” 的文字,都具有意义。
有时,在编译过程中的其它部分,该令牌可以被替换,由anothers令牌:
+--------------+------------------+ | TOKEN | TEXT | +--------------+------------------+ | void | "void" | +--------------+------------------+ | functiondec | "main" | +--------------+------------------+ | leftcurly | "{" | +--------------+------------------+ | type | "int" | +--------------+------------------+ | variabledec | "x" | +--------------+------------------+ | assign | "=" | +--------------+------------------+ | negative | "-" | +--------------+------------------+ | integer | "3" | +--------------+------------------+ | substract | "-" | +--------------+------------------+ | negative | "-" | +--------------+------------------+ | integer | "5" | +--------------+------------------+ | semicolon | ";" | +--------------+------------------+ | functioncall | "printf" | +--------------+------------------+ | leftpar | "(" | +--------------+------------------+ | string | "Hello World" | +--------------+------------------+ | rightpar | ")" | +--------------+------------------+ | semicolon | ";" | +--------------+------------------+ | rightcurly | "}" | +--------------+------------------+ | comment | "// void main()" | +--------------+------------------+
从 “负” 标记,以,无论是“负的转化签名令牌“,&”减法令牌“,是这个”预处理令牌“到”最终令牌“的非常好的例子。
这是一个非常概念性的解释。您可能想要阅读有关您的特定编译器文档的更详细的技术信息。
干杯
感谢您的支持。我会期待一些预处理器的例子,但这也很棒。 – unj2