C 中的词法错误与语法错误

Lexical error vs syntax error in C

考虑以下 C 程序的第 3 行。

int main() {            /*Line 1 */
int I, N;               /*Line 2 */
fro (I=0, I<N, I++);    /*Line 3 */
}

在创建对象模块时识别编译器对此行的响应:

  1. 没有编译错误
  2. 只有一个词法错误
  3. 只有语法错误
  4. 词汇和语法错误

我的尝试:

Line 3fro 而不是 C 的 for 关键字。因为,词法分析器不关心错误的关键字,语法分析器的工作是确保正确的语法或关键字(即 for() 而不是 fro())。词法分析器对程序进行标记化。

Can you explain in formal way please?

fro 不会匹配关键字,但词法分析会正常,fro 将被归类为标识符。

在解析阶段,fro (I=0, I<N, I++)会被转化为一个三参数的函数调用。请注意,在同一序列点内修改和读取 I 变量是未定义的行为。

在作用域分析期间,编译器会抱怨不存在这样的函数,或者,如果编译器将看不见的函数视为隐式声明,链接器会抱怨存在对函数的未定义引用。