C代币数量

时间:2015-07-07 17:29:09

标签: c compiler-construction token

以下C语句中的令牌数是多少?

printf("i = %d, &i = %x", i, &i);

答案是10,请解释为什么会这样?

我从http://www.c4learn.com/c-programming/c-tokens-keywords-identifiers/https://msdn.microsoft.com/en-us/library/c6sb2c6b.aspx以及我的意见中搜索了9。

printf - 1
() - 2
"i = %d, &i = %x" - 1
, - 2
i,&i - 2
; - 1

总= 1 + 2 + 1 + 2 + 2 + 1 = 9

我是c的新手所以请帮帮我

3 个答案:

答案 0 :(得分:4)

只需在所有内容之间放置一个空格,以便语义中没有任何变化:

printf ( "i = %d, &i = %x" , i , & i ) ;

然后计算空格之间的部分:10个标记!请注意,令牌类似于自然语言中的“单词”,点等。它们与语义无关(它是解析器的一部分)。

请注意,这并不仅仅与C有关(除了令牌有效),但通常用于处理任何语言。阅读编译器构造。有一些好书(例如N. Wirth的经典可以免费下载)

答案 1 :(得分:2)

如果没有我们面前的C语言的词法规范,在这个陈述中真的不能说出正确的令牌数量,但是快速估计你可能得到这样的东西:

printf("i = %d, &i = %x", i, &i);

1. printf - Identifier
2. (      - Left Parenthesis
3. "      - String start (all subtokens count as one)
3.1 i      
3.2 =      
3.3 %      
3.4 d      
3.5 &      
3.6 i
3.7 equals
3.8 %
3.9 x
3.10 "        - string termination
4. ,          - comma (arguments separator)
5. i          - Identifier
6. ,          - comma (arguments separator)
7. &          - address of operator
8. i          - Identifier
9. )          - Right Parenthesis
10. ;         - Statement delimiter

3下的所有内容都标记了一个字符串,我刚刚将其整理出来,以便让您更清楚一点。

要获得比我们的猜测更具权威性的答案,您可以在文件中写下您想要的任何内容,例如experiment.c,然后让clang输出带有clang --cc1 -dump-tokens experiment.c的令牌

答案 2 :(得分:0)

以下是令牌 - >

  1. 的printf
  2. “i =%d,& i =%x”
  3. I
  4. &安培;
  5. I