语言编译器是否使用复杂的 DFA 来接受程序?

Does a language compiler use a complex DFA to accept programs?

我正在阅读计算理论。而且我没有编程编译器的实际经验。

所以我突然想到,C 或 Java 编译器是否使用巨大的 DFA 来验证程序(TOC 用语中的字符串)?

编译器是 DFA 的实际实现吗?

有些编译器会,有些则不会。那些使用 DFA 的人通常使用像 lex/flex 这样的扫描仪生成器来构建 DFA。

当然,DFA 只会带你走这么远(事实上,最多是一种常规语言)。没有任何实用的编程语言可以用正则表达式来描述,因为正则表达式不能处理递归结构,如带括号的表达式或嵌套的控制流块。因此 DFA(如果有的话)将仅用于将输入分解为一系列标记。然后,令牌将被某种下推自动机、递归下降解析器或编码器的纯黑魔法解析。同样,PDA(如果有的话)很可能会自动生成,使用像 bison、ANTLR 和 many others.

这样的工具

很难找到一种足够纯粹的语言,简单的两阶段 DFA 扫描/PDA 解析就能正确地创建解析树。似乎总是存在添加句法结构的诱惑,它只能使用图灵完备的形式主义来解析。因此,在实际的编译器中,可能会出现优雅的理论模型在某些地方钻出小孔,并用意大利面条穿过它们。

尽管如此,解析技术的理论研究多年来大大简化了编译器的构造,并且成为数学中一个非常美丽和有趣的角落。