我正在学习编译器设计。编译器中词法分析器的任务是将代码转换为令牌流。但我很困惑为什么我们将字符串视为单个标记。例如 -printf("%d is integer", x);
在这个语句printf
中,(
, "%d is integer"
, ,
, x
, )
,;
是标记,但为什么%d
in string 不被视为单独的标记?
问问题
86 次
1 回答
2
因为格式说明符%d
(或任何其他字符串内容)在语法上没有意义 - 语言语法中没有任何元素依赖于它们。字符串内容(包括格式说明符,如%d
)是数据,而不是代码,因此对编译器没有意义。字符序列%d
仅在运行时有意义,并且仅对*printf
/*scanf
系列函数有意义,并且仅作为格式字符串的一部分。
要识别%d
为不同的标记,您必须标记整个字符串- "
, %d
, is
, integer
, "
。这会自行打开一大堆蠕虫,使字符串的解析更加困难。
一些编译器确实会检查格式字符串参数printf
并scanf
调用以进行一些基本的健全性检查,但那是在标记化已经发生之后。在标记化阶段,您不知道这是对printf
库函数的调用。直到在语法分析之后,编译器才知道这是一个特定的库调用并且可以执行这种检查。
于 2021-06-08T16:05:46.257 回答