上周周末旅游去了,就没更新了,虽然回到海拔0m的地区,不过目前似乎还在缺氧,所以本次就少更点吧。
这章将结束词法分析的部分。
在之前的章节(第7章从零开始写个编译器吧 - 开始写词法分析器(1))中我有说,我将 readChar(char c) 函数设计成主动调用的形式,而 read() 则是被动调用的形式。
那好,现在让我们来填写 read() 函数的 TODO 部分吧。首先,还得把构造函数写完。
private final Reader reader;
public LexicalAnalysis(Reader reader) {
this.reader = reader;
this.state = State.Normal;
}
之后是 read() 函数。
private Token endToken = null;
Token read() throws IOException, LexicalAnalysisException {
if(endToken != null) {
return endToken;
}
while(tokenBuffer.isEmpty()) {
int read = reader.read();
char c = (read == -1 ? '\0' : (char) read);
while(!readChar(c)) {}
}
Token token = tokenBuffer.removeLast();
if(token.type == Type.EndSymbol) {
endToken = token;
}
return token;
}
至此,LexicalAnalysis 类就写完了。不过,末了,我还得补充一点东西。
private static final char[] FilterChar = new char[] {
'\b', '\f', '\r'
};
private boolean readChar(char c) throws LexicalAnalysisException {
boolean moveCursor = true;
Type createType = null;
if(!include(FilterChar, c)) {
(原来的内容...)
}
if(createType != null) {
createToken(createType);
}
}
这里稍稍修改了一下 readChar(char c) 函数,令它可以过滤掉一些特殊符号。如果不过滤掉这些符号,那么一旦源代码中插入这些符号,可能令编译过程中出现一些诡异的错误。
(这篇内容有点少,所以在最后稍微谈谈之后的内容吧。之后,我将会把本系列的代码签入 github 中方便各位查看。并将各个版本的链接写入各个章节之中。)
(接下来本系列将进入编写语法分析器的阶段,不过在此之前,我将抽出一点时间介绍一下 tao 语言本身。)
就是这些吧~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。