6

我想写一个两种语言之间的翻译器,在互联网上阅读了一些内容后,我决定使用 ANTLR。我不得不从头开始学习它,但除了消除左递归的一些麻烦之外,到目前为止一切都很好。

然而,今天有人告诉我去看看 Happy,一个基于 Haskell 的解析器生成器。我没有 Haskell 知识,所以我可以使用一些建议,如果 Happy 确实比 ANTLR 更好并且值得学习的话。

具体来说,我担心的是我的翻译器需要支持宏替换,我还不知道如何在 ANTLR 中做到这一点。也许在Happy中这更容易做到?

或者,如果认为其他解析器生成器更好,我会很高兴听到它们。

4

1 回答 1

6

人们一直相信,如果他们只是获得了一个解析器,那么他们在构建语言工具时就已经做好了。那是错误的。解析器将您带到喜马拉雅山脚下, 然后您需要开始认真攀登。

如果您想为构建语言翻译器提供工业级支持,请参阅我们的 DMS 软件再造工具包。DMS 提供

  • 基于 Unicode 的词法分析器
  • 完整的上下文无关解析器(左递归?没问题!任意前瞻?没问题。模棱两可的语法?没问题)
  • C、C#、COBOL、Java、C++、JavaScript 等的完整前端(包括 C 和 C++ 的完整预处理器)
  • 自动构建 AST
  • 支持使用任意范围规则构建符号表
  • 属性语法评估,构建利用树结构的分析器
  • 支持控制和数据流分析(以及对完整 C、Java 和 COBOL 的实现),
  • 使用源语言和目标语言的语法进行源到源转换
  • AST 到源代码的漂亮打印,重现目标语言文本

关于 OP 处理宏的请求:我们的 C、COBOL 和 C++ 前端通过 a) 完全扩展的传统方法或 b) 不扩展(在可行的情况下)以启用宏本身的解析后转换来处理它们各自的语言预处理. 虽然作为基础的 DMS 并没有专门实现宏处理,但它可以支持宏处理的构建和转换。

作为使用 DMS 构建的转换器的示例,请参阅 将 JOVIAL 转换为 B-2 轰炸机的 C的讨论。这是大于 1 MSLOC 的硬实时代码的 100% 转换。[您可能会很高兴知道我们从未被允许看到正在翻译的实际程序(绝密)。]。是的,JOVIAL 有一个预处理器,是的,我们将大多数 JOVIAL 宏翻译成等效的 C 版本。

[Haskell 是一种很酷的编程语言,但它本身并不能做这样的事情。这与语言中可表达的内容无关。它是关于弄清楚需要什么机器来支持操作程序的任务,并花费 100 人年的时间来建造它。]

于 2009-09-03T02:46:11.667 回答