# 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`，用控制类型这个类型本身标明身份。

### 函数的定义与调用

### 变量的生效范围与作用域

## 关键细节
### 元组
### 函数传参