【发布时间】:2011-10-27 14:56:05
【问题描述】:
今天在工作中,当我与我的编译器发生另一件事时,这个问题突然出现在我的脑海中。尽管我的小指是浅黄色(由于我在工作中按分号),但在if 声明之前我还是错过了一个。显然,这导致了编译错误:
错误 C2143:语法错误:缺少 ';'在'如果'之前
所以我想知道“哎呀,你为什么不能告诉我缺少分号的那一行,而不是问题 after 之后的那一行。”然后我开始尝试其他类似的语法错误:
错误 C2065:“myUndeclared”:未声明的标识符
错误 C2143:语法错误:在 'if' 之前缺少 ')'
等等……
现在,所有这些错误同样会将我带到问题的之后行,并在if 声明之前抱怨一些事情。
考虑以下几点:
SomeFunction(x) //Notice, there is no ';' here
if(bSomeCondition)
{
...
}
我得到两个编译错误:
(第 265 行)错误 C2065:'x':未声明的标识符
(第 266 行)错误 C2143:语法错误:缺少 ';'在'如果'之前
但是,第一个错误正确地告诉我行号,尽管缺少分号。这向我表明编译器不会在解析时出错,并且能够解决分号问题。那么,为什么编译器坚持以这种方式报告语法错误呢?其他错误(非语法)会在发现的行上报告。这是否与编译器进行多次传递有关?基本上,我希望具有 C++ 编译器工作知识的人可以具体解释编译器在做什么,需要以这种“之前”的方式报告错误。
【问题讨论】:
-
您是否尝试在“if”行添加分号,即
;if?
标签: c++ compiler-construction compilation grammar