为什么在原始数据类型之后不能省略空格?

时间:2016-07-11 14:33:16

标签: compiler-construction whitespace

为什么编译器不允许我使用intmain代替int main?不编译器在编译时丢弃空格吗?

4 个答案:

答案 0 :(得分:1)

编译器会丢弃多余的空格。

仍然需要单词/符号中断,否则,无法知道您是指一个名为intmain的变量还是正在启动函数int main...

多余的空白主要是多个空格,连续符号之间有空格。

答案 1 :(得分:1)

编译器如何知道你的意思是intmain意味着int main?为什么不in tmainintma in?或者只是intmain?它无法读懂你的想法。

所以,不,他们不会丢弃空格,因为他们不能。

答案 2 :(得分:1)

考虑一个例子:

class in{};
in tmain() {return in();}

编译器如何在您的示例中对此声明和intmain进行区分? 所以编译器只在可区分的令牌之间丢弃空格符号(制表符,空格,回车符)。

答案 3 :(得分:1)

大多数令牌器丢弃空格,因为它们不会为其生成令牌。但这并不意味着空白空间根本没有效果:它仍然会强制一个令牌结束而下一个令牌开始。

考虑它的一种方法是,一个标记器有三个作业:

  1. 将输入文本拆分为lexemes(子字符串)。
  2. 将每个词位分类为“标识符”或“空格”等类别。
  3. 生成包含每个词位的值和分类的标记值流。
  4. 作业1和作业2的工作方式是我们为每种类型的令牌定义规则。然后,令牌化器采用与当前输入的最长前缀匹配的规则。然后它生成lexeme并根据使用哪个规则对其进行分类。

    因此,当我们说令牌化器“忽略”空格时,我们的意思是作业3不会为已被归类为空白区域的词汇生成令牌。这不会以任何方式影响工作1。

    为了说明这一点,输入int main()的三个作业如下所示:

    1. "int", " ", "main", "(", ")"
    2. KEYWORD_INT, SPACE, IDENTIFIER, OPEN_PAR, CLOSING_PAR
    3. KEYWORD_INT, IDENTIFIER("main"), OPEN_PAR, CLOSING_PAR
    4. 对于intmain(),它看起来像这样:

      1. "intmain", "(", ")"
      2. IDENTIFIER, OPEN_PAR, CLOSING_PAR
      3. IDENTIFIER("main"), OPEN_PAR, CLOSING_PAR
      4. 我们得到intmain而不是int, main的原因是标识符规则仍然在t之后保持匹配。

        在对您提出的其他答案的评论中,为什么int没有获得优先权。这意味着我们改变了作业1的逻辑,因此它不会采用最长匹配的规则,而是总是优先于“标识符”规则的“关键字int”规则。这将使得不可能有一个以“int”开头的标识符(因为它总是被归类为关键字int),所以这是一个非常糟糕的主意。