C 编译器中的令牌数

C 编译器中的令牌数,c,expression,token,lexical-analysis,compiler-construction,C,Expression,Token,Lexical Analysis,Compiler Construction,我想知道下面陈述中的代币数量 a+++b---c 请告诉我代币的数量 我告诉我的viva老师有7个代币,但他说这是错误的。你是对的。共有七个代币:(在C中) 你说得对。共有七个代币:(在C中) 根据C标准(C11之前的草案): 6.4词汇要素 3在翻译阶段7和8,标记是语言的最小词汇元素。标记的类别有:关键字、标识符、常量、字符串文字和标点符号 4如果输入流已被解析为预处理令牌(最多可达给定字符),则下一个预处理令牌是可构成预处理令牌的最长字符序列。 ... 6例2程序片段x+++++y被解析

我想知道下面陈述中的代币数量

a+++b---c
请告诉我代币的数量
我告诉我的viva老师有7个代币,但他说这是错误的。

你是对的。共有七个代币:(在C中)


你说得对。共有七个代币:(在C中)


根据C标准(C11之前的草案):

6.4词汇要素

3在翻译阶段7和8,标记是语言的最小词汇元素。标记的类别有:关键字、标识符、常量、字符串文字和标点符号

4如果输入流已被解析为预处理令牌(最多可达给定字符),则下一个预处理令牌是可构成预处理令牌的最长字符序列。 ... 6例2程序片段
x+++++y
被解析为
x+++++y
,这违反了增量运算符的约束,即使解析
x+++++y
可能产生正确的表达式

6.4.6标点符号。。标点符号:
++
--
<代码>+
-

因此,规则的使用如2011年9月20日Shahbaz:“C和C++的Listor,尝试匹配他们看到的最大的字符串当他们看到……因此,当lexer看到第一个加号时,它尝试下一个字符,它看到它可以将两个字符匹配为
++
,然后继续查看下一个
++
。因此,解析器会看到
a+++b

而gcc和clang有复杂的代码,可能会在单个代码示例中混合标准的不同翻译阶段(),我们可以检查
++
--
的解析实现。当它看到char
++
时,它可能会根据下一个char生成不同的令牌,如果也是
++
,则发出plusplus令牌,否则发出plus令牌:


因此,
a+++b--c
表达式的标记是
a
++
--
-
c
.Advisor可能会说你错了,但只想让你解释一下为什么你认为自己数了7。如果问题与给定的任务相同,并且是根据c来解析的,标准(或C++,这是相同的词汇,这个例子),你可以解释你的答案,并显示他相关的语言标准部分。< /P> < P>根据C标准(前C11草案):< /P> 6.4词汇要素

3标记是翻译阶段7和8中语言的最小词汇元素。标记的类别有:关键字、标识符、常量、字符串文字和标点符号

4如果输入流已被解析为预处理令牌(最多可达给定字符),则下一个预处理令牌是可构成预处理令牌的最长字符序列。 …6示例2程序片段
x+++++y
被解析为
x+++++y
,这违反了增量运算符的约束,即使解析
x+++++y
可能产生正确的表达式

6.4.6标点符号..标点符号:
+
--
..
+
-

<规则>使用,如“代码> A+++B/<代码>片段:沙赫巴兹9月20日2011:“C和C++的Listor,尝试匹配他们看到的最大字符串时……因此,当lexer看到第一个加号时,它尝试下一个字符,它看到它可以将两个字符匹配为
++
,然后继续查看下一个
++
。因此,解析器会看到
a+++b

而gcc和clang有复杂的代码,可能会在单个代码示例中混合标准的不同翻译阶段(),我们可以检查
++
--
的解析实现。当它看到char
++
时,它可能会根据下一个char生成不同的令牌,如果也是
++
,则发出plusplus令牌,否则发出plus令牌:


因此,
a+++b--c
表达式的标记是
a
++
--
-
c
.Advisor可能会说你错了,但只想让你解释一下为什么你认为自己数了7。如果问题与给定的任务相同,并且是根据c来解析的,标准(或C++,这是相同的词汇,这个例子),你可以解释你的答案,并显示他相关的语言标准。

你尝试的代码是什么?“A”“+ +”“+”“B”“-”“C”,如“C和C++的Listar”,尝试匹配他们看到的最大的字符串。“是的,这可能是C/C++”statement@osgx:在C语言中,唯一的上下文标记是对
#include
预处理器指令的特殊处理。除此之外,这只是对一组可能的模式的最大咀嚼。听起来很像你的导师完全错了。你的导师说代币是什么?我很难想象一个答案,除了你的代码之外,还有什么“A”“+”“+”“B”“-”“C”,如“C和C++的Listar中的,尝试匹配他们看到的最大字符串时”,是的,这可能是C/C++。statement@osgx:在C中,唯一的上下文标记是对
#include
预处理器指令的特殊处理。除此之外,这只是对一组可能的模式的最大咀嚼。听起来很像你的导师完全错了。你的导师说代币是什么?我很难想象出一个7以外的答案。@akansh:耸耸肩。@Akanshinghal如果你相信你的导师,那你为什么在这里问?(我想说,我相信答案也是7,但如果你要告诉我你的导师也不同意我,那有什么意义?@akansh:耸耸肩。@Akanshinghal如果你相信你
a
++
+
b
--
-
c
3264  case '+':
3265    Char = getCharAndSize(CurPtr, SizeTmp);
3266    if (Char == '+') {
3267      CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
3268      Kind = tok::plusplus;
3269    } else if (Char == '=') {
3270      CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
3271      Kind = tok::plusequal;
3272    } else {
3273      Kind = tok::plus;
3274    }
3275    break;
2633    case '+':
2634      result->type = CPP_PLUS;
2635      if (*buffer->cur == '+')
2636        buffer->cur++, result->type = CPP_PLUS_PLUS;
2637      else if (*buffer->cur == '=')
2638        buffer->cur++, result->type = CPP_PLUS_EQ;
2639      break;