编译器中的令牌数

时间:2017-06-03 14:20:48

标签: c expression token lexical-analysis compiler-construction

我想知道下面给出的声明中的令牌数量

a+++b---c

请告诉我令牌的数量 我告诉我的viva老师,有7个令牌,但他说这是错的。

2 个答案:

答案 0 :(得分:2)

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

a
++
+
b
--
-
c

答案 1 :(得分:0)

根据C标准(C11前草案):http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf

  

6.4词汇元素

     

3令牌是翻译阶段7和8中语言的最小词汇元素。令牌的类别包括:关键字,标识符,常量,字符串文字和标点符号。 ...

     

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

     

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

因此,我使用了https://en.wikipedia.org/wiki/Maximal_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具有复杂的代码,并且可能在单个代码示例(so they are not best guides to the language, as rici said)中混合标准的不同转换阶段,但我们可能会检查++--的解析实现。当它看到char +时,它可能会根据下一个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 ++解析)对于这个例子,你可以解释你的答案并向他展示语言标准的相关部分。