回答
有两个分析器在这里工作:第一,C编译器,这将解析C文件,基本上忽略字符串的内容(虽然现代的C编译器会解析字符串以帮助捕获不良格式字符串 - %
转换说明符与传递给printf()
的相应参数之间的不匹配将被转换)。
下一个解析器是内置于C运行时库中的字符串格式解析器。在调用printf
时,这将在运行时调用以解析格式字符串。这个解析器当然非常简单。
我还没有检查过,但我猜测帮助检查坏格式字符串的C编译器将实现类似printf
的解析器作为后处理步骤(即使用它自己的词法分析器)。
字符串文字是单个标记。上面的代码将被标记化这样的:
int keyword "int"
i identifier
; semicolon
printf identifier
( open paren
"%d" string literal
, comma
i identifier
) closing paren
; semicolon
我认为OP想要知道更多沿着意愿线“%d”生成长度为1或2的字符数组(即“\ n”将生成长度为1的字符数组) - I认为他寻找的答案是它将是一个字符串文字,其中包含两个不同的字符(然后在运行时通过* printf方法进一步分析)。 – BrainSlugs83 2014-08-31 09:54:58
"%d"
是字符串文字,它将被视为由两个C preprocessor一个令牌,并且还由编译器,我们可以通过将draft C99 standard部6.4
词汇元素限定下列标记看到这一点:
token:
keyword
identifier
constant
string-literal
punctuator
和以下proprocessing令牌:
preprocessing-token:
header-name
identifier
pp-number
character-constant
string-literal
punctuator
each non-white-space character that cannot be one of the above
一个d表示:
甲令牌是语言的最小词法元件在翻译 相7和8令牌的类别为:关键字,标识符, 常量,字符串文字,和标点符号。甲预处理标记是 语言的最小的词法元件在翻译阶段3 至6预处理标记的类别为:标题名称, 标识符,预处理数字,字符常量,串 文字,标点符号,以及单个非空白字符做 不词法匹配其他预处理标记categories.58)[...]
翻译的不同阶段将在第5.1.1.2
平移阶段我会在这里强调一些相关的:
[...]
3源文件是分解为预处理令牌 6)和 空白字符序列(包括注释)。
[...]
6将相邻的字符串文字标记连接在一起。
7分隔标记的空白字符不再显着。 将每个 预处理令牌转换为令牌。结果令牌是 在句法和语义上分析并翻译为翻译单元。
[...]
预处理器令牌和令牌之间的区别可能看起来不相关,但我们可以看到,在至少一种情况下,例如在相邻的字符串文字例如"%d" "\n"
你将有两个预处理器令牌,而在阶段6
之后将只有一个令牌。
需要一个库函数#include'stdio.h'在ur代码的顶端...
- 1. 解析roslyn中的C#条件编译语句
- 2. 如何C编译器解释下面的代码序列
- 3. 不C#编译器优化空语句
- 4. C/C++编译器优化条件语句多少钱?
- 5. C/C++编译器是否会优化if语句?
- 6. 什么是一个好的C#编译器 - 编译器/解析器生成器?
- 7. C#中的Sql解析器用于语法检查Oracle语句
- 8. 下面的代码如何在C/C++中编译?
- 9. 如何用C语言解析xpath语句#
- 10. Select语句解析目标C
- 11. 如何在C++中编译编译器?
- 12. MingW编译器中的C语句和语句导致的错误
- 13. c语句汇编
- 14. 如何为if和while语句编写简单的解析器?
- 15. 编译时编译器跳过语句?
- 16. C#LINQ方法链中赋值语句的编译器警告?
- 17. 编译Charniak的解析器
- 18. 该语句如何被编译器解释?
- 19. c编译器的语义阶段
- 20. 用C++编译器编译c代码
- 21. 了解C++编译
- 22. 如何翻译下面的JavaScript以C#?
- 23. Visual Studio 2008 C#编译器const if语句问题!
- 24. 反编译Objective-C预处理器语句
- 25. 为什么不能C#编译器贯彻switch语句
- 26. 如果语句没有编译的范围内的C++宏
- 27. 用C语言中的antlr3解析一些特定的语句
- 28. 如何在c中编组foreach语句#
- 29. 如何解决C++编译器中的链接器错误
- 30. 如何在C编写编译器?
词法分析器会将''%d“'标识为竞争串。编译器“语法”和“语义”的下一个阶段是那些标识缺少参数和类型检查的阶段。如果你编译代码(在printf中没有'i'),你将会得到''格式由于语法和语义检查'%d'''需要匹配'int'参数。 – 2014-08-30 12:59:03
如果字符串没有单独解析为标记,语法分析如何发现错误? – 2014-08-30 12:59:29
“语法分析”是“词法”之后的下一阶段。编译器的头部生成令牌流(如sepp2k的答案中给出的),然后进一步解析toke流(使用语法)并在下一阶段进行语义检查。 – 2014-08-30 13:01:43