【发布时间】:2015-09-30 03:05:42
【问题描述】:
我正在阅读计算理论。而且我没有编译器编程的实际经验。
所以我突然想到,C 或 Java 编译器是否使用巨大的 DFA 来验证程序(TOC 用语中的字符串)?
编译器是 DFA 的实际实现吗?
【问题讨论】:
-
也许如果有人觉得它应该转到其他一些 stackexchange 站点,请迁移它。 @Admin
标签: compiler-construction automata
我正在阅读计算理论。而且我没有编译器编程的实际经验。
所以我突然想到,C 或 Java 编译器是否使用巨大的 DFA 来验证程序(TOC 用语中的字符串)?
编译器是 DFA 的实际实现吗?
【问题讨论】:
标签: compiler-construction automata
有些编译器会,有些则不会。那些使用 DFA 的人通常使用像 lex/flex 这样的扫描仪生成器来构建 DFA。
当然,DFA 仅能带您到此为止(实际上,最多可以达到常规语言)。正则表达式无法描述任何实用的编程语言,因为正则表达式无法处理带括号的表达式或嵌套的控制流块等递归结构。因此,如果有的话,DFA 将仅用于将输入分解为一系列标记。然后,令牌将由某种下推自动机、递归下降解析器或编码器方面的纯黑魔法来解析。同样,PDA(如果有的话)很可能是使用 bison、ANTLR 和 many others 等工具自动生成的。
很难找到一种足够纯净的语言,使得简单的两阶段 DFA 扫描/PDA 解析能够真正正确地创建解析树。似乎总是很想添加一个只能使用图灵完备的形式来解析的句法结构。因此,在实际编译器中,可能会在某些地方在可能优雅的理论模型中钻有小孔,并在其中穿插意大利面条。
尽管如此,多年来对解析技术的理论研究已经大大简化了编译器的构造,并且是数学中一个非常漂亮和有趣的角落。
【讨论】: