You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

473 lines
7.1 KiB

1 year ago
# AST
**源码链接:**
[SyntaxTree.h](../include/SyntaxTree.h)
[SyntaxTree.cpp](../src/SyntaxTree.cpp)
## 目录
[Ptr](#ptr)
[PtrLst](#ptrlist)
[Position](#position)
[Type](#type)
[Binop](#binop)
[UnaryOp](#unaryOp)
[UnaryCondOp](#unarycondop)
[BinaryCondOp](#binarycondop)
[Node](#node)
[Assembly](#assembly)
[InitVal](#initval)
[GlobalDef](#globaldef)
[FuncDef](#funcdef)
[VarDef](#vardef)
[Stmt](#stmt)
[AssignStmt](#assignstmt)
[ReturnStmt](#returnstmt)
[BlockStmt](#blockstmt)
[EmptyStmt](#emptystmt)
[ExprStmt](#exprstmt)
[Expr](#expr)
[CondExpr](#condexpr)
[AddExpr](#addexpr)
[UnaryCondExpr](#unarycondexpr)
[BinaryCondExpr](#binarycondexpr)
[BinaryExpr](#binaryexpr)
[UnaryExpr](#unaryexpr)
[LVal](#lval)
[Literal](#literal)
[FuncCallStmt](#funccallstmt)
[FuncParam](#funcparam)
[FuncFParamList](#funcfparamlist)
[IfStmt](#ifstmt)
[WhileStmt](#whilestmt)
[BreakStmt](#breakstmt)
[ContinueStmt](#continuestmt)
[Visitor](#visitor)
## Ptr
AST中使用的指针类型。实际上是`std::shared_ptr`
## PtrList
存放[Ptr](#ptr)的list实际上是`std::vector<Ptr>`
## Position
该节点代表的语法结构在源文件的位置信息,实际上是`yy::location`。由bison/flex自动生成。
## Type
包含SysY语言支持的数据类型`Type::INT`以及`Type::VOID`。
多出的`Type::STRING`类型用作系统调用的参数类型,`Type::BOOL`作为条件表达式类型。
## Binop
双目算术表达式的操作符。包含
`Binop::PLUS`
`Binop::MINUS`
`Binop::MULTIPLY`
`Binop::DIVIDE`
`Binop::MODULO`
## UnaryOp
单目算术表达式操作符,包含
`UnaryOp::PLUS`
`UnaryOp::MINUS`
## UnaryCondOp
单目条件表达式操作符,包含
`UnaryCondOp::NOT`
## BinaryCondOp
双目条件表达式操作符,包含
`BinaryCondOp::LT`小于
`BinaryCondOp::LTE`小于等于
`BinaryCondOp::GT`大于
`BinaryCondOp::GTE`大于等于
`BinaryCondOp::EQ`等于等于
`BinaryCondOp::NEQ`不等于
`BinaryCondOp::LAND`逻辑与
`BinaryCondOp::LOR`逻辑或
## Node
语法树所有结点的基类,
`Node::loc`是其在对应源文件的位置信息。类型为[Position](#position)
`virtual void Node::accept(Visitor &visitor)`为虚函数,用于访问者模式,接受一个[Visitor](#visitor)。需要进行重写。
## Assembly
AST的根结点
[PtrList](#ptrlist)<[GlobalDef](#globaldef)> `Assembly::global_defs`存放所有[GlobalDef](#globaldef)指针。
## InitVal
代表初值的结点。该结点为嵌套定义。以下类型的变量初值均可表示:
```c++
int a = 1 + 1;
int b[2] = {1,2};
int c[2][2] = {{1,2},{3,4}}
...
```
`bool InitVal::isExp`
为真时初值为[Expr](#expr)类型。为假时代表以`{...}`的形式进行赋初值
eg
```c++
int a = 3 + 1;//isExp=true
int c[2][2] = {{1,2},{3,4}};//isExp=false
```
所有`InitVal`结点最底层一定是[Expr](#expr)类型。也即`isExp`为true
[PtrList](#ptrlist)<[InitVal](#initval)> `InitVal::elementList`
当`isExp`为false时该域才有意义。是包含`{}`中其余`InitVal`结点指针的列表。
[Ptr](#ptr)<[Expr](#expr)> `InitVal::expr`
当`isExp`为true时该域才有意义。一个初值表达式的指针。
## GlobalDef
所有def结点的基类
## FuncDef
代表函数定义。
[Type](#type) `FuncDef::ret_type`
函数的返回值类型
[Ptr](#ptr)<[FuncFParamList](#funcfparamlist)> `FuncDef::param_list`
函数的形参指针
`std::string FuncDef::name`
函数名
[Ptr](#ptr)<[BlockStmt](#blockstmt)> `FuncDef::body`
函数体指针
## VarDef
代表变量定义
`bool VarDef::is_constant`
是否为常量
[Type](#type) `VarDef::btype`
变量类型(在sysY中只能是int)
`std::string VarDef::name`
变量名
`bool VarDef::is_inited`
是否初始化
[PtrList](#ptrlist)<[Expr](#expr)> `VarDef::array_length`
若为数组,则是存放各维长度表达式指针的列表,否则为空
[Ptr](#ptr)<[InitVal](#initval)> `VarDef::initializers`
若初始化,则是指向初值定义的指针
## Stmt
所有statement的基类
## AssignStmt
表示如下类型的语句:
```c++
target = value
```
即赋值型语句
[Ptr](#ptr)<[Lval](#lval)> `AssignStmt::target`
赋值表达式的左值指针
[Ptr](#ptr)<[Expr](#expr)> `AssignStmt::value`
赋值表达式右边表达式指针
## ReturnStmt
代表return 语句
[Ptr](#ptr)<[Expr](#expr)> `ReturnStmt::ret`
return 语句返回的表达式指针。空指针代表void return
## BlockStmt
代表使用`{}`括起来的stmt。
[PtrList](#ptrlist)<[Stmt](#stmt)> `BlockStmt::body`
该block中所有stmt指针的列表
## EmptyStmt
空语句
## ExprStmt
表达式语句
[Ptr](#ptr)<[Expr](#exp)> `ExprStmt::exp`
表达式语句对应表达式的指针
## Expr
所有表达式的基类
## CondExpr
所有条件表达式的基类
## AddExpr
所有算术表达式的基类
## UnaryCondExpr
单目条件表达式
`UnaryCondOp UnaryCondExpr::op`
操作符
[Ptr](#ptr)<[Expr](#expr)> `UnaryCondExpr::rhs`
操作符右端表达式指针
## BinaryCondExpr
双目条件表达式
`BinaryCondOp BinaryCondExpr::op`
操作符
[Ptr](#ptr)<[Expr](#expr)> `BinaryCondExpr::lhs, rhs`
操作符左右两端表达式指针
## BinaryExpr
双目算术表达式
`BinOp BinaryExpr::op`
操作符
[Ptr](#ptr)<[Expr](#expr)> `BinaryExpr::lhs, rhs`
操作符左右两端表达式指针
## UnaryExpr
单目算术表达式
`UnaryOp UnaryExpr::op`
操作符
[Ptr](#ptr)<[Expr](#expr)> `UnaryExpr::rhs`
操作符右端表达式指针
## LVal
左值表达式
`std::string Lval::name`
变量名
[PtrList](#ptrlist)<[Expr](#expr)> `LVal::array_index`
数组索引的指针列表。若不是数组,则为空
## Literal
语义值类型,包含整数和字符串
`bool Literal::is_int`
是否为整形
`int Literal::int_const`
整数语义值
`std::string Literal::str`
字符串语义值(未处理转义)
## FuncCallStmt
函数调用
`std::string FuncCallStmt::name`
被调用的函数名
[PtrList](#ptrlist)<[Expr](#expr)> `FuncCallStmt::params`
存放函数实参表达式指针的列表
## FuncParam
单个函数形参
`std::string FuncParam::name`
形参名
[Type](#type) `FuncParam::param_type`
形参类型
[PtrList](#ptrlist)<[Expr](#expr)> `FuncParam::array_index`
形参的数组维度列表,存放每一维的表达式指针。若非数组则为空
## FuncFParamList
存放一个函数的所有形参
[PtrList](#ptrlist)<[FuncParam](#funcparam)> `FuncFParamList::params`
存放所有形参指针的列表
## IfStmt
表示如下结构:
```c++
if(cond_exp)
if_stmt
if(cond_exp)
if_stmt
else
else_stmt
```
[Ptr](#ptr)<[Expr](#expr)> `IfStmt::cond_exp`
cond_exp的指针
[Ptr](#ptr)<[Stmt](#stmt)> `IfStmt::if_statement`
if_stmt的指针
[Ptr](#ptr)<[Stmt](#stmt)> `IfStmt::else_statement`
else_stmt的指针(若无else则为空)
## WhileStmt
表示如下结构
```c++
while(cond_exp)
stmt
```
[Ptr](#ptr)<[Expr](#expr)> `WhileStmt::cond_exp`
cond_exp的指针
[Ptr](#ptr)<[Stmt](#stmt)> `WhileStmt::statement`
stmt的指针
## BreakStmt
表示一个break语句
## ContinueStmt
表示一个continue语句
## Visitor
访问者模式的基类用于访问AST。需要重写其中的visit函数。