关于 C 中的词法错误的说明

标签 c token lexical-analysis lexical

我已经读过thisthis问题。它们很有帮助,但我仍然对 C 的词法分析器中的 token 生成有一些疑问。 如果词法分析器检测到 int a2.5c; 那么根据我的理解将生成 7 个标记。

int keyword
a identifier
2 constant
. special symbol
5 constant
c identifier
; special symbol

所以词法分析器不会报错,token会生成成功。

我的理解对吗?如果不是那么你能帮我理解吗?

此外,如果我们将任何常量声明为 double a = 10.10.10;
它会产生任何词汇错误吗?为什么?

更新:出于好奇,如果词法分析器在程序中检测到 :-) 笑脸之类的东西怎么办?它会产生任何词汇错误吗?因为根据我的理解,: 将被视为特殊符号,- 将被视为运算符,) 将被视为特殊符号< br/> 谢谢你

最佳答案

您的第一个标记列表几乎是正确的——a2 是一个有效的标识符。

的确,第一个示例本身不会产生任何“词法”错误,尽管在 . 处会出现解析错误。

很难说第二个示例中的错误是词法错误还是解析错误。浮点常量的词法结构非常复杂。我可以想象一个编译器获取一串数字和 .e/E 并且直到它调用等价的 才注意到code>strtod 有两个小数点,这意味着它可能会报告“词法错误”。不过,严格来说,我们有两个连续的浮点常量 -- 10.10.10,这意味着它更可能是“解析错误”。

不过,归根结底,这些都只是错误。除非您正在学习编译器设计/构造类(class),否则我不确定将错误分类为词法错误或其他错误有多重要。


解决您的后续问题,是的,:-) 将 lex 作为三个标记 :-)

因为几乎所有标点符号字符在 C 中都是合法的,所以在词法上非法的字符序列相对较少(也就是说,在词法分析阶段会产生错误)。事实上,我唯一能想到的是:

  • 非法字符(我认为唯一未使用的是`和@)
  • 字符和字符串常量的各种问题(缺少 '"、错误的转义序列等)

事实上,几乎任何您想要发出的标点符号字符串都可以通过 C 词法分析器,当然它可能会也可能不会被解析。 (一个有点臭名昭著的例子是 a+++++b,不幸的是,它的词法是 a++++ + b,因此是一个语法错误。)

关于关于 C 中的词法错误的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31369524/

相关文章:

c - 仅在需要时运行的 Posix pthread 工作线程

android - 在 header 中发送 token (不同的 Activity )

php - 生成加密安全 token

c - 如何将数组定义为数字字符串的长度?

c - OpenFile 函数打开文件正常但返回 NULL 指针(C 程序)

html - 生成 HTML

python - Django:ViewSets 不接受登录要求,导致 SessionAuthentication 无用

c - 连续两次使用 yylex()

用于 alpha(alpha|digit)* 的 Python 正则表达式

parsing - ANTLR 中解析器规则和词法分析器规则之间的实际区别?