社区首页 >问答首页 >编译器中的标记数

编译器中的标记数
EN

Stack Overflow用户
提问于 2017-06-03 06:20:48
回答 2查看 1.6K关注 0票数 1

我想知道下面的声明中有多少标记

代码语言:javascript
代码运行次数:0
复制
a+++b---c

请告诉我有多少代币,我告诉我的viva老师,有7个代币,但他说这是错误的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-03 06:45:34

你是对的。有七个令牌:(在C中)

代码语言:javascript
代码运行次数:0
复制
a
++
+
b
--
-
c
票数 2
EN

Stack Overflow用户

发布于 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

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
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++是相同的词法)进行解析,那么你可以解释你的答案,并向他展示语言标准的相关部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44344886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文