c - antlr 为 c 生成 ast 并解析 ast

标签 c antlr abstract-syntax-tree

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

最佳答案

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

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

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

人们似乎不明白这一点。

** 获得解析器距离用真实语言做任何有用的事情还有很长的路要走**

我之所以大喊大叫,是因为我一遍又一遍地看到这个。

如果您想继续进行特定的程序分析或转换任务,除非您想在开始任务之前就老死,否则最好找一个已经拥有大部分所需内容的基金会。语法不稳定的解析器生成器的基础不是基础。 (不要误会我的意思:ANTLR、YACC、JavaCC 都是很好的解析器生成器,它们非常适合为新语言构建解析器。当投资完成时,它们非常适合为真正的语言实现生产解析器。但他们生产解析器,而且大多数人不做生产部分。而且他们根本不提供额外的机器。)

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

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

GCC 和 Clang 作为 C 和 C++ 的替代品已经相当成熟。

关于c - antlr 为 c 生成 ast 并解析 ast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8061011/

相关文章:

pattern-matching - 模式匹配中的 OCaml 多态变体

c++ - 如何在 Clang AST 中的 SourceLocation 之后找到字符的 SourceLocation?

dynamic - 假设你有一个 AST,编写一种解释性语言有多难?

c++ - 使用 Python.h 从 C++ 调用 Django

c - 为什么需要 int 类型来处理 EOF 和 getchar() 的返回?

parsing - 赋值为 Antlr 语法中的表达式

python - 能否修改 ANTLR 语法文件以供 PLY 使用?

parsing - 如何使用 ANTLR 正确解析泛型类型?

c - 删除后在C中的链接列表中显示

c - 这种字符串检索方法有什么缺点吗?