上周周末旅游去了,就没更新了,虽然回到海拔0m的地区,不过目前彷佛还在缺氧,因此本次就少更点吧。git
这章将结束词法分析的部分。github
在以前的章节(第7章从零开始写个编译器吧 - 开始写词法分析器(1))中我有说,我将 readChar(char c) 函数设计成主动调用的形式,而 read() 则是被动调用的形式。segmentfault
那好,如今让咱们来填写 read() 函数的 TODO 部分吧。首先,还得把构造函数写完。函数
private final Reader reader; public LexicalAnalysis(Reader reader) { this.reader = reader; this.state = State.Normal; }
以后是 read() 函数。this
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) 函数,令它能够过滤掉一些特殊符号。若是不过滤掉这些符号,那么一旦源代码中插入这些符号,可能令编译过程当中出现一些诡异的错误。code
(这篇内容有点少,因此在最后稍微谈谈以后的内容吧。以后,我将会把本系列的代码签入 github 中方便各位查看。并将各个版本的连接写入各个章节之中。)orm
(接下来本系列将进入编写语法分析器的阶段,不过在此以前,我将抽出一点时间介绍一下 tao 语言自己。)blog
就是这些吧~token