37 lines
2.3 KiB
Markdown
37 lines
2.3 KiB
Markdown
# python裂解器设计思路——ZYM
|
||
## 开发步骤
|
||
1. 编写底层工具,并测试(函数调用相关的简单测试)。
|
||
2. 在不考虑函数调用的情况下,以链为单位编写、调试自动机
|
||
3. 测试函数相关的底层工具
|
||
4. 增加考虑有函数调用时的情况,以链为单位编写、调试自动机
|
||
|
||
## 模块划分
|
||
- `libs`、`generated`、`resources`目录:`libs`目录存放第三方库,其中int2048是我的上个大作业,用以提供大整数运算支持;json是提供json解析支持;clipp是提供命令行参数解析支持。ANTLR框架存放于`generated`、`resources`目录中。
|
||
- `test`目录:存放测试相关,有一个进程级测试调度核心及相关配置文件、数据点,通过ctest_config接入CTest框架使得CTest可以调用进程级测试调度核心
|
||
- `include`目录:裂解器直接相关的头文件
|
||
- `src`目录:裂解器直接相关的实现文件。`main`负责解析命令行参数,解析代码,并访问根节点,同时处理异常;`utils`负责执行类型转换、数据解析等底层工作,保证`Evalvisitor`的简洁性;`names`负责维护变量和函数的注册和调用。
|
||
|
||
## 主要重难点
|
||
### 数值流
|
||
#### 数据存储与传递方式
|
||
- `bool`:底层实现为内置bool,传递时打包成any统一传递。只在输出时输出`"True"`或者`"False"`
|
||
- `int`:底层实现为int2048,传递时打包成any统一传递
|
||
- `float`:底层实现为内置double,传递时打包成any统一传递
|
||
- `str`:底层实现为STL,传递时打包成any统一传递
|
||
- 元组:底层实现为`std::vector<std::any>`,传递时打包成any统一传递。**注意:函数参数列表要特殊处理**
|
||
- `None`:底层实现为自定义`NoneType`,传递时打包成any统一传递。
|
||
|
||
#### 特殊处理
|
||
数值流在出现赋值时如何兼容左右值。
|
||
法一:将变量区分引用状态(通过一个专门的类来实现)和值状态,懒求解
|
||
|
||
### 控制流
|
||
控制流:在数值(包括None)返回值的基础上,新增一个控制类型的范围值,不添加任何不必要的封装直接存入`std::any`,用控制类型这个类型本身标明身份。
|
||
|
||
### 函数的定义与调用
|
||
|
||
### 变量的生效范围与作用域
|
||
|
||
## 关键细节
|
||
### 元组
|
||
### 函数传参 |