從零開始寫個編譯器吧 - 開始寫詞法分析器(3)

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

相關文章
相關標籤/搜索