定义抽象语法树结构

有的时候真的觉得技术更新换代的太快以致于有些版本不同就会很容易的造成很多错误的产生..历经九九八十一难,才可以成功一个技术点…

下面就简单的讲下抽象语法树的一些概念和定义其的具体结构

抽象语法树是一门编程语言源码的抽象语法结构的树形表示

各种语言组件,例如表达式、条件控制语句等,都有相应的AST,并被区分为操作符和操作数

AST并不表示这些代码如何生成,而是表达了语言组件之间的关系。AST忽略了一些无关紧要的元素比如说标点符号、定界符(空格、换行等)

另外AST中的每个元素都会有一些附加属性,在之后的编译阶段就会有一定的作用,比如说源码行号信息就是这样的一个属性,在进行语法检测遇到语法错误时就可以输出错误代码的行号信息

AST的使用主要就是集中在语义分析阶段,在这个阶段,编译器会检查程序和语言元素是否正确使用

此外,在语义分析阶段编译器还会基于AST生成符号表。完整的树遍历允许验证程序的正确性

在验证正确之后,AST还是代码生成的基础

在生成AST的时候,我们需要运行词法分析器来得到token,我们即将要解析的语言由表达式、函数定义、函数声明组成。而表达式又有很多种类型,包括变量、二元运算符、数值表达式等

我们首先定义一个base类表达式类

//定义一个base类解析表达式
class BaseAST{
    public:
    //虚函数析构函数
    virtual ~BaseAST();
};

接下来我们还需要去定义几个派生类去解析每一种类型的表达式

//变量表达式
class VariableAST :public BaseAST
{
    std::string Var_Name;
    //定义string对象用作存储变量名
    public:
    //变量AST类的含参构造函数由传入构造函数的字符串进行初始化
    VariableAST (std::string &name) :Var_Name(name){}

};

然后就是我们需要去定义数值表达式的AST类

static BaseAST * numeric_parser(){
    BaseAST * result = new NumericAST(Numeric_Val);
    next_token();
    return result;
}

接下来我们再看下二元运算组成的表达式,定义如下所示,其实这里的LHS和RHS,就比如说一个是x*y,LHS就是x,然后Bin_Operator就是*,然后

class BinaryAST:public BaseAST{

    //用于存储二元运算符的string对象
    std::string Bin_Operator;
    //用于存储一个二元表达式的LHS和RHS的对象,由于LHS和RHS二元操作可以是任何类型,因此用BaseAST对象存储
    BaseAST *LHS,*RHS;
    public:
    //初始化二元运算符,二元表达式的LHS和RHS
    BinaryAST (std::string op,BaseAST *lhs,BaseAST *rhs):Bin_Operator(op),LHS(lhs),RHS(rhs){}

};

接下来我们看下函数定义的AST类

class FunctionDeclAST
{
    //函数名
    std::string Func_Name;
    //参数列表
    std::vector<std::string> Arguments;
    public:
    FunctionDeclAST(const std::string &name,const std::vector<std::string> &args):Func_Name(name),Arguments(args){};
};

然后函数的定义就是包括了函数的声明和函数体,所以下面关于函数定义的AST类里面就包含了BaseAST *body

//用于函数定义的AST类的定义如下所示
class FunctionDefnAST {
    FunctionDeclAST * Func_Decl;
    BaseAST * Body;
    public:
    FunctionDefnAST(FunctionDeclAST *proto,BaseAST *body):Func_Decl(proto),Body(body){}
};

对于函数定义的AST类定义如下所示,里面包括了函数名和函数参数列表

//用于函数调用的AST类的定义如下所示
class FunctionCallAST:public BaseAST{
    std::string Function_Callee;
    std::vector<BaseAST *> Function_Arguments;
    public:
    FunctionCallAST(const std::string &callee,std::vector<BaseAST *>&args):Function_Callee(callee),Function_Arguments(args){}
};

上面定义了一些基本语句的AST的类,其实AST类的作用就是将词法分析器得到的token信息保存起来,这些信息包含在语法分析器的逻辑当中,并且会根据当前解析的token类型来填充AST

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值