前言
这个编译原理是一个系列,系列地址为: https://blog.csdn.net/lpstudy/article/category/937055
考虑到很多小伙伴咨询代码的问题,现把链接发出来:https://github.com/lpstudy/compile
这个链接里面具有这个系列所有的VS工程和代码,工程是按照系列中的一个教程环境配置6来配置的,不过lib我好像没有上传到github。
如果大家发现任何问题,可以在github或者csdn,我有空的时候完善一下,争取做到下载github工程即可跑。
简介
本章讲述的是编译树的实现,它包含树节点,树的构建,树的遍历三个部分。利用编译树,我们可以构建基本的运算节点以及数字节点,然后遍历树的过程就是执行算术运算的过程。
例如如下的一棵树
叶子节点和分支节点都是一个个的Node,它具有不同的类型(运算符和数字)。
代码如下
#include <iostream>
#include <malloc.h>
using namespace std;
#define MAX_CHILDREN 4
int my_mem[100]; // “内存”
int offset;
enum // 结点类型——kind
{
STMT_NODE = 0,
EXPR_NODE,
DECL_NODE
};
enum // 语句结点子类型——kindkind
{
IF_STMT = 0,
WHILE_STMT,
INPUT_STMT,
PRINT_STMT,
COMP_STMT
};
enum // 表达式结点子类型——kindkind
{
TYPE_EXPR = 0,
OP_EXPR,
NOT_EXPR,
ARRAY_EXPR,
CONST_EXPR,
ID_EXPR
};
enum // 声明结点子类型——kindkind
{
VAR_DECL = 0,
ARRAY_DECL
};
enum // 运算——op
{
PLUS = 0,
MINUS
};
enum
{
Integer = 0,
};
union NodeAttr {
int op; // 表达式结点&#