当前位置: 首页 > 编程日记 > 正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

实际上,所谓的源代码,我们可以将其视为一段长长的字符串。所谓字符串,即是字符的有序集。但是,字符本身作为编译器的输入单位,粒度实在太小了,因此,我们往往需要对编译器进行第一层封装,即分割出一个称之为 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,而只能作为单词的 语素 。实际上,词法分析器还对将单词分类。因此,读到的 语素 ,分析出的 类型 ,两者才构成一个完整的单词。

实际上,词法分析器会为这行代码生成如下形式。

02095853_AL5R.jpg

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

转载于:https://my.oschina.net/taozeyu/blog/339893

相关文章:

springboot+mybatis ,出现多于的参数导致查询数据缺少

在springbootmybatis 中,经常会有多于的字段遗留在xml文件中,这种情况正常人会以为会判断空和null状态,不影响sql语句,但是实际上会有影响, 因为在parameter中未定义,是undefined,而不是null和空…

【C4D教程】Octane渲染大师班

【C4D教程】Octane渲染大师班 本套教程共9大章 4小时20分 高清1920X1080 mp4 视频 英语机译中文字幕 大小 17.8G 信息。 云桥网络 平台获取教程 学习使用Cinema 4D和Octane Render创建惊人渲染的过程和工作流程。 实践分析和指导。 7个项目文件可供学习和借鉴。 C4D Octa…

Java学习总结:2

java的注释 /***文档注释*这种注释的内容会被解释成程序的正式文档*/ public class TestDemo {public static void main(String args[]){System.out.println("Hello MLDN");//System的首字母要大写,否则会显示程序包system不存在/*多行注释............*…

Android采用Application总结一下

什么是 Application   Application和Activity,Service由于是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象。用来存储系统的一些信息。通常我们是不须要指定一个Application的,这时系统会自己主动帮我们创建&#xff…

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大…

网页制作常见的问题(怎样兼容IE6/IE7/火狐浏览器)

1、IE6双边距问题&#xff1f; 在IE6的浏览器中明明设置的是10px的margin却为什么显示的是20px的margin其实这个Ie6的一个双边距BUG 例如: <style type"text/css"> body {margin:0} div { float:left; margin-left:10px; width:300px; height:300px; border:1p…

Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装

Ubuntu系统---安NVIDIA 驱动后 CUDAcuDNN 安装 --------------------------------------------20190726--------------------------------------------------------------------------------------------- 上接《Ubuntu系统---NVIDIA 驱动安装》。预配置环境&#xff1a;Ubunt…

Maya基础入门学习教程

Maya基础入门学习教程 视频&#xff1a;.MKV, 1280x720, 共57节课 时长 4小时25分钟&#xff0c;3GB 语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕机译更准确&#xff09;原英文字幕 指导老师&#xff1a;Shane Whittington Shane Whittington 百度一下 云桥网…

java学习总结:3

逻辑运算 1.’!’(非) 2.与(多个条件一起满足) Java中&&和&都是表示与的逻辑运算符&#xff0c;都表示逻辑运输符and&#xff0c;当两边的表达式都为true的时候&#xff0c;整个运算结果才为true&#xff0c;否则为false。 ’&&的短路功能&#xff0c;当…

asp.net httpmodule 访问页面控件 备忘

用到的时候发现还得找代码&#xff0c;存一个例子方便自己和他人修改&#xff1a; using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls;…

Ubuntu下Sublime Text 3解决无法输入中文的方法

2019独角兽企业重金招聘Python工程师标准>>> 环境&#xff1a; Ubuntu14.04搜狗输入法 for LinuxSublime text 3提示&#xff1a;编译请在非root下进行 本经验目前在Ubuntu14.04环境下&#xff0c;已有搜狗输入法 for Linux和Sublime Text 3的情况下安装成功。 保存…

电子书下载:Building Websites with DotNetNuke 5

下载&#xff1a;http://www.ctdisk.com/file/9941471 转载于:https://www.cnblogs.com/MaxWoods/archive/2012/10/10/2719167.html

Java学习总结:4

面向对象 面向对象的程序设计具有封装性、继承性、多态性。 类的定义语法如下&#xff1a; class 类名称{数据类型 属性(变量);...public 返回值的数据类型 方法名称(参数1&#xff0c;参数2...){程序语句;[return 表达式;] } }定义类 class Book {String title;double pric…

在3ds Max中使用V-Ray 5渲染引擎视频教程

在3ds Max中使用V-Ray 5渲染引擎视频教程 MP4 | 视频&#xff1a;h264, 1280x720 | 音频&#xff1a;AAC, 44.1 KHz, 2通道。AAC, 44.1 KHz, 2 Ch. 技能水平。初学者&#xff5c;类型&#xff1a;电子学习&#xff5c;语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕…

OC实用转换model的工具

OC实用转换model的工具 说明 这是本人写的一个专门用来将json数据直接转换生成Model文件的工具,目的是为了让你从写Model文件的繁琐过程中解脱出来,提升效率以及减少出错的几率,工具的特点如下: 1. 用组合设计模式处理树形数据结构(非线性数据结构) 2. 在调试台中处理生成Model…

后端怎么防止重复提交?(常用的做法)

后端怎么防止重复提交&#xff1f;&#xff08;常用的做法&#xff09; 客户端的抖动&#xff0c;快速操作&#xff0c;网络通信或者服务器响应慢&#xff0c;造成服务器重复处理。防止重复提交&#xff0c;除了从前端控制&#xff0c;后台也需要控制。因为前端的限制不能解决…

利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件

虽说渐渐地Mac笔记本基本告别内置光驱时代了&#xff0c;随着网络的普及&#xff0c;使用到光驱的机会也渐少&#xff0c;但有时又难免需要光驱&#xff0c;比如二货出版社的随书光盘等…我们可以通过USB外置光驱将光盘内容提取为ISO文件保存到电脑里&#xff0c;方便以后可以随…

Java学习总结:5

面向对象 对象数组 引用数据类型也可以定义数组 格式&#xff1a; 1.对象数组的动态初始化 类名称 对象数组名称 new 类名称 [长度];动态初始化默认情况下&#xff0c;数组的每一个元素都是其对应的默认值null。 class Book5{private String title;private double price;…

Maya初学者完整的3D动画大师班视频教程

Maya初学者完整的3D动画大师班视频教程 时间13小时30分 包括课程项目文件 1280X720 MP4 语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕机译更准确&#xff09;原英文字幕 教程大小解压后&#xff1a;8.38G Maya初学者。完整的3D动画大师班 百度一下 云桥网络 平台…

jQuery-1.9.1源码分析系列(四) 缓存系统

先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制&#xff0c;点击这里查看。不过Sizzle的缓存只是对内使用的&#xff08;内部自己存&#xff0c;自己取&#xff09;。接下来分析jQuery可以对外使用的缓存&#xff08;可存可取&#xff09;。 首先需要明白jQuery缓存需要解…

CBA 赛程的笔记 - 北京首钢

2014-11-01 19:35北京首钢103:89广东宏远结束技术统计 发挥不错&#xff0c;打的比较好&#xff01;2014-11-05 19:35八一双鹿89:100北京首钢结束技术统计 第一节国内球员打的太屎&#xff0c;最后一节国内球员发挥不错&#xff01;2014-11-07 19:35浙江稠州107:116北京首钢结束…

个人技术生涯的感悟(2)

很多时候&#xff0c;一门门槛很低的编程语言对于初学者的帮助是非常大的&#xff0c;从而决定这个人的技术路线的选择。 在经历过大一下学期对C&#xff0c;和C的迷茫之后&#xff0c;在大二上学期&#xff0c;学校在搞一个网页设计比赛&#xff0c;正好和两个朋友一起参赛。开…

HtmlAgilityPack 处理通配的contains

//选择不包含class属性的节点 var result node.SelectNodes(".//span[not(class)]"); //选择不包含class和id属性的节点 var result node.SelectNodes(".//span[not(class) and not(id)]"); //选择不包含class"expire"的span var result node…

游戏风格化角色创建入门指南视频教程

游戏风格化角色创建入门指南视频教程 时间 33小时 包括项目文件 1920X1080 MP4 语言&#xff1a;英语中文字幕&#xff08;根据原英文字幕机译更准确&#xff09;原英文字幕 游戏中的风格化角色创建入门指南 百度一下 云桥网络 平台huo取 教程&#xff01; 信息。 教程33小…

Java学习总结:6

String类(接上篇) 字符串的拆分 public class Test1_1_2_1 {public static void main(String args[]){String str "hello world";String result[] str.split(" "); //以空格作为间隔for(int x0;x<result.length;x){System.out.print(result[x]"…

java面试常见问题之Hibernate总结

1 Hibernate的检索方式 导航对象图检索&#xff08;根据已经加载的对象&#xff0c;导航到其他对象。&#xff09; OID检索&#xff08;按照对象的OID来检索对象。&#xff09; HQL检索&#xff08;使用面向对象的HQL查询语言。&#xff09; QBC检索&#xff08;使…

HDU 4267 线段树 离散点区间更新, 自叶子节点至根单点查询

题意&#xff1a; n个数字 下面n个数字表示数列 2个操作 1 [u, v] k add [u,v ]区间 &#xff08;u点要计算&#xff09;每隔k个位置&#xff0c;该数字add 2 pos 询问 pos下标的值&#xff08;下标从1开始&#xff09; 思路&#xff1a; 因为k很小&#xff0c; 可以直接存 k…

Java学习总结:7

static关键字 一个类的主要组成就是属性和方法(分为构造方法和普通方法两种)&#xff0c;而每一个对象都分别拥有各自的属性内容(不同对象的属性保存在不同的堆内存中)&#xff0c;如果类中的某个属性希望定义为公共属性(即所有对象都可以使用的属性)&#xff0c;则可以在声明…

mybatis 使用resultMap实现数据库的操作

resultType:直接表示返回类型 resultMap&#xff1a;对外部resultMap的引用 二者不能同时使用 创建一个实体类Role和User public class Role {private Integer id;private String roleCode;private String roleName;//省略set、get方法 创建User类&#xff08;在User中有roleId…

【3DMax教程】三维产品可视化视频教程 3d Products Visualization Course

【3DMax教程】三维产品可视化视频教程 3d Products Visualization Course 三维产品可视化课程 教程大小&#xff1a;5.38G 1280X720 含课程素材文件 你会学到什么 项目简介及其必须包含的内容 蓝图以及如何获得和使用 逐步建模流程 如何制作UV和纹理 用UV投射材料 生成…