从零开始写个编译器吧 - 开始写词法分析器(3)

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了从零开始写个编译器吧 - 开始写词法分析器(3)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

上周周末旅游去了,就没更新了,虽然回到海拔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 ? '' : (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 语言本身。)

就是这些吧~

脚本宝典总结

以上是脚本宝典为你收集整理的从零开始写个编译器吧 - 开始写词法分析器(3)全部内容,希望文章能够帮你解决从零开始写个编译器吧 - 开始写词法分析器(3)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。