- 博客(44)
- 收藏
- 关注
原创 Part10_编写自己的解释器
在这篇文章中,我们将会更新我们的解释器,使其能够去解析以及解释我们的第一个非常完整的Pascal程序。为了能够处理程序头、变量声明、整型和浮点型常量以及整数和小数除法,我们需要去添加一些新的符号(有些符号是保留关键字)。符号的含义,使其表示一个整型的数据类型,而不是表示一个整型常量。我们的理想是构建一个Pascal编程语言子集的功能全面的解释器。你或许还记得,BNF中的每一个规则都要映射为语法解析器中的一个方法。在这篇文章中,我们不进行类型检查,但是不久的将来,我们会添加对类型检查的支持。
2026-01-28 21:55:44
638
原创 Part9_编写自己的解释器
现在,我们对符号表的使用时相当粗糙的:它并不是一个拥有特定方法的单独的类,而仅仅只是个Python字典,同时会导致内存空间使用率的倍增。在未来的文章中,我将会谈论关于符号表的更多细节,最后我们让代码变的更加清晰。我还记得,很久很久以前,我还是个大学生,学习系统编程的时候,我认为能称得上是编程语言的只有汇编语言和C语言。不得不说的是,我更倾向于使用某种特定的语言。如你所见,右边的赋值表达式"a + 7"(引用了变量"a"),因此在我们执行表达式"a + 7"前,我需要先去找到"a"变量的值,这就是。
2026-01-17 16:51:23
1003
原创 Part8_编写自己的解释器
今天的很多内容都以之前文章中的内容为基础。保存上面的代码,运行它。看看基于AST的解释器能否正确的计算含有一元操作符的算术表达式。是时候更新我的语法规则了,使其能够支持一元正号操作符和一元负号操作符。规则,在其中添加对一元操作符的支持,这是因为一元的操作符的优先级要高于二元操作符。的AST,并且将其传入到我们的解释器中去验证新添加的。代表一元操作符的符号实例对象(正号或者负号);规则中,因此我们将会修改语法解析器中的。二元操作符:操作两个操作数的操作符。我们更新后的语法规则中,变化的内容在。
2026-01-10 21:21:10
619
原创 Part7_编写自己的解释器
正如我之前承诺你的一样,今天我将会和你谈一谈重要的数据结构:树。在我们系列的后面,将会很频繁地只用这个数据结构。所以收拾好行囊,准备出发吧!迄今为止,我们的解释器和语法解析器的代码是混杂在一起的,语法解析器一识别到类似加法、减法、乘法、或除法的语法结构后,解释器就会立刻进行解释。这样的解释器称之为语法导向的解释器。它们通常对输入进行一遍扫描,对于一些基础的语言应用是很合适的。为了达到去分析更加复杂的Pascal编程语言结构的目的,我们需要去构建一个中间表示(Intermediate Representati
2026-01-07 21:48:12
961
原创 Part6_编写自己的解释器
保存上面的代码,自己去运行,并且看一看结果,验证一下在计算算术表达式时,是否能够在按照操作符的不同优先级进行计算的同时也能够正确处理括号表达式。在那篇文章中,表达式的基本组织单元只有整数。今天,我们要添加另外一个基本组织单元:括号表达式。首先,让我们修改BNF,使其支持带括号的表达式。我们的新BNF有一个有趣的特性:递归。)的解释器,从而基本结束我们对算术表达式的讨论。生成式和Part5中的完全一样,唯一的变化发生在。好了,让我们将最新版本的BNF翻译为代码吧!下面是修改后的带有分支选项的。
2026-01-03 11:45:42
324
原创 Part5_编写自己的解释器
如果你足够有毅力坚持下去,最后你一定会灵光一现,这是我对你的承诺(举个例子,如果我每天将25美分存下来,虽然当时我并不知道这有什么用,但是长久下去,我会变得富有。关于构建一个解释器或者编译器方面我能够给你的最恰到的建议就是:阅读文章中的解释、阅读代码、并且自己再去实现一遍代码,通过一段时间对相同代码的实现,你已经对所学内容和代码觉得自然之后,再去学习心得内容。在这种情况下,操作符的结合律对我们没有丝毫用处,因为结合律的作用范围必须是同种类型的操作符:要么是可加的(+, -),要么是可乘的(*, /)。
2026-01-02 10:00:33
760
原创 Part4_编写自己的解释器
你有没有热情地去学习本系列的内容呢?或者你有没有在学完之后很积极的去进行练习呢?我希望你已经积极的练习过了。我真的这么希望。还记得荀子说过的一句话吗?在之前的文章中,你已经学习了如何去解析和解释出现任意数量加号或减号操作符的算术表达式,例如:"7−3+2−1""7 - 3 + 2 - 1""7−3+2−1"。你也学习了语法示意图,以及怎样用语法示意图去定义具体的编程语言语法。今天,你将要学习如何去解析和解释出现任意数量乘号或除号操作符的算术表达式,例如:"7∗4。2∗1""7 * 4 。 2 * 1""7∗
2025-12-30 22:24:21
766
原创 Part3_编写自己的解释器
你能够花费大量的时间去阅读数以百计的游泳数据,也能够和经验老道的游泳者和教练交流个把小时,还能够观看搜的到的所有训练视频,但是当你第一次跃入泳池的时候,你依旧像一块笨石头一样沉入水底。由于不同编程语言中对算术表达式的语法规则是非常相似的,因此我们可以使用Python shell去“测试”我们的语法示意图。语法示意图能够直观的向你展现,在你的编程语言中,哪些语句是被允许的,哪些语句是不被允许的。原则是:你对一个领域的知识不管理解、知晓的有多棒,为了能够训练出在该领域可行的技能,你必须要讲知识应用到实践中。
2025-12-28 16:12:16
974
原创 Part2_编写自己的解释器
即使你对你现在使用的工具或者框架非常熟悉,去了解它们背后的原理也是非常重要的。python源代码中的一个符号实例对象就是符号的一个词素,比如Token(INTEGER, 2)是整数符号(INTEGER TOKEN)的一个词素。但是如果你学习了方法背后的原理,你就能发明属于自己的方法。得到的符号流中搜寻特定结构,然后将该结构解释为之前提到的短语,最后生成算术表达式的结果。在符号流中搜寻特定结构的过程,或者换一种说法,从符号流中识别一个短语的过程,该过程称之为。到了现在,你应该知道了,你编写的解释器的。
2025-12-27 21:01:02
501
原创 Part1_编写自己的解释器
在这个系列的最后,你将会拥有一个可以正常工作的Pascal解释器,以及一个源代码级别的调试器(类似于Python的pdb)。无论你是软件开发的新手还是经验丰富的老鸟,有一个规则都适用:如果你不知道编译器和解释器是如何工作的,那你就是不知道计算机是如何工作的。Pascal解释器的实现语言将会使用Python,但是你可以使用任何你想用的语言,这是因为原理是不依赖于具体语言的。的目标就是将用高等语言编写的源程序翻译为其它形式的语言。好了,现在我们该去探究你的解释器是如何工作的,以及它是怎样去计算算数表达式的。
2025-12-25 21:16:51
985
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1