antlr为c生成ast并解析ast

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

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

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

要进行分析,您需要的机器远远多于AST。 您将需要符号表,控制和数据流分析,可能需要本地和全局点分析,调用图提取和某种类型的范围分析。

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

**使用真正的语言,让任何人都可以通过任何方式使用PARSER **

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

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

我们的DMS软件再造工具包包含上述所有机器,因为它几乎总是需要,并且实施起来是一件令人头痛的问题。 (到目前为止,我的团队已经投入了15年。)

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

GCC和Clang作为替代品在C和C ++方面非常成熟。

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

这是一个先前的问答,展示了如何创建一个合适的AST: 如何输出使用ANTLR构建的AST?

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

祝好运。