如何为专有语言构建AST?

时间:2010-12-18 08:58:34

标签: static-analysis abstract-syntax-tree

我试图了解如何为专有语言构建AST。我需要构建一个AST,以便我可以提供我的规则和指南,以检查源代码中可能存在的错误。

如何构建AST?是否有任何书籍,文章可以帮助我开始。关于编译器的龙书会有帮助吗?。

请注意我来自非CS背景。

由于

2 个答案:

答案 0 :(得分:2)

这是一个非常大的问题。我确实感受到了你的痛苦,因为我也从非CS背景中解决了这个问题。这让我更加欣赏CS。

你可能会在研究中看到很多东西是Extended Backus-Naur Form(EBNF)。它基本上是一种描述你的语言的方式。为您的语言创建EBNF将帮助您了解计算机解析它所需要做的事情,这将有所帮助。

回到手头的问题:你可能会使用词法分析器/解析器来构建你的树。

用于做到这一点的传统工具是lex和yacc,或者他们更现代的表兄弟flex和bison。

更新的方法是Antlr。它强烈推荐,但我的头脑。

我找到的第三种方法是Python的pyparsing库。由于我对Python的熟悉以及它描述你需要解析的内容的可读方式,这是我最终选择的那个。

plenty of examples可用于pyparsing,这有帮助。我发现最有帮助的构建我的解析器的是SimpleCalc。但是,它基于相当旧版本的pyparsing,并且它比后来实现的pyparsing的一些强大操作需要更复杂。 SimpleArith是一个类似但更新的版本。

我还没有实际处理过pyparsing的一件事是正确分析语法错误。但是,它似乎为您提供了必要的工具。

无论如何,这对你的问题并不是一个完整的答案,但我希望它至少能指出你在几个地方开始。为复杂语言构建解析器并不容易!

答案 1 :(得分:1)

代码分析引擎通常需要相当多的复杂性,而不仅仅是构建AST。

要进行任何严格的代码分析,您需要知道代码中标识符的含义以及定义它们的位置/方式(“符号表”),并且您经常需要知道信息如何在程序中传播(控制和数据)流动分析)。您需要机器来支持所有这些,然后您需要将该机制与您的专有语言联系起来。

我认为攀登珠穆朗玛峰是一个类比。获得AST就像进入10,000英尺的大本营一样。任何土块都可以通过使用基本技术(登山靴)走上山来做到这一点。攀登最后17,000英尺需要一种完全不同的技术,承诺和计划,大多数人走上前10,000英尺,对旅行的其余部分毫无准备。 (我在这里有一些经验,检查我的生物)。

这些都是非常详细的主题,你缺乏CS背景将使你的道路可能相当粗糙。 (然而,我们都从某个地方开始,所以这真的是野心问题)。龙书是一个很好的资源,可以帮助您了解所有这些机器的作用以及您需要它的原因;许多其他优秀的编译器书籍存在,通常也会提供。但是你需要准备好做一些认真的阅读。

启动曲线的一种方法是使用一种工具,其中大部分机器已经为您考虑并实施,由一群在构建此类工具方面经验丰富的计算机科学家。然后你的问题大大减少了:你只需要学习如何使用他们提供的东西,而不是试图弄清楚你需要什么(大多数人永远不会超过AST阶段)并实施所有必要的支持机制。

ANTLR(已经提到过,由一位非常优秀的CS教授完成)是一种,因为它提供了解析功能,使您能够定义AST的构建方式,以及如何在程序上爬过生成的AST。但它并没有提供你需要的任何其他任务。

我们的DMS Software Reengineering Toolkit提供了我在第一段中提到的所有设施,然后提供了一些设施。您将注意到使用DMS的第一个差异之一是您只需要提供语法;它将构建AST而无需您的任何进一步帮助。

您可以在此example of DMS applied to high school algebra and calculus了解使用DMS的内容。特别是,它显示了如何只使用简单的代数/微积分语法来定义,然后可以操纵该语言中的“程序”。这个应用程序是“转换”代码而不是分析它的应用程序,但基础知识是相同的。

分析您的专有语言的“真实”DMS应用程序将会复杂得多。

相关问题