一步步写类lua脚本语言解释器
从0开始写一个类似lua脚本语言的解释器,争取做到稍有基础的程序员都能看懂
Shonm
用blog记录点点滴滴。。。成长的轨迹一步一个印
展开
-
一步步写lua解释器--多参赋值的问题
有个问题倒是缠绕了很多时间,问题非常简单清晰,就是,函数的返回值取值个数的问题。例如function ft() return 13, 78 endlocal a, b, c = 3, 4, ft()print(a, b,c)a, b, c = 3, ft(), 5print(a, b,c)a, b, c = ft(), 5print(a, b,c)a, b, c = ft...原创 2018-08-27 00:19:38 · 693 阅读 · 0 评论 -
一步步写lua解释器--递归的bug
在网上与人讨论时,别人问我能否调用递归。这个确实还没有执行过,我也想试一试。结果一试就GG了。调试的结果是闭包内部的局部变量表push和pop的次数好像不一致,导致pop空表,然后就崩溃了。经过反复调试,还是没有找到问题,局部表的push和pop就在块开始和结束的地方,应该是没有问题的。调试是个非常复杂的过程,因为嵌套的调用非常多,一般递归里面肯定是由if语句的,而if语句又是写在块里面,逐渐...原创 2018-08-27 00:12:13 · 555 阅读 · 0 评论 -
一步步写lua解释器--泛型for循环
写泛型for之前,我发现连这个语法都不是太清晰,因为大都for, in 后面跟着pairs()或ipairs()函数,以为for,in后面只能是这两个函数。查看了官网资料,for, in 的语法规则是:for namelist in explist do block end 也就是说for,in后面需要一个表达式列表,但是他们必须要有一定的的规则,例如:for k,v in ip...原创 2018-08-27 00:03:23 · 749 阅读 · 0 评论 -
一步步写lua解释器--数值for循环
lua中for语句分为数值型for循环和泛型for循环。其中数值型for较为简单,我们先说它。数值型for循环的要点:for var=exp1,exp2,exp3 do <执行体> end例如:for i = 1, 2,1 do print(i)end需要特别注意的是,其中变量i是这个for循环体的局部变量,也就是说这个i在for循环外...原创 2018-08-26 23:56:14 · 481 阅读 · 0 评论 -
一步步写lua解释器--table的实现
lua中的table貌似是lua中唯一的数据结构了,他既可以充当数组,也可以充当map使用,把这两种结合为一个数据结构,足以说明lua的简洁易用性。原本以为table实现起来会比较复杂,结果一上午就差不多写好了,而if语句却写了一整天,当然也包括了优化其他代码。table的实现包括构造和存取。一个table的构造:local a = {b = 3,c = {e = 9}}语法树...原创 2018-08-26 23:49:06 · 616 阅读 · 0 评论 -
一步步写lua解释器--if else语句
if 语句可以拆成三个部分:逻辑判断部分,if 左边的部分,if右边部分,例如:if b == 1 then local c = 100 print(c)else print(2)endb==1为逻辑判断部分local c=100 print(c)为if左边部分,print(2)为右边部分如果if 没有else 则右边部分为空。对于if a ...原创 2018-08-26 23:25:24 · 971 阅读 · 0 评论 -
一步步写lua解释器--闭包的处理
前面说到函数执行完毕,也就是闭包退出时,会清除其作用域的局部变量。但是有个问题就是保存闭包的上值,何为上值,举个简单的例子:local f = function(a) return function() a = a + 1 return a ...原创 2018-08-26 22:59:35 · 398 阅读 · 0 评论 -
一步步写lua解释器--函数语句
函数包括函数名,参数,函数体。函数体又包括语句,返回语句。函数的声明又分为显式,匿名式,例如下面两种:local f = function(params) ... endlocal function f(params) ... end不管哪种类型,我们需要提取其名字f,保存在局部变量表里,这个倒是不难。然后是对函数的每个部分逐一解析。函数参数是名字变量列表,这个相当于初始化名字列表,...原创 2018-08-26 22:27:07 · 438 阅读 · 0 评论 -
一步步写lua解释器--闭包的由来
原本函数在最开始的时候就实现了,但是后来发现了不少bug,都是由参数个数,返回值个数等引起的,比想象的要复杂一些。lua中函数与闭包是紧密相连的。我们早在学习c或java的的时候,就认识了函数,学习诸如lua,python,js脚本语言的时候才听说闭包这个词。在很长一段时间内我对闭包的概念都不是很理解,后来才慢慢清晰。现在亲自实现脚本语言后,才真正明白闭包的含义。简单一句话概括就是,函数是...原创 2018-08-25 23:55:19 · 462 阅读 · 0 评论 -
一步步写lua解释器--代码生成
上一篇讲了如何生成语法树。生成语法树之后就要生成代码了,即可以被执行的指令,想想都有点激动。前面提到再复杂的代码都可以转换为赋值,运算,比较等指令。赋值是将一个确定的数值或字符串赋给一个变量,他是一个二元操作。运算无非是简单的四则运算,加减乘除,他们都是二元的。比较也是将值与true or false对比,也是二元操作。赋值拿local a = 1 举例,变量是a,值是1。遇到这个语句时,怎么...原创 2018-08-26 18:42:39 · 1449 阅读 · 0 评论 -
一步步写lua解释器--语法分析
当我们从源码中读取到一个个单词token之后,就需要将这些token转换为实际的语句了。一门语言的产生是有一定的道理,是用来解决实际问题的,没人会吃饱了没事干发明一门语言。例如在学数学时要求一个一元一次方程的结果即解方程ax + b = c,我们可以写如下代码:local f = funciton(a, b, c) if a ~= 0 then local x = (c - ...原创 2018-08-25 23:44:08 · 1460 阅读 · 4 评论 -
一步步写lua解释器--开篇
本人去年开始接触lua,之后就被它简单的语法和恰到好处的功能给吸引住了。本人搞了几年的C++,深感C++的繁琐和深奥,后来接触了像python,javascript等脚本语言,学习到了函数式编程语言的精妙。听说lua语言源码短小精悍,于是打算研究一下源码。可是看到其源码才发现,没有编译原理基础的我寸步难行,看别人写分析lua源码的博客也是门路不对。后来决定恶补一下编译原理的知识,在网上看了一些...原创 2018-08-25 21:47:48 · 6658 阅读 · 0 评论