static struct ast_node *ir_visit_ast_node(struct ast_node *node) { // 非法节点 if (nullptr == node) { return nullptr; } bool result = true; switch (node->type) { case AST_OP_NULL: // 叶子节点 result = ir_leaf_node(node); break; case AST_OP_MUL: // 乘法节点 result = ir_mul(node); break; case AST_OP_ADD: // 加法节点 result = ir_add(node); break; case AST_OP_EXPR: // 表达式结点,不显示表达式的值 // 由于不显示值,并且不支持赋值操作,都是右值操作,这里什么都不做 result = ir_show(node, false); break; case AST_OP_EXPR_SHOW: // 表达式结点,显示表达式的值 result = ir_show(node, true); break; case AST_OP_ASSIGN: // 赋值语句 result = ir_assign(node); break; case AST_OP_BLOCK: // 多个语句组成的块 result = ir_block(node); break; // TODO 其它运算符支持追加,同时增加表达式运算函数调用 //add_no2:sub case AST_OP_SUB: //减法节点 result = ir_sub(node); break; default: // 错误,不支持 result = false; break; } // 语义解析错误,则出错返回 if (!result) { node = nullptr; } return node; }这是在干嘛
时间: 2023-12-06 18:42:20 浏览: 80
queue_using_linkedlist.zip_Linux/Unix编程_Unix_Linux_
这段代码是对抽象语法树(AST)进行遍历,根据节点类型调用不同的代码生成函数生成中间代码。具体来说:
- 对于叶子节点,调用 ir_leaf_node() 生成对应的中间代码。
- 对于乘法节点,调用 ir_mul() 生成对应的中间代码。
- 对于加法节点,调用 ir_add() 生成对应的中间代码。
- 对于表达式节点,根据是否需要显示表达式的值,调用 ir_show() 生成对应的中间代码。
- 对于赋值语句节点,调用 ir_assign() 生成对应的中间代码。
- 对于多个语句组成的块节点,调用 ir_block() 生成对应的中间代码。
- 对于不支持的节点类型,返回错误。
最后返回处理后的节点。这段代码的作用是将 AST 转换为中间代码,用于后续的编译和执行。
阅读全文