# 词法分析器文档


词法分析器的源码位于``src/compiler/Lexer.cpp``。

``Lexer.cpp``里的代码都被``stamon::c``（``c``指的是compiler）这个命名空间封装了起来。

如果你想要调用``Lexer.cpp``，可以编写以下代码：

```C++
#include"Lexer.cpp"
using namespace stamon::c;
```

**接下来我想讲一讲词法分析器的架构（了解该架构前，你应该要会编译原理）：**

``Token``是基本词法单元类，其成员如下：

* ``Token(int line, int tok_type)``：构造函数，line参数表示该token所在的行号，tok_type表示该token的类型编号（具体请参见``Lexer.cpp``中的``TOKEN_TYPE``）
* ``lineNo``：这是一个整数变量，表示该token所在的行号
* ``type``：返回一个整数，即该token的类型编号

<br>

除``Token``类外，还有``StringToken``、``IdenToken``、``IntToken``、``DoubleToken``。这些都是``Token``的子类，如果一个Token是字面量或者标识符，你需要将其转化成对应的子类才能获取信息。具体请参见``Lexer.cpp``中的相关定义。

<br>

``Lexer``是词法分析器类，其接口如下：

* ``int getLineTok(int line, String text)``：分析一行的token，line是行号，text是文本（不包含换行符）。分析后的token会加入到缓存中。返回解析到的位置，如果返回值是text的长度就说明解析到末尾，即解析成功；否则说明解析失败。
* ``Token* getTok()``：从缓存中读取出（并删除）一个Token。
* ``Token* peek(int index)``：查看第index个Token（但不删除）。

Lexer在分析前，应当先把源码分解成逐行的文本，然后从第一行到最后一行依次调用getLineTok。

具体的用法请参见``Lexer.cpp``和测试样例

> ——摘自``工作日志20230131.md``