1

我正在学习编译器设计。编译器中词法分析器的任务是将代码转换为令牌流。但我很困惑为什么我们将字符串视为单个标记。例如 -printf("%d is integer", x);在这个语句printf中,(, "%d is integer", ,, x, ),;是标记,但为什么%din string 不被视为单独的标记?

4

1 回答 1

2

因为格式说明符%d(或任何其他字符串内容)在语法上没有意义 - 语言语法中没有任何元素依赖于它们。字符串内容(包括格式说明符,如%d)是数据,而不是代码,因此对编译器没有意义。字符序列%d仅在运行时有意义,并且仅对*printf/*scanf系列函数有意义,并且仅作为格式字符串的一部分。

要识别%d为不同的标记,您必须标记整个字符串- ", %d, is, integer, "。这会自行打开一大堆蠕虫,使字符串的解析更加困难。

一些编译器确实会检查格式字符串参数printfscanf调用以进行一些基本的健全性检查,但那是在标记化已经发生之后。在标记化阶段,您不知道这是对printf库函数的调用。直到在语法分析之后,编译器才知道这是一个特定的库调用并且可以执行这种检查。

于 2021-06-08T16:05:46.257 回答