# 2024/02/05 工作日志

### 修复了一些bug

主要修复了``src/ast``中一些小瑕疵。

### 更新了依赖库

首先，新增了行阅读器（``LineReader``类）。

LineReader用于逐行读取文本并送入词法分析器中，它的接口很简便：

* ``String getLine()``：读取一行，并将结果以String形式返回
* ``bool isMore()``：是否还有文本尚未读取，如果有，则返回true

用户在调用``getLine()``前理应先调用``isMore()``查看是否还有剩余文本；否则容易导致程序错误。

其次，更新了异常处理库。

以往的异常处理库非常简陋，设计方式是典型的面向过程。但是考虑到将来可能会多线程运行**编译器/虚拟机**，所以我将异常处理库封装为面向对象的。

宏的用法基本不变，用法过于简单，文档不再赘述，详见``Exception.cpp``。

### 编写了语法分析器

经过了将近两周的编写，语法分析器终于完工。

语法分析器的代码位于``src/compiler/Parser.cpp``当中。 Parser类（``stamon::c::Parser``）即为语法分析器的主体。

##### 怎样使用语法分析器？

在使用语法分析器之前，你需要有：

* 一个用于处理异常的STMException对象
* 一个已经将token全部分析完的Lexer对象
* 一个初始化完毕的Matcher对象

在初始化Parser后，调用``Parse()``方法，即可进行语法分析，并返回语法树的根节点。如果语法分析出错，则返回NULL，并将错误存入STMException对象当中

详细请见测试用例``test_case/parser``

##### 使用语法分析器的测试样例

语法分析器的测试样例位于``test_case/parser``中。

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

使用样例，应该这么做：

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

##### 语法分析器的原理

语法分析器主要采用递归分析，具体的文法请见``src/compiler/ebnf.txt``。

### 整理了文档

我将工作日志中的一些内容摘编成一份份文档。

### 接下来要做的事

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