antlr为c生成ast并解析ast

时间:2011-11-09 06:05:24

标签: c antlr abstract-syntax-tree

我正在对c程序进行静态分析。我搜索了antlr网站,似乎没有合适的语法文件为c程序生成ast。这意味着我必须从一开始就自己做.Or是有一个更快的方法。我还需要一个可以遍历解析器创建的ast的树解析器。

2 个答案:

答案 0 :(得分:4)

您表示您要进行静态分析以检测缓冲区溢出。

首先,为C编写语法比看起来更难。标准中有所有这些东西,然后真正的编译器实际上接受了。而且你必须决定如何处理预处理器(它随编译器的不同而不同!)。如果你没有完全正确的语法和预处理,你将无法解析真正的程序。 (如果你想做玩具语言,那很好,但是你不需要C语法)。

要进行分析,你需要比AST更多的机器。您需要符号表,控制和数据流分析,可能需要局部和全局点分析,调用图提取以及某种类型的范围分析。

人们似乎并不理解这一点。

**使用真正的语言让任何人都可以使用其他任何方法**

我大喊大叫,因为我看到了这个,一遍又一遍。

如果你想继续进行特定的程序分析或转换任务,除非你想在开始任务之前死去,你最好找到一个已经拥有你需要的大部分基础的基础。具有吱吱作响的语法的解析器生成器的基础不是基础。 (不要误解我的意思:ANTLR,YACC,JavaCC都是很好的解析器生成器,它们非常适合构建新语言的解析器。它们非常适合在投资时为实际语言实现生产解析器。但是他们生产解析器,而且大多数人都没有做生产部分。而且他们不会长时间提供额外的机制。)

我们的DMS Software Reengineering Toolkit包含了上述所有机器,因为它几乎总是需要的,而且实施起来很头疼。 (到目前为止,我的团队已经投入了15年。)

我们还实例化了机制是对COBOL and Java, C, C++特别有用的形式(在某种程度上,语言真的很难),在各种方言中,所以其他人不必重复这个过程

对于C和C ++来说,GCC和Clang已经相当成熟了。

答案 1 :(得分:2)

最难的部分是编写语法。混合重写规则来创建AST并不难,并且从发出AST的解析器语法创建树语法也不是 也是如此(与编写解析器语法相比,即)。

这是以前的Q& A,展示了如何创建合适的AST:How to output the AST built using ANTLR?

我找不到一个体面的SO-Q& A来解释如何创建树语法,所以这里是我个人博客的链接,解释了这一点:http://bkiers.blogspot.com/2011/03/6-creating-tree-grammar.html

祝你好运。