上週週末旅遊去了,就沒更新了,雖然回到海拔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