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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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函数。