词法分析器的源码位于src/compiler/Lexer.cpp
。
Lexer.cpp
里的代码都被stamon::c
(c
指的是compiler)这个命名空间封装了起来。
如果你想要调用Lexer.cpp
,可以编写以下代码:
```C++
using namespace stamon::c; ```
接下来我想讲一讲词法分析器的架构(了解该架构前,你应该要会编译原理):
Token
是基本词法单元类,其成员如下:
Token(int line, int tok_type)
:构造函数,line参数表示该token所在的行号,tok_type表示该token的类型编号(具体请参见Lexer.cpp
中的TOKEN_TYPE
)lineNo
:这是一个整数变量,表示该token所在的行号type
:返回一个整数,即该token的类型编号除Token
类外,还有StringToken
、IdenToken
、IntToken
、DoubleToken
。这些都是Token
的子类,如果一个Token是字面量或者标识符,你需要将其转化成对应的子类才能获取信息。具体请参见Lexer.cpp
中的相关定义。
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