我有一个爱好项目的想法,它执行一些代码分析和操作。该项目将需要给定源文件的具体和抽象语法树。此外,两棵树之间的双向参考将是有帮助的。我想避免转录语法来构建自己的词法分析器和解析器。
是否有用于描述具体或抽象语法树的标准格式? 是否有任何广泛使用的工具链支持输出这些格式?
我没有考虑特定的目标编程语言。任何流行的都可以用于原型,但我更喜欢我熟悉的:Python,C#,Javascript或C / C ++。
我希望能够通过工具或库运行源文件并返回两棵树。在理想的世界中,在用户编辑的代码上运行此工具并容忍错误是可行的。同样,我只是想开发一个原型,所以这些要求非常宽松。
谢谢!
答案 0 :(得分:4)
研究界决定,在将信息从一个程序分析工具移动到另一个程序分析工具时,图形交换是正确的。 见http://www.gupro.de/GXL
最近,OMG定义了一种交换抽象语法树的标准。 见http://www.omg.org/spec/ASTM/1.0/Beta1/
这个问题好像一遍又一遍地解决了。 多年来,有六个“工具总线”提案 这一切都解决了它,没有人超越这个行业。 问题是a)使用表示AST很容易 任何可嵌套的符号[像LISP这样的括号, 像XML,...]所以人们可以轻松地推出自己的解决方案, 和b)一个工具与另一个工具交换AST,他们 两者都必须基本同意AST节点的含义; 但大多数AST都是偶然从特定的 每个工具使用的语法/解析技术,并且有 几乎总是在工具之间存在分歧。 所以,我看到很少有工具可以有意义地交换AST。
如果你正在做一个爱好的事情,我会坚持使用类似lisp的东西 树的编码,其中每个节点具有以下格式: (...) 它易于生成,易于阅读。
我在professional tool to manipulate programs工作。要是我们 打印出AST,我们做了以上。主要是个人 AST在实践中看起来太复杂了, 所以我们几乎不打印出整个AST 一个节点和几个孩子深。我们的工具不交换 ASTs与任何人(见上述原因:),但只是 在内存中精心构建它,用它做一些奇怪的事情 出于分析原因或转换原因,然后 要么只是删除它(无需将其发送到任何地方) 或者从树中重新生成原始语言文本。 [后者意味着你需要反解析或“漂亮印刷” 技术]
答案 1 :(得分:3)
在our project中,我们在UML中定义了AST元模型,并使用ANTLR(Java)来填充模型。我们还在解析后维护来自ANTLR的令牌信息,但我们还没有尝试通过对模型进行修改来更新基础文本文件。
这有一个可怕的开销(在基础架构中,例如Eclipse UML2 / EMF),但我们的目标是使用基于模型/驱动开发(MDD,MDA)的高级工具,所以我们决定使用它每个级别。
我认为我们的一个学生曾经使用OpenArchitectureWare并且设法从基于Eclipse的生成的编辑器自动更改回语法树(与上面的UML模型无关),但我不知道我知道有关这方面的细节。
您可能还想查看ANTLR's树语法。
答案 2 :(得分:1)
特定标准是一种期望,而更通用的标准也可能是合适的。 Ira Baxter已经提到了GXL,并且RDF也可能被添加,只是它需要一个合适的本体并且更倾向于语义而不是语法。仍然可能是一个调查选项。
对于特定的标准,Ira Baxter已经提到ASTM,另一个,虽然它更倾向于针对特定类型的编程语言(逻辑语言),但是a standard for semantic/conceptual graph,称为ISO‑IEC 24707 2007。
不是自己的标准,而是关于此问题的论文:Towards Portable Source Code Representations Using XML 。
我不知道任何有效使用的标准(在这个领域,到处都是自制的烹饪),我对这个话题也很感兴趣。