upd: update docs
This commit is contained in:
@ -6,19 +6,19 @@
|
|||||||
4. 增加考虑有函数调用时的情况,以链为单位编写、调试自动机
|
4. 增加考虑有函数调用时的情况,以链为单位编写、调试自动机
|
||||||
|
|
||||||
## 模块划分
|
## 模块划分
|
||||||
- `libs`、`generated`、`resources`目录:`libs`目录存放第三方库,其中int2048是我的上个大作业,用以提供大整数运算支持;json是提供json解析支持;clipp是提供命令行参数解析支持。ANTLR框架存放于`generated`、`resources`目录中。
|
- `libs`、`generated`、`resources`目录:`libs`目录存放第三方库,其中int2048是我的上个大作业,用以提供大整数运算支持;json是提供json解析支持,出处<https://github.com/nlohmann/json>;clipp是提供命令行参数解析支持,出处<https://github.com/muellan/clipp>。ANTLR框架存放于`generated`、`resources`目录中。
|
||||||
- `test`目录:存放测试相关,有一个进程级测试调度核心及相关配置文件、数据点,通过ctest_config接入CTest框架使得CTest可以调用进程级测试调度核心
|
- `test`目录:存放测试相关,有一个进程级测试调度核心及相关配置文件、数据点,通过ctest_config接入CTest框架使得CTest可以调用进程级测试调度核心
|
||||||
- `include`目录:裂解器直接相关的头文件
|
- `include`目录:裂解器直接相关的头文件
|
||||||
- `src`目录:裂解器直接相关的实现文件。`main`负责解析命令行参数,解析代码,并访问根节点,同时处理异常;`utils`负责执行类型转换、数据解析等底层工作,保证`Evalvisitor`的简洁性;`names`负责维护变量和函数的注册和调用。
|
- `src`目录:裂解器直接相关的实现文件。`main`负责解析命令行参数,解析代码,并访问根节点,同时处理异常;`utils`负责执行类型转换、数据解析等底层工作,保证`Evalvisitor`的简洁性;`names`负责维护变量和函数的注册和调用。
|
||||||
|
|
||||||
## 主要重难点
|
## 主要重难点
|
||||||
### 数值流
|
### 数据流
|
||||||
#### 数据存储与传递方式
|
#### 数据存储与传递方式
|
||||||
- `bool`:底层实现为内置bool,传递时打包成any统一传递。只在输出时输出`"True"`或者`"False"`
|
- `bool`:底层实现为内置bool,传递时打包成any统一传递。只在输出时输出`"True"`或者`"False"`
|
||||||
- `int`:底层实现为int2048,传递时打包成any统一传递
|
- `int`:底层实现为int2048,传递时打包成any统一传递
|
||||||
- `float`:底层实现为内置double,传递时打包成any统一传递
|
- `float`:底层实现为内置double,传递时打包成any统一传递
|
||||||
- `str`:底层实现为STL,传递时打包成any统一传递
|
- `str`:底层实现为`std::string`,传递时打包成any统一传递
|
||||||
- 元组:底层实现为`std::vector<std::any>`,传递时打包成any统一传递。**注意:函数参数列表要特殊处理**
|
- 元组:底层实现为`std::vector<std::any>`,传递时打包成any统一传递。函数参数列表不视作元组,特殊处理。
|
||||||
- `None`:底层实现为自定义`NoneType`,传递时打包成any统一传递。
|
- `None`:底层实现为自定义`NoneType`,传递时打包成any统一传递。
|
||||||
|
|
||||||
#### 特殊处理
|
#### 特殊处理
|
||||||
@ -26,12 +26,16 @@
|
|||||||
法一:将变量区分引用状态(通过一个专门的类来实现)和值状态,懒求解
|
法一:将变量区分引用状态(通过一个专门的类来实现)和值状态,懒求解
|
||||||
|
|
||||||
### 控制流
|
### 控制流
|
||||||
控制流:在数值(包括None)返回值的基础上,新增一个控制类型的范围值,不添加任何不必要的封装直接存入`std::any`,用控制类型这个类型本身标明身份。
|
控制流:在数值(包括None)返回值的基础上,新增一个控制类型的范围值(break、continue、return共用同一个),传递时打包成any统一传递,用控制类型这个类型本身区分控制流和数据流。
|
||||||
|
|
||||||
### 函数的定义与调用
|
### 函数的定义与调用
|
||||||
|
用一个`FucntionContainer`类管理所有函数,定义时记录参数状况和函数体的地址(存放在结构体`FunctionItem`里面),用`FucntionContainer::AddFunction`注册函数,调用时使用`FucntionContainer::CallFunction`,新开一个栈,把实际参数赋值给形式参数后调用函数体。
|
||||||
|
|
||||||
### 变量的生效范围与作用域
|
### 变量的生效范围与作用域
|
||||||
|
设置全局作用域与局部作用域,全局作用域是一个`std::unordered_map<std::string,std::any>`,局部作用域是一个`std::stack<std::unordered_map<std::string,std::any>>`,两者封装在一个`VariableContainer`类里面,对外提供`CreateFrame`、`DestroyFrame`、`ReadVariable`、`WriteVariable`四个接口。
|
||||||
|
|
||||||
## 关键细节
|
## 关键细节
|
||||||
### 元组
|
### 元组
|
||||||
### 函数传参
|
底层实现为`std::vector<std::any>`,传递时打包成any统一传递。由于区分左右值,因此需要在合适的时候把右值解引用为左值。
|
||||||
|
### 函数传参
|
||||||
|
按照一定规则确定赋值的对应关系,注意要在新建一层栈之前把实际参数从右值解引用为左值,然后调用特殊版的`VariableContainer::WriteVariable`以支持形式参数遮蔽同名全局变量。
|
@ -111,11 +111,13 @@ not
|
|||||||
- 字符串运算符
|
- 字符串运算符
|
||||||
- `str + str` 表示字符串的拼接
|
- `str + str` 表示字符串的拼接
|
||||||
- `str * int` 表示字符串的重复
|
- `str * int` 表示字符串的重复
|
||||||
- `str <= str` 表示字符串的比较,比较规则同 C++ `std::striing`,`>=`, `==`等同理
|
- `str <= str` 表示字符串的比较,比较规则同 C++ `std::string`,`>=`, `==`等同理
|
||||||
- 除法
|
- 除法
|
||||||
- `/` 表示浮点除,即计算结果为浮点数
|
- `/` 表示浮点除,即计算结果为浮点数
|
||||||
- `//` 表示整除,即计算结果为整数。注意无论正负皆**向下取整**,例如 `-5 // 3 = -2`
|
- `//` 表示整除,即计算结果为整数。注意无论正负皆**向下取整**,例如 `-5 // 3 = -2`
|
||||||
- `%` 表示模运算,无论模数的正负,皆定义为:`a % b = a - (a // b) * b`
|
- `%` 表示模运算,无论模数的正负,皆定义为:`a % b = a - (a // b) * b`
|
||||||
|
- 比较
|
||||||
|
- `==` 和 `!=` 会尝试将两边的值转化为相同类型后再进行比较,但并不会转化为 `str` 类型。无法转化时,比较结果为 `False`。
|
||||||
- 连续比较
|
- 连续比较
|
||||||
- 存在 `1<2>3` 这样连续的关系运算符,处理方法是将其拆为相邻的比较并用 `and` 连接但**每个值最多只计算一次**
|
- 存在 `1<2>3` 这样连续的关系运算符,处理方法是将其拆为相邻的比较并用 `and` 连接但**每个值最多只计算一次**
|
||||||
- 如 `a()<b()<c()`,等价于先翻译成 `a()<b() and b()<c()` 再进行计算, `a(),b(),c()` 最多只调用一次(因为短路运算符)
|
- 如 `a()<b()<c()`,等价于先翻译成 `a()<b() and b()<c()` 再进行计算, `a(),b(),c()` 最多只调用一次(因为短路运算符)
|
||||||
@ -237,7 +239,11 @@ func(parameters)
|
|||||||
### 12. 作用域
|
### 12. 作用域
|
||||||
|
|
||||||
作用域相关规则:
|
作用域相关规则:
|
||||||
|
|
||||||
- **与标准 Python 不同,全局变量的生效范围是全部范围**(不用 global 关键字即可访问)
|
- **与标准 Python 不同,全局变量的生效范围是全部范围**(不用 global 关键字即可访问)
|
||||||
|
|
||||||
- **只有函数的调用会产生新的作用域**,作用域的产生请参考 Python
|
- **只有函数的调用会产生新的作用域**,作用域的产生请参考 Python
|
||||||
|
|
||||||
- 没有代码块级作用域,变量注销只发生在函数级作用域退出时
|
- 没有代码块级作用域,变量注销只发生在函数级作用域退出时
|
||||||
|
|
||||||
- 全局作用域无需global即可访问,因此,局部变量覆盖全局变量的唯一方式是通过函数参数列表覆盖。
|
- 全局作用域无需global即可访问,因此,局部变量覆盖全局变量的唯一方式是通过函数参数列表覆盖。
|
||||||
|
Reference in New Issue
Block a user