我正在编写将 Pascal 转换为 C 的程序,需要一些帮助。我从扫描仪生成器 Flex 开始。我定义了一些规则并创建了或多或少工作正常的扫描仪。它将 Pascal 语法分解为标记,现在它只打印它找到的内容。但我不知道下一步该怎么做。有没有关于这个主题的文章或书籍?你下一步怎么做?
4 回答
为什么要做这样的 Pascal 到 C 转换器?
如果您只想运行一些 Pascal 程序,使用(或改进)现有编译器(如gpc或 Pascal 到 C 翻译器)会更简单,例如p2c
如果您想将手写的 Pascal 代码转换为人类可读(且可改进)的 C 代码,则任务要困难得多;特别是,您可能希望转换缩进,注释,尽可能保持相同的名称 - 但避免与系统名称冲突 - 等等!
你总是想解析一些抽象的语法树,但是这些树的确切性质是不同的。也许flex
+bison
甚至ANTLR可能或不够(你总是可以编写一个手写的解析器)。此外,错误恢复可能对您来说很重要,也可能不重要(在第一个语法错误时中止非常容易;试图理解一个写得不好、语法不正确的 Pascal 源代码非常困难)。
您可能想查看“使用规范表示和属性语法反转在编程语言之间进行翻译” 和其中的参考资料。
最常见的方法是在前端构建一个解析树,然后遍历该树,在后端输出等效的 C。这使您可以灵活地执行任何所需的声明重新排序(IIRC Pascal 支持在声明之前使用,但 C 不支持)。如果您使用 flex 作为扫描仪,传统上会要求使用 bison 作为解析器,尽管还有其他选择。如果你看的话,你可能会发现一个免费的 Pascal 语法,它采用了 bison 所期望的格式。
您必须了解 Pascal 语法、C 语法并构建(设计)一个“某种东西”(即语法或自动机......),它可以翻译相应 C 规则中的每个 Pascal 规则。
比,一旦你有了标记化的流,使用像 LR 这样的方法,你可以找到对应于应用的 Pascal 规则序列的语义树,并转换相应的 C 规则中的每个规则(这可以用 Bison 轻松完成)。
注意 Pascal 和 C 没有上下文无关文法,因此需要更多的控制。