gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:26 25 4
gpt4 key购买 nike

最近我不得不给出 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com