Programming languages 在我的应用程序中标记和解析编程语言的最佳方法

Programming languages 在我的应用程序中标记和解析编程语言的最佳方法,programming-languages,parsing,lexer,Programming Languages,Parsing,Lexer,我正在开发一个工具,可以对程序执行一些简单的转换(比如extract方法)。为此,我必须执行编译的前几个步骤(标记化、解析和可能构建符号表)。我将从C开始,然后希望扩展到支持多种语言 我的问题是,执行以下步骤的最佳方式是什么: 1.)不会重新发明轮子。显然,我不想手工编写Flex/Bison规范。我是否只是抓住已有的规范,然后从那里开始工作?Antlr是去这里的路吗 2.)可扩展到多种语言。显然,词法分析/解析对于每个人都是不同的,但我希望有一个可以轻松扩展到其他语言的解决方案。至少有一套技术可

我正在开发一个工具,可以对程序执行一些简单的转换(比如extract方法)。为此,我必须执行编译的前几个步骤(标记化、解析和可能构建符号表)。我将从C开始,然后希望扩展到支持多种语言

我的问题是,执行以下步骤的最佳方式是什么:

1.)不会重新发明轮子。显然,我不想手工编写Flex/Bison规范。我是否只是抓住已有的规范,然后从那里开始工作?Antlr是去这里的路吗

2.)可扩展到多种语言。显然,词法分析/解析对于每个人都是不同的,但我希望有一个可以轻松扩展到其他语言的解决方案。至少有一套技术可以让这一切变得易于管理

顺便说一句,我正在使用C编写我的应用程序


如果有人有任何想法那就太好了!谢谢

您没有指定语言,所以我只推荐前几天发现的这个小宝石:


它的使用非常简单,甚至为几种语言预先构建了语法(C#even)。如果您想使用Python作为源语言,还有pyparsing()。

进行任何解析的最佳方法是。关于这个问题,作者有两本好书是必备品,而且,两者都是宝贵的资源。ANTLR可以用多种不同的语言生成处理代码。

Eclipse是一道必经之路。它有多种语言的解析,包括容错解析。Eclipse有一个内部模块化,允许您在不接触IDE的情况下利用此功能。

因为您将要使用已经编写好的语法和正则表达式,所以您选择的工具不受影响

你可以使用flex/bison,你会发现许多语法已经编写好了。否则,你可以使用<强> ANTLR ,它应该在C、C++和java上工作,没有问题,也可以做同样的事情。 你没有提到你要用什么语言来完成这项工作,所以建议一个更好的方法并不容易

<> P>想想每种语言都有自己的特点,例如符号表与RC++相比在Ruby中的构造方式不同。那是因为你可以有更严格或更宽松的声明等等。。所以你应该考虑清楚你需要什么(你也可以在你的问题中解释,这样我可以提供更好的帮助)

在你的两个阶段中,我可以这么说

  • 标记化非常简单,不需要每种语言都有不同的结构,并且可以轻松扩展以支持大量编程语言

  • 解析可能更困难。您必须建立程序的抽象语法树,然后对其执行任何操作。如果你喜欢OOP风格,你必须为每种节点类型使用一个类,但是节点类型可以在不同的语言之间改变,因为它们在结构上是不同的,所以做一些通用的、易于扩展到其他语言的事情是相当棘手的

在这一点上,ANTLR战胜了Flex和Bison,因为它提供了自动生成AST(如果我记得很清楚的话)

这两个编译器之间的主要区别在于,ANTLR使用的是LL(k)解析器(自顶向下),而Bison使用的是自下而上的LALR(1),但如果您使用的是已经编写好的语法,那么应该不会那么困难


个人建议:我写了很多口译员或编译器,但从未从一种功能齐全的语言开始。C语法非常大,所以也许你应该从一个子集开始,然后看看你能用令牌和AST做些什么,然后扩展它以支持完整的语法。

你用什么语言编写程序

我会使用antlr(实际上我会解析Java)。它支持多种语言,还提供许多免费的示例语法。不幸的是,它们不一定是完美的(Java语法没有AST规则),但它们给了您一个良好的开端,我认为对于解析器生成器来说,社区是相当大的

除了许多语言目标之外,antlr的优点在于,LL(*)与antlr支持的谓词相结合非常强大,易于理解,并且生成的解析器也非常强大

“可扩展到多种语言”我想你指的是多种源语言。这并不容易,但我想,当您将它们翻译成尽可能多的通用符号的AST,并编写一个能够处理这些语言差异的通用树漫游器时,您可能会取得一些成功。但这可能相当困难


不过,请注意,在线文档只有在您阅读了官方的antlr书籍并理解了LL(*)以及语义和语法谓词之后才是好的。

Ha,对此表示抱歉。我正在使用C。Pyparsing不再托管在wikispaces.com上。这似乎是一种过于复杂的处理方式。使用ide来构建一个实用程序?我不知道Eclipse的代码库,但是如果您可以轻松地提取解析代码,并且已经用Java编写了代码,那么这实际上可能是一个好主意。如果您使用C进行编码,您还可以了解不同语言的gcc前端,因为gcc人员已经投入了大量精力从各种语言的解析器中生成通用表示,因此他们可以为不同语言使用相同的代码生成例程。但是请注意,代码库非常庞大,只需滚动您自己的解析器可能会更容易。不幸的是,antlr不会自动生成AST。您必须为此编写规则,否则会得到一个标记的链接列表作为AST。除此之外,您确实希望编写规则,因为至少对于每种非普通语言,您希望AST中都有抽象节点。给予