为什么编译器不允许我使用intmain
代替int main
?不编译器在编译时丢弃空格吗?
答案 0 :(得分:1)
编译器会丢弃多余的空格。
仍然需要单词/符号中断,否则,无法知道您是指一个名为intmain
的变量还是正在启动函数int main...
。
多余的空白主要是多个空格,连续符号之间有空格。
答案 1 :(得分:1)
编译器如何知道你的意思是intmain
意味着int main
?为什么不in tmain
或intma in
?或者只是intmain
?它无法读懂你的想法。
所以,不,他们不会丢弃空格,因为他们不能。
答案 2 :(得分:1)
考虑一个例子:
class in{};
in tmain() {return in();}
编译器如何在您的示例中对此声明和intmain
进行区分?
所以编译器只在可区分的令牌之间丢弃空格符号(制表符,空格,回车符)。
答案 3 :(得分:1)
大多数令牌器丢弃空格,因为它们不会为其生成令牌。但这并不意味着空白空间根本没有效果:它仍然会强制一个令牌结束而下一个令牌开始。
考虑它的一种方法是,一个标记器有三个作业:
作业1和作业2的工作方式是我们为每种类型的令牌定义规则。然后,令牌化器采用与当前输入的最长前缀匹配的规则。然后它生成lexeme并根据使用哪个规则对其进行分类。
因此,当我们说令牌化器“忽略”空格时,我们的意思是作业3不会为已被归类为空白区域的词汇生成令牌。这不会以任何方式影响工作1。
为了说明这一点,输入int main()
的三个作业如下所示:
"int", " ", "main", "(", ")"
KEYWORD_INT, SPACE, IDENTIFIER, OPEN_PAR, CLOSING_PAR
KEYWORD_INT, IDENTIFIER("main"), OPEN_PAR, CLOSING_PAR
对于intmain()
,它看起来像这样:
"intmain", "(", ")"
IDENTIFIER, OPEN_PAR, CLOSING_PAR
IDENTIFIER("main"), OPEN_PAR, CLOSING_PAR
我们得到intmain
而不是int, main
的原因是标识符规则仍然在t
之后保持匹配。
在对您提出的其他答案的评论中,为什么int
没有获得优先权。这意味着我们改变了作业1的逻辑,因此它不会采用最长匹配的规则,而是总是优先于“标识符”规则的“关键字int”规则。这将使得不可能有一个以“int”开头的标识符(因为它总是被归类为关键字int
),所以这是一个非常糟糕的主意。