7

我有一个爱好项目的想法,该项目执行一些代码分析和操作。该项目将需要给定源文件的具体和抽象语法树。此外,两棵树之间的双向引用会很有帮助。我想避免转录语法来构建我自己的词法分析器和解析器的工作。

是否有描述具体或抽象语法树的标准格式?是否有任何广泛使用的工具链支持输出到这些格式?

我没有考虑特定的目标编程语言。任何流行的原型都可以,但我更喜欢我熟悉的原型:Python、C#、Javascript 或 C/C++。

我希望能够通过工具或库运行源文件并取回两棵树。在理想情况下,在代码上运行该工具是可行的,因为它正在由用户编辑并且可以容忍错误。同样,我只是想开发一个原型,所以这些要求非常宽松。

谢谢!

4

3 回答 3

4

研究界认为,将信息从一种程序分析工具转移到另一种时,图形交换是正确的做法。见http://www.gupro.de/GXL

最近,OMG 定义了一个交换抽象语法树的标准。见http://www.omg.org/spec/ASTM/1.0/Beta1/

这个问题似乎一次又一次地得到解决。多年来提出的六种“工具巴士”提案都解决了这个问题,但没有人超越这个行业。问题在于 a) 使用任何类型的可嵌套表示法 [括号如 LISP,如 XML,...] 来表示 AST 都很容易,因此人们可以轻松推出自己的解决方案,并且 b) 一个工具可以与另一个交换 AST ,他们都必须在 AST 节点的含义上达成基本一致;但是大多数 AST 都是偶然地从每个工具使用的特定语法/解析技术中衍生出来的,而且工具之间几乎总是存在分歧。所以,我见过很少有工具可以有意义地交换 AST。

如果你在做一个爱好,我会坚持使用类似于 lisp 的树编码,其中每个节点都具有以下格式: ( ... ) 它易于生成且易于阅读。

我致力于使用专业工具来操作程序。如果我们已经打印出 AST,我们就执行上述操作。在实践中,大多数单个 AST 都过于复杂,因此我们几乎不会打印出整个 AST,最多只有一个节点和几个子节点。我们的工具不与任何人交换 AST(见上述原因:),但可以很好地在内存中构建它,出于分析原因或转换原因用它做一些奇怪的事情,然后要么删除它(无需将其发送到任何地方)或从树中重新生成原始语言文本。[后者意味着你需要反解析或“prettyprinting”技术]

于 2009-06-21T09:37:16.767 回答
3

我们的项目中,我们在 UML 中定义了 AST 元模型,并使用 ANTLR (Java) 来填充模型。我们还在解析后维护来自 ANTLR 的令牌信息,但我们尚未尝试使用对模型进行的修改来更新底层文本文件。

这有一个可怕的开销(在基础设施中,例如 Eclipse UML2/EMF),但我们的目标是无论如何都要使用高级工具进行基于模型/驱动的开发(MDD、MDA),所以我们决定在每个级别上都使用它.

我想我们的一个学生曾经玩过OpenArchitectureWare并设法将基于 Eclipse 的生成编辑器自动返回到语法树(与上面的 UML 模型无关),但我不知道这方面的细节。

您可能还想查看ANTLR 的树语法。

于 2009-02-17T09:49:58.447 回答
1

具体标准是一种预期,而更通用的标准也可能是合适的。Ira Baxter 已经提到了GXL,并且可能还会添加RDF,只是它需要适当的本体并且更面向语义而不是语法。仍然可能是调查的一种选择。

对于特定标准,Ira Baxter 已经提到了ASTM,另一个虽然它更针对一种特定类型的编程语言(逻辑语言),但它是语义/概念图的标准,称为ISO-IEC 24707 2007

它本身不是一个标准,而是一篇关于这个问题的论文:Towards Portable Source Code Representations Using XML

我不知道任何有效使用的标准(在这个领域,到处都是自制的烹饪),我也对这个话题感兴趣。

于 2014-07-16T20:31:30.223 回答