Tag: abstract syntax tree

来自带有预处理程序指令的c代码的AST

如何从gcc C代码构建AST(抽象语法树)以进行一些转换,如下所示,然后再将代码重新生成(生成)到C语法? if(condition_1){ //lines of code 1 } #ifdef expression_1 else if(condition_2){ //lines of code 2 } #endif 成 bool test = condition_1; if(teste){ //lines of code 1 } #ifdef expression_1 if(!(test) && condition_2){ //lines of code 2 } #endif

什么是AST,CFG,CLANG,我们如何在死码去除算法中使用它?

我将使用C语言为我们的团队编写一个用于在线事件的死代码删除算法。 要求是…… 读取C程序源文件,其中包含多种forms的死代码。 我们的输出应该是一个文件,它没有任何死码。 在浏览互联网时,我们遇到了SO链接…… 我怎么知道代码中的哪些部分从未使用过? 传统C / C ++项目中的死代码检测 在看到这些链接之前,我们有了基本的想法……使用普通文件流逐行读取输入C文件并存储在字符串数组中。 然后分析这些字符串并确定非常基本的死代码,如if(0)和if(1)等。并制作一个堆栈,用于维护括号。 还有更多…… 但这有一个很大的问题,这个想法将引导我们用字符串操作做更多事情,而不是删除死码。 但看到这些链接后…我们开始了解Clang库,抽象语法树,控制流图等… 但我们对这些图书馆和那些概念都是新手。 我们开始知道它们用于解析C代码。 因此,我们需要一些关于AST,CFG和一些基本指导的基本想法,解释我们如何在我们的代码中使用它… 我们可以将clang库作为像math.h这样的普通库包含在内吗? 我们在哪里可以下载该库? 我们可以在Windows中使用那些Clang库吗?

如何将未经处理的C / C ++源转换为语法树(以及返回)?

我希望在这之间有一个转换器 #include #ifdef HAVE_QQQ #include #endif char* ololize(char* s) { #ifdef HAVE_QQQ return qqq(s); #else return ololo(s); #endif } 和这样的事情 (include_angular “ololo.h”) (p_ifdef “HAVE_QQQ” (include_angular “qqq.h”)) (define_function “ololize” [(ptr char) “s”] (ptr char) (p_ifdef “HAVE_QQQ” (return (qqq s)) :else (return (ololo s))))) 即将源代码表示为易于管理的树,而不是从编译器的角度来看,而是从程序员的角度来看。 我不希望100%正确的工作,但它应该适用于大多数现有的源文件。 如果我可以将代码“往返”到树和返回,则可以获得奖励积分。 有没有现有的工具或库?

在C中表示抽象语法树

我正在C中为一个简单的玩具语言实现一个编译器。我有一个工作的扫描器和解析器,以及AST的概念function/构造的合理背景。 我的问题与在C中表示AST的具体方式有关。我在网上不同的文本/资源中经常遇到三种风格: 每种节点一个结构。 它有一个基节点“class”(struct),它是所有子结构中的第一个字段。 基节点包含一个存储节点类型的枚举(常量,二元运算符,赋值等)。 使用一组宏访问结构的成员,每个结构一个集。 它看起来像这样: struct ast_node_base { enum {CONSTANT, ADD, SUB, ASSIGNMENT} class; }; struct ast_node_constant { struct ast_node_base *base; int value; }; struct ast_node_add { struct ast_node_base *base; struct ast_node_base *left; struct ast_node_base *right; }; struct ast_node_assign { struct ast_node_base *base; struct ast_node_base *left; struct ast_node_base *right; }; #define CLASS(node) ((ast_node_base*)node)->class; […]

推荐保留预处理器指令的C前端

我想开始一个涉及转换C代码的项目,但我想要包含预处理器指令。 我不想通过编写自己的C解析器重新发明轮子,所以有人知道可以解析C预处理器和C代码的前端,并产生一个可以用来重新生成的AST(或者漂亮的 -打印)原始来源? 例如,: #define FILENAME “filename” #include FILE *f=0; … if (file_is_open) { #ifdef CAN_OPEN_IT f = fopen(FILENAME, “r”); #else printf(“Unable to open file.\n”); #endif } 应将上述代码解析为一些可用于重新生成源的内存中表示。 换句话说,它不应该在两个阶段中作为普通C处理,首先处理PP指令然后解析纯C代码。 相反,它应该代表整个编译时逻辑,包括预处理器变量。

如何利用Clang的AST?

我正在考虑将Clang的AST用于我的C代码并对AST进行一些分析。 关于从哪里开始,如何获得Clang的AST,教程或这方面的任何内容的一些指示将是非常有帮助的! 我一直试图找到一些,我得到了这个链接 ,这是2年前创建的。 但由于某种原因,它不适合我。 教程中的示例代码给了我太多错误。 所以我不确定,如果我正确构建代码或者教程有些问题。 但我也很乐意从其他一些页面开始。

如何在程序中自动插入编译指示

我需要编写一个可以接受C代码并将pragma放在某些函数之上的工具。 哪个编译器框架最容易完成这样的任务。 如果你能提供一个例子,我真的很感激。

antlr为c生成ast并解析ast

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