我想知道下面的声明中有多少标记
a+++b---c
请告诉我有多少代币,我告诉我的viva老师,有7个代币,但他说这是错误的。
发布于 2017-06-03 06:45:34
你是对的。有七个令牌:(在C中)
a
++
+
b
--
-
c
发布于 2017-06-03 06:47:21
根据C标准(预C11草案):http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf
6.4词汇要素 3标记是语言在翻译阶段7和8中的最小词法元素。标记的分类是:关键字、标识符、常量、字符串文字和标点符号。..。 4如果输入流被解析为预处理标记,直到给定字符,则下一个预处理令牌是构成预处理令牌的最长字符序列。.例2程序片段
x+++++y
被解析为x ++ ++ + y
,这违反了增量操作符的约束,即使解析x ++ + ++ y
可能产生正确的表达式 6.4.6标点符号。标点符号:++
--
.+
-
之一
因此,使用munch规则就像https://stackoverflow.com/a/7485174和注释中提到的a+++b
片段:What does the operation c=a+++b mean? Shahbaz,2011年9月20日:“C和C++的词汇,当他们看到一些东西时,试着匹配他们能看到的最大字符串。因此,当词汇器看到第一个加字符时,它尝试下一个字符,它看到两个字符都可以匹配为++
__,然后继续看到下一个+
__。因此,解析器看到a ++ + b
。”
gcc和clang具有复杂的代码,可以在单个代码样本(, as rici said)中混合不同的标准翻译阶段,我们可以检查++
和--
的解析实现。当它看到char +
时,它可能会根据下一个字符生成不同的令牌,如果是+
,则发出plusplus令牌,否则就会发出加号:
http://code.metager.de/source/xref/llvm/clang/lib/Lex/Lexer.cpp#3264
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;
http://code.metager.de/source/xref/gnu/gcc/libcpp/lex.c#2633
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;
因此,a+++b---c
表达式的标记是a
++
+
b
--
-
c
。顾问可能会说你错了,但只想让你解释为什么你认为自己数了7个。如果问题和给定的任务相同,并且按照C标准(或者这个例子中的C++是相同的词法)进行解析,那么你可以解释你的答案,并向他展示语言标准的相关部分。
https://stackoverflow.com/questions/44344886
复制相似问题