# 2024/02/07 工作日志

> 警告：预处理器已被弃用，其相关文档也已经过时，详情见``工作日志/20240510.md``。——2025/03/02

### 更新了依赖库

本次新增了``FileMap``类，扩充了``stmlib.hpp``、``ArrayList.hpp``。

``stmlib.hpp``主要更新了各种数据类型（诸如``int``、``bool``）转为String的方法。

``ArrayList.hpp``重载了``+``运算符和``+=``运算符（详见源码）。

在stamon中导入一个代码文件，需要输入对应的文件位置。``FileMap``就负责处理这份工作。

当stamon导入一个新的代码文件时会向FileMap进行申请（即调用``AddSource``方法），FileMap会检查这个代码文件是否已经被导入。如果没有，则会标记这个文件“已经被导入过”，并且返回打开这个文件的``LineReader``。（详见``LineReader.cpp``）

### 新增了预处理器

分析一个单独的源码文件，我们可以使用Parser。

但是如果若干个源码互相引用，构建出了一个项目。则需要用预处理器来对整个项目进行分析。

本次新增了``Preprocessor.cpp``和``ParsingQueue.cpp``个文件。

##### 预处理器原理

我们先来看看``ParsingQueue.cpp``。

ParsingQueue类用于Parser和Preprocessor两个类交互数据。这个类存储着带分析的源码。

Preprocessor每次会从ParsingQueue当中弹出一个待分析的源码。并用Parser进行分析。

Parser在分析该源码的过程中，如果要导入新的文件，会把这个文件加入到ParsingQueue中。

由此我们实现了多个文件的编译能力。

##### 怎样使用Preprocessor

* ``Preprocessor(STMException* e)``：构造函数。

* ``ArrayList<SourceSyntax> ParseSource(String origin, bool isSupportImport)``：分析整个源码项目。``origin``为分析的入口文件名（即整个项目的总文件）；``isSupportImport``这个代表这个项目是否支持引用，如果该值为false，代表只支持分析一个源文件，否则代表支持分析多个文件。

* ``ArrayList<String> ErrorMsg``：在分析一个项目的过程中，难免会有多个源文件出现多个报错。这个数组就存储着所有的报错。如果整个项目没有任何报错则该数组为空。

预处理器的具体用法和案例，详见测试样例``test_case/preprocessor/``

##### 使用预处理器的测试样例

预处理器的测试样例位于``test_case/preprocessor/``中。

在该目录当中，附有``code.st``，这是测试用的Stamon代码。当然，你也可以更改code.st，来进行多次调试。

使用样例，应该这么做：

* 将``test_case/preprocessor/test.cpp``覆盖到``test/test.cpp``当中
* 将``test_case/preprocessor/code.st``复制并粘贴到源码根目录当中
* 编译并运行（详见``doc/调试指南.md``）
* 程序运行后，会将生成的AST输出到源码根目录下的``test.ast.txt``

### 接下来要做的事

1. 编写AST的解释器
2. 编写Token和AST的保存功能
3. 完成SFN功能
4. 编写AST的O1优化器