Pascal转C转换器

时间:2012-04-29 16:46:53

标签: c pascal flex-lexer code-translation

我正在编写将Pascal翻译为C并需要一些帮助的程序。我开始使用扫描仪生成器Flex。我定义了一些规则,并创建了或多或少正常工作的扫描仪。它将Pascal语法分解为标记,现在它只打印它找到的内容。但我不知道接下来该怎么做。有没有涉及这个主题的文章或书籍?下一步是什么?

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

为什么要做这样的Pascal to C转换器?

如果您只想运行一些Pascal程序,则可以更简单地使用(或改进)现有的编译器,如gpc或Pascal到C的转换器,例如: p2c

如果你想将手写的Pascal代码转换为人类可读(和可改进的)C代码,那么任务就更难了;特别是,您可能希望转换缩进,注释,尽可能保持相同的名称 - 但避免与系统名称冲突等等!

您总是想要解析一些抽象语法树,但这些树的确切性质是不同的。也许flex + bison或甚至ANTLR可能或不足(您可以随时编写手写解析器)。此外,错误恢复对您来说可能不重要(中止第一个语法错误非常容易;试图弄清楚语法不正确的Pascal源是非常困难的。)

如果您想构建玩具Pascal编译器,请考虑使用LLVM(或者甚至是GCC中端和后端)

答案 2 :(得分:1)

最常见的方法是在前端构建一个解析树,然后遍历该树,在后端输出等效的C.这使您可以灵活地执行所需的声明重新排序(IIRC Pascal支持在声明之前使用,但C不支持)。如果您使用flex作为扫描仪,传统将决定使用bison作为解析器,尽管有其他选择。如果你看,你可以找到一个免费的Pascal语法,其格式为bison所期望的格式。

答案 3 :(得分:1)

你必须知道Pascal语法,C语法和构建(设计)一个“东西”(即语法或自动机......),它可以翻译相应C规则中的每个Pascal规则。

然后,一旦你有了你的标记化流,使用像LR这样的方法,你可以找到与应用的Pascal规则序列相对应的语义树,并转换相应C规则中的每个规则(这可以很容易地用Bison完成)。

注意Pascal和C没有Context Free语法,因此需要更多的控制。