# 预处理器文档

* 注意：该文档已过时！

分析一个单独的源码文件，我们可以使用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``

> ——摘自``工作日志/20240207.md``