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 */
}
在创建对象模块时识别编译器对此行的响应:
- 没有编译错误
- 只有一个词法错误
- 只有语法错误
- 词汇和语法错误
我的尝试:
Line 3
有 fro
而不是 C 的 for
关键字。因为,词法分析器不关心错误的关键字,语法分析器的工作是确保正确的语法或关键字(即 for()
而不是 fro()
)。词法分析器对程序进行标记化。
Can you explain in formal way please?
fro
不会匹配关键字,但词法分析会正常,fro
将被归类为标识符。
在解析阶段,fro (I=0, I<N, I++)
会被转化为一个三参数的函数调用。请注意,在同一序列点内修改和读取 I
变量是未定义的行为。
在作用域分析期间,编译器会抱怨不存在这样的函数,或者,如果编译器将看不见的函数视为隐式声明,链接器会抱怨存在对函数的未定义引用。
考虑以下 C 程序的第 3 行。
int main() { /*Line 1 */
int I, N; /*Line 2 */
fro (I=0, I<N, I++); /*Line 3 */
}
在创建对象模块时识别编译器对此行的响应:
- 没有编译错误
- 只有一个词法错误
- 只有语法错误
- 词汇和语法错误
我的尝试:
Line 3
有 fro
而不是 C 的 for
关键字。因为,词法分析器不关心错误的关键字,语法分析器的工作是确保正确的语法或关键字(即 for()
而不是 fro()
)。词法分析器对程序进行标记化。
Can you explain in formal way please?
fro
不会匹配关键字,但词法分析会正常,fro
将被归类为标识符。
在解析阶段,fro (I=0, I<N, I++)
会被转化为一个三参数的函数调用。请注意,在同一序列点内修改和读取 I
变量是未定义的行为。
在作用域分析期间,编译器会抱怨不存在这样的函数,或者,如果编译器将看不见的函数视为隐式声明,链接器会抱怨存在对函数的未定义引用。