资讯专栏INFORMATION COLUMN

从零开始写个编译器吧 - 单词化简述(Tokenization)

lucas / 2308人阅读

摘要:实际上,所谓的源代码,我们可以将其视为一段长长的字符串。但仅仅是把源代码的字符分割成段,这些字符串尚不能称之为完整的单词,而只能作为单词的语素。实际上,词法分析器还对将单词分类。实际上,词法分析器会为这行代码生成如下形式。

实际上,所谓的源代码,我们可以将其视为一段长长的字符串。所谓字符串,即是字符的有序集。但是,字符本身作为编译器的输入单位,粒度实在太小了,因此,我们往往需要对编译器进行第一层封装,即分割出一个称之为 Tokenizer (词法分析器)的部分。
Tokenizer 的作用即是将字符序列翻译成 Token(单词)的一个过程,这一过程称之为单词化(Tokenization)。很容易理解单词化这一步骤在整个编译过程中的价值,举个例子,如下这么一个英语句子。

It"s understandable that we share some common values as we are living in the same world.

实际上,这个句子倘若以字符串的形式存在,即以字符作为最小单位来解析,则看起来形式如下。实际上,我们很难从中提取出有价值的信息。

  

["I", "t", """, "s", " ", "u", "n", "d", "e", "r", "s", "t", "a", "n",
"d", "a", "b", "l", "e", " ", "t", "h", "a", "t", " ", "w", "e", " ",
"s", "h", "a", "r", "e", " ", "s", "o", "m", "e", " ", "c", "o", "m",
"m", "o", "n", " ", "v", "a", "l", "u", "e", "s", " ", "a", "s", " ",
"w", "e", " ", "a", "r", "e", " ", "l", "i", "v", "i", "n", "g", " ",
"i", "n", " ", "t", "h", "e", " ", "s", "a", "m", "e", " ", "w", "o",
"r", "l", "d" ]

而分词话的作用,则是将上面这段东西,变成(至少)下面这段东西。

  

["It", "is", "understandable", "that", "we", "share", "some",
"common", "values", "as", "we", "are", "living", "in", "the",
"same", "world", "."]

看起来是不是更加顺眼了呢?实际上我们都几乎能读出这个单词数组所代表句子的意思了。

词法分析器 Tokenizer 的另一个功能在于,将单词分类。考虑源代码中这么一行。

  

private int index = 27;

会被拆分为如下形式。

  

["private", " ", "int", " ", "index", " ", "=", " ", "27", ";"]

但仅仅是把源代码的字符分割成段,这些字符串尚不能称之为完整的单词Token,而只能作为单词的语素。实际上,词法分析器还对将单词分类。因此,读到的语素,分析出的类型,两者才构成一个完整的单词。
实际上,词法分析器会为这行代码生成如下形式。


每一列代表一个单词Token,而单词包含两个属性,语素、类型。

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

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

相关文章

  • 从零开始写个译器系列

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

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

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

    calx 评论0 收藏0
  • 从零开始写个译器 - Token.java 文件的编写

    摘要:现在,让我们来动手写编译器的第一个个文件吧。如其名字所示,这个类实例化的对象用于表示词法分析器的产物。我希望词法分析器从源代码中提取出语素,并根据上下文推测出单词类型,从而构造出对象。只需要构造出类型即可,进一步细分将在的构造函数中进行。 现在,让我们来动手写编译器的第一个个java文件吧。本章要写的类,是Token类。如其名字所示,这个类实例化的对象用于表示词法分析器 Tokeniz...

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

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

    qpal 评论0 收藏0
  • 从零开始写个译器 - 译器的结构

    摘要:自然,我们还是先从语言的编译器下手吧。在动手写编译器之前,得容我将编译器的结构进行进一步的划分。这些将被语法分析器接收并进行进一步处理。由于本系列将着重于写出编译器,必要的理论和概念还是会交代的。从零开始写个编译器吧编译器的结构的博客 自然,我们还是先从 tao 语言的编译器下手吧。在动手写编译器之前,得容我将编译器的结构进行进一步的划分。编译器可视为一个黑盒,从其一端输入源代码,另一...

    wudengzan 评论0 收藏0

发表评论

0条评论

lucas

|高级讲师

TA的文章

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