资讯专栏INFORMATION COLUMN

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

Barrior / 2129人阅读

摘要:在之前的章节第章从零开始写个编译器吧开始写词法分析器中我有说,我将函数设计成主动调用的形式,而则是被动调用的形式。接下来本系列将进入编写语法分析器的阶段,不过在此之前,我将抽出一点时间介绍一下语言本身。

上周周末旅游去了,就没更新了,虽然回到海拔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[] {
    "", "f", "
"
};
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 语言本身。)

就是这些吧~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64264.html

相关文章

  • 从零开始译器系列

    摘要:是的,这个系列将呈现一个完整的编译器从无到有的过程。但在写这个编译器的过程中,我可不会偷工减料,该有的一定会写上的。该语言的虚拟机将运行于之上,同时编译器将使用实现。我早有写编译器的想法之前没写过,故希望一边写编译器一边完成这个系列。 是的,这个系列将呈现一个完整的编译器从无到有的过程。当然,为了保证该系列内容的简洁(也为了降低难度),仅仅保证编译器的最低要求,即仅能用。但在写这个编译...

    genedna 评论0 收藏0
  • 从零开始译器 - tao语言的词法析器(Tokenizer)的类型定义

    摘要:要为语言设计词法分析器,首先得知道语言是一种什么样的语言。,不过首先我们得把词法分析器能生成的单词类型定义好了。 要为 tao 语言设计词法分析器,首先得知道 tao 语言是一种什么样的语言。不过呢,我脑海里还没有 tao 语言具体形象。我还是先贴一段 tao 语言的代码,大概展示下这是怎么回事吧。 def say_hello_world(who) print hello ...

    qpal 评论0 收藏0
  • 从零开始译器 - 词法析器是一个状态机

    摘要:词法分析器本身就是一个状态机,生成这个状态机有很多种方法,而我打算采取手写的方式。状态机不断从源代码即一个字符串中读入一个一个字符,读到不同的字符将使状态机的状态从一个状态变化到另外一个状态。 词法分析器 Tokenizer 本身就是一个状态机,生成这个状态机有很多种方法,而我打算采取手写的方式。因为 tao 语言的词法还是相对比较简单的,手写不成问题。 先新建一个LexicalAna...

    calx 评论0 收藏0
  • 从零开始译器 - 开始词法析器(1)

    摘要:上一章提到我要手写词法分析器这个状态机,嗯,那就让我们开始吧。实际上,在状态机不断接受字符的过程中,会先调用将其缓存,并在适当的时机调用生成。一个典型的状态机,处于不同状态,对于接受的参数进行不同的操作。 上一章提到我要手写词法分析器这个状态机,嗯,那就让我们开始吧。 public class LexicalAnalysis { private...

    littleGrow 评论0 收藏0
  • 从零开始译器 - 单词化简述(Tokenization)

    摘要:实际上,所谓的源代码,我们可以将其视为一段长长的字符串。但仅仅是把源代码的字符分割成段,这些字符串尚不能称之为完整的单词,而只能作为单词的语素。实际上,词法分析器还对将单词分类。实际上,词法分析器会为这行代码生成如下形式。 实际上,所谓的源代码,我们可以将其视为一段长长的字符串。所谓字符串,即是字符的有序集。但是,字符本身作为编译器的输入单位,粒度实在太小了,因此,我们往往需要对编译器...

    lucas 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<