Parsing ANTLR vs.Happy vs.其他解析器生成器

Parsing ANTLR vs.Happy vs.其他解析器生成器,parsing,antlr,Parsing,Antlr,我想写一个两种语言之间的翻译,在互联网上读了一些书后,我决定使用ANTLR。我必须从头开始学习,但除了消除左递归的一些麻烦之外,直到现在一切都很顺利 然而,今天有人告诉我去看看Happy,一个基于Haskell的解析器生成器。我没有Haskell的知识,所以如果Happy确实比ANTLR好,并且值得学习,我可以提供一些建议 我特别关心的是,我的翻译人员需要支持宏替换,我还不知道如何在ANTLR中实现宏替换。也许在快乐中这更容易做到 或者,如果我认为其他解析器生成器更好,我会很高兴听到他们的消息。

我想写一个两种语言之间的翻译,在互联网上读了一些书后,我决定使用ANTLR。我必须从头开始学习,但除了消除左递归的一些麻烦之外,直到现在一切都很顺利

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

我特别关心的是,我的翻译人员需要支持宏替换,我还不知道如何在ANTLR中实现宏替换。也许在快乐中这更容易做到


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

人们一直认为,如果他们只是得到了一个解析器,他们就已经成功了 在构建语言工具时。那是错误的。解析器把你带到山脚下 在喜马拉雅山上,你需要开始认真地攀登

如果您想要在构建语言翻译器方面获得行业实力支持,请参阅我们的 . DMS提供

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

关于OP的处理宏的请求:我们的C、COBOL和C++前端通过一个完整的扩展方法或B)非扩展(实用)来处理它们各自的语言预处理,从而实现宏的后解析转换。DMS作为一个基础并没有具体实现宏处理,它可以支持相同的构造和转换。 作为使用DMS构建的翻译器的示例,请参见 . 对于大于1 MSLOC的硬数据,这是100%的转换 实时代码。[知道我们从未被允许看到实际的程序被翻译(绝密)可能会让你觉得好笑。]。是的,JOVIAL有一个预处理器,是的,我们将大多数JOVIAL宏翻译成了等效的C版本

[Haskell是一种很酷的编程语言,但它本身并没有这样做。 这与语言中什么是可表达的无关,而是要弄清楚需要什么机器来支持操作程序的任务,以及
用100人年的时间来建造它。]

@Ira Baxter-这是一个小世界,你离我很远哦,点击“这是一个很好的评论”上的“向上”按钮。你从我的打嗝中受益。从我的用户注册页面找到我的电子邮件地址,并向我发送介绍性说明;在这里可能会有一些有趣的对话。这太棒了。但是我想你在开源社区里找不到类似的东西。其他程序转换系统:TXL是免费的,但我不认为是开源的。Stratego可能两者都有。两者都有非常强大的解析技术。两者都不直接支持构建符号表、执行属性语法或执行控制/数据流分析。对Unicode一无所知。YMMV.如果你能说,你现在能提供的最有用的信息是回答“源语言和目标语言是什么?”@280Z28它们是内部创建的语言。它们有点类似于Java,不同之处在于类可以包含宏定义,然后在方法内部需要扩展宏。与此同时,我发现我的问题比我最初想象的要简单。我用lexer中的ANTLR实现了这一点,所以现在不必急着学习Happy或其他生成器。好吧,如果你分享了你的解决方案,或者至少有一个链接指向如何使用lexer实现这一点,那就太好了。