- 博客(15)
- 收藏
- 关注
原创 如何写一个简单的解释器(Interpreter)
解释器是虚拟机VM的重要组成部分,解释器其实和编译器在很多时候都是相近的概念,特别上实现过程中的概念。最近看到了一个系列文章,目前有14章,讲了如何用Python语言实现一套完整的解释器,来解释执行一个非常古老的语言——Pascal语言的源代码。我看过以后觉得有点意义,循序渐进不疾不徐。但是原文写的有点繁琐了。于是我花了几晚时间翻译和简化一下。目前共13章,后面陆续跟进。 ...
2019-01-08 23:30:08
402
原创 如何写一个简单的解释器(Interpreter)-14
未完待续Table of ContentsScopes and scoped symbol tables Procedure declarations with formal parameters Procedure symbols Nested scopes Scope tree: Chaining scoped symbol tables Nested scopes and ...
2019-01-08 23:19:23
250
原创 如何写一个简单的解释器(Interpreter)-13
如果一件事值得做,那就值得做过头儿. 语义分析简介看看下面这个例子,引入我们的定义:x := x + y;Paser是怎么知道x和y之前有没有声明过呢?并不能,所以我们需要语义分析这个过程,来回答好这个问题。所以基本上,语义分析就是这样一个工作,让我们检查一个程序是不是合理,根据语言的定义,它的意义是什么。什么样的程序是合理的?这涉及到语言的定义和语言的需求。比...
2019-01-08 23:17:37
294
原创 如何写一个简单的解释器(Interpreter)-12
“不怕慢,就怕停” - 中国谚语.什么是过程声明procedure declaration? 过程声明是一个语言模块,定义了一个标识符(过程的名字)和对应的Pascal代码块。有点像C语言的函数。严格定义:Pascal 过程没有返回值. Pascal 过程可以嵌套 可以有形参这个是我们今天的测试Pascal程序:PROGRAM Part12;VAR a :...
2019-01-08 18:06:02
277
原创 如何写一个简单的解释器(Interpreter)-10
今天的目标是:搭建一个支持Pascal编程语言子集的全功能解释器。我们使用的Pascal的例子程序,可以被 Free Pascal compiler, fpc.编译通过。当然,我们希望我们的解释器可以成功解释通过。 例子程序代码如下:PROGRAM Part10;VAR number : INTEGER; a, b, c, x : INTEGER; y ...
2019-01-08 17:28:11
339
原创 如何写一个简单的解释器(Interpreter)-11
译者按:从这一章开始,我们要准备随时开车了。所以有些不便于翻译的专有名词。我就保留了。迄今为止,我们弄明白了:把句子分解成token。这个过程也叫词法分析,干这个事儿的模块叫做词法分析器。我们也从头写过了一个自己的词法分析器,没有借助正则表达式或者Lex之类的工具,就生生的写出来了。 在token流中,如何识别一个短语,或者说找到一个特定结构。这个过程叫解析或者句法分析。 用句法图来表...
2019-01-08 13:01:32
346
原创 如何写一个简单的解释器(Interpreter)-9
今天要如何解析和解释Pascal语言的定义、复合语句、赋值语句、变量。还要聊聊符号表以及存储和查找变量。 BEGIN BEGIN number := 2; a := number; b := 10 * a + 10 * number / 4; c := a - - b END; x := 11;EN...
2019-01-07 22:47:32
324
原创 如何写一个简单的解释器(Interpreter)-8
今天的主要话题是单目运算符。具体来说:扩充现有的语法,处理单目运算加和单目运算减。 增加一个新的UnaryOp AST节点类。 扩充现有的解析器,生成包含UnaryOp AST节点的树形结构。 扩充现有的解释器,增加一个visit_UnaryOp方法,来解析单目运算农夫。单目运算符就是只有有个操作数的操作码,优先级比+, -, *, /要高。可以简单理解为正负号就对了。 ...
2019-01-07 13:05:30
253
原创 如何写一个简单的解释器(Interpreter)-7
之前答应过你,今天我们主要讨论一下贯穿全系列的最核心的数据结构。系好安全带准备出发!到现在我们已经有了自己的解释器,只要表达式里面有加减乘除这种语言结构,它就能够解析成功。这种解释器叫此法导向解释器。它通常只扫描代码一遍,适用于简单的语言。如果想做到分析更复杂的Pascal语言的结构,我们需要构建IR,也就是中间表示。我们的解析器负责生成IR,我们的解释器负责解释IR。业界的经验告诉我们,...
2019-01-06 23:13:41
465
原创 如何写一个简单的解释器(Interpreter)-6
今天将是不同寻常的一天。你可能会问为什么,因为我们要处理带括号的算数表达式了,比如 7 + 3 * (10 / (12 / (3 + 1) - 1))。首先,我们修改一下我们的语法。用来支持括号里面的表达式。上一章我们有一个factor规则,用来处理表达式中的基本单位。在我们的例子里就是整数。今天,我们将要添加另一个基本的单位——括号表达式。这是修改过后的语法:expr和term的生...
2019-01-05 23:01:13
282
原创 如何写一个简单的解释器(Interpreter)-5
当你想弄明白一个复杂的系统,比如说interpreter或者是编译器。一开始它看起来好像是一团杂乱无章的毛球,你需要把这个毛球的线都拆出来,重新组成一个光滑的毛球。这个过程可以是单线程的,也就是说每次你只拿一根线,去打一个结。有时候你会觉得你有很多东西不懂,但是不要管它,你就继续缠线就行了。有一天你会灵光一现,在坚持了很长时间之后,最终会突然理解整个系统。我能给你的建议就是你仔细看看前面几...
2019-01-04 22:56:22
204
原创 如何写一个简单的解释器(Interpreter)-4
还记得Confucius说过什么吗?“我听说了,后来我忘记了”“我看到了,后来我记住了.”“我做过了,后来我理解了.”这一章我们讲讲多个乘数法的计算,注意除法是整数的除法,比如9除以4等于2。我还要使用一种新的表达方式,上下文无关的语法书(简称为语法书),或者叫BNF(Backus Naur样式),来表示一种编程语言的语句规则。多说一句,我用的是扩展的...
2019-01-04 17:11:06
288
原创 如何写一个简单的解释器(Interpreter)-3
不管看多少游泳的书,跟多少游泳教练交谈,第一次游泳的时候总会沉下去。所以一定要多练习。前两章我们聊了怎么实现两个整数的加和减,比如 “7 + 3” 和 “12 - 9”。 今天我们聊聊怎么实现任意多位数的加减,比如 “7 - 3 + 2 - 1”.基本上,下面的图就是这种表达式的语法图:什么是语法图呢?语法图(syntax diagram) 是用图形表示的一种编程语言的语法规则。基...
2019-01-04 11:54:21
322
原创 如何写一个简单的解释器(Interpreter)-2
Burger和Starbird合著过一本书《高效思考的五个要点》,里面提到Tony Plog,他是个吹喇叭的艺术家,开办了一个喇叭培训班。他班上都是成熟的喇叭演奏手。当这些演奏手吹奏复杂的歌曲的时候,吹的很精彩,但是当Tony让他们吹奏简单的音节的时候,听起来就很不成熟,甚至幼稚。Tony结果喇叭也吹了一次,听起来依然很成熟。众人惊诧不已。Tony解释说,吹好复杂的曲子容易,吹好简单的音节却很难,...
2019-01-04 10:40:29
261
原创 如何写一个简单的解释器(Interpreter)-1
原创声明:这一个系列是翻译自https://ruslanspivak.com。插图是原文中自带的,同时我删除了一些没必要的解释。“如果你不知道compiler是怎么工作的,那么你就不会清楚计算机是怎么工作的。如果你不是100%确定地知道‘你知道compiler是怎么工作的’,那么你肯定不知道compiler是怎么工作的。” — Steve Yegge别着急,试着跟我读完整个教程,最终...
2019-01-03 23:23:20
1134
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人