c - C 中的词法和语义错误

标签 c compiler-construction

最近我不得不给出 C 中的词法和语义错误的示例。我提供了以下示例。

我以为下面是词法错误,

int a#;

对于语义错误,我给出了以下示例,

int a[10];
a=100;

但现在我有点困惑是否两者实际上都是语法错误。请给我一些关于这些错误的想法?

最佳答案

首先,错误的分类(如词汇、句法、语义、语用)在细节上有些随意。

如果您将词法错误定义为 lexer 检测到的错误,则格式错误的数字可能是 1,例如 12q4z5。或带有禁止字符的名称,如 $

您可以将语法错误定义为在 parsing 处检测到的错误时间。但是 C 不是严格意义上的 context-free language , 它的解析器保留上下文信息(例如在符号表中)。

由于所有a #; 都是有效的词位,所以你的a#; 不是词法错误。

其实#主要在预处理时有用,解析的其实是预处理后的形式,而不是用户给的源码!

许多语义错误与 undefined behavior 的概念有关,比如缺少整数参数的 printf("%d")。或者越界访问,在你的情况下 printf("%d\n", a[1234]);

一些(但不是全部)语义或语用错误可以通过 static analysis tools 找到.您甚至可以说现代编译器(启用所有警告时)会做一些事情。 a=100; 的示例是 typing错误(可以任意称为语法,因为 C 编译器在解析时发现它,也可以称为语义,因为与不是上下文无关属性的类型相关)。而且你有更专业的静态分析工具,比如 Frama-C并且您可以扩展自定义 GCC 编译器(例如使用 MELT ,一种领域特定语言)以添加您的编译器(例如在 TALPO 中)。

实用错误可能是声明一个巨大的局部变量,例如 here .也许,当 1TB 的 RAM 内存变得普遍时,堆栈将有许多千兆字节,因此该示例可以运行,但不是今天。

关于c - C 中的词法和语义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15570553/

相关文章:

c - C中/+和+的区别?

c++ - 令人困惑的 C++ 编译器错误, "cannot convert ' X' 返回 'double'

objective-c - 通过代码验证应用程序的签名

c - 这个半反编译代码有什么作用(C)

compiler-construction - JIT编译器做什么?

gcc - GCC 生成的 ARM 和 x86 汇编代码的区别

c++ - 临时结构对象构造函数奇数调用

c - cl编译器(Visual Studio)在哪里生成LIB和EXP文件

c - 如何修复代码以打开代码块中命令提示符中传递的文件

c - PF4 的中断配置?