我正在开发一种工具,可以对程序执行一些简单的转换(比如提取方法)。为此,我将不得不执行编译的前几个步骤(标记化,解析并可能构建符号表)。我将从C开始,然后希望扩展它以支持多种语言。
我的问题是,执行这些步骤的最佳方式是什么:
1。)不重新发明轮子。显然,我不想手工编写Flex / Bison规范。我是否只是抓住已有的规格并从那里开始工作? Antlr是去往这里的方式吗?
2.。)可扩展为多种语言。很明显,lexing / parsing对每个人来说都是不同的,但是我想要一个可以轻松扩展到其他语言的解决方案。至少有一套技术可以使这个变得易于管理。
BTW,我正在使用C编写我的应用程序
如果有人有任何想法会很棒!谢谢!
答案 0 :(得分:7)
传递解析的最佳方法是ANTLR。作者必须有两本关于这个主题的好书。 The Definitive ANTLR Reference: Building Domain Specific Languages和Language Implementation Patterns都是非常宝贵的资源。 ANTLR可以生成许多不同语言的处理代码。
答案 1 :(得分:3)
由于您将使用已经编写的语法和正则表达式,因此您可以选择使用该工具。
您可以使用 flex / 野牛,您会发现已编写了许多语法。否则,您可以使用 ANTLR ,它可以在没有问题的情况下使用C,C ++和Java,也可以为它做同样的事情。
您没有谈到您将使用哪种语言进行此项工作,因此建议采用更好的方法并非易事。
考虑每种语言都有自己的特性这一事实,例如,与C ++相比,Ruby中的符号表以不同的方式构建。那是因为你可以有更严格或更宽松的声明等等......所以你应该好好考虑一下你需要的东西(你也可以在你的问题中解释它,所以我可以提供更好的帮助)。
在我的两个阶段,我可以说
令牌化非常简单,不需要为每种语言提供不同的结构,并且可以轻松扩展以支持过多的编程语言。
解析可能会更困难。您必须构建程序的抽象语法树,然后对其执行任何操作。如果你喜欢OOP风格,你必须为每个节点类型使用一个类,但是节点类型可以在不同语言之间改变,因为它们在结构上是不同的,所以做一些通用的东西并且很容易扩展到其他语言它非常棘手。< / p>
为此,ANTLR赢得了Flex和Bison,因为它提供了AST的自动生成(如果我记得很清楚的话)。
这两个编译器编译器之间的主要区别在于ANTLR使用 LL(k)解析器(自上而下),而Bison使用 LALR(1)这是自下而上的,但如果你使用已经写好的语法,那应该不那么困难。
个人建议:我写了很多口译员或编译器,但从未使用功能齐全的语言。 C 语法实际上是 big 所以也许你应该从一个子集开始,然后看看你可以用令牌和AST做什么,然后扩展它以支持完整的语法。
答案 2 :(得分:2)
你用什么语言编写程序?
我会选择antlr(实际上我会去解析Java)。它支持许多语言,并且还有许多免费获得的示例语法http://www.antlr.org/grammar/list。不幸的是,它们不一定是完美的(Java语法没有AST规则),但它们给你一个良好的开端,我认为社区对于解析器生成器来说非常大。
除了许多语言目标之外,antlr的优点在于LL(*)与antlr支持的谓词结合使用非常强大且易于理解,并且生成的解析器也是如此。
“可扩展到多种语言”我想你的意思是多种源语言。这并不容易,但我想你可能会在将它们翻译成尽可能多的常用符号并编写可以处理这些语言差异的通用树步行器时取得一些成功。但这可能非常困难。
但是,请注意,一旦您阅读了官方的antlr书并理解LL(*)以及语义和句法谓词,在线文档才会有用。
答案 3 :(得分:1)
你没有指定语言,所以我只推荐我前几天找到的这个小宝石:
它使用起来非常简单,甚至还为几种语言(C#甚至)预先构建了语法。如果你想使用Python作为你的源语言,还有pyparsing(http://pyparsing.wikispaces.com/)。
答案 4 :(得分:-2)
要经历的一扇门就是Eclipse。它具有针对各种语言的解析,包括容错解析。 Eclipse具有内部模块性,允许您在不触及IDE的情况下利用此功能。