php语言解释器,3个步骤实现简单语言解释器(自制简易编程语言)

前段时间,我用 javascript 重新编写了一个 16 位的虚拟机,用它实现了一个定制的 CPU 架构和汇编语言,汇编器和调试器。虽然从头编一个语言可以完全实现自己的自定义目标,但过程却及其复杂。为了使自己的编程过程更有效率,我决定使用 Lel(布局表达式语言,Layout Expression Language,LEL)。

本文将深入研究怎样用一个简单的方法来编写一个编程语言解释器,由于所有 Lel 的代码都是开放的,可以在 github 上使用。

解释器的组成

解释器是什么?简单来说,它基本上是一个程序,读取源代码,并对其进行运行,而不必首先将该源代码编译成机器语言。虽然这实现起来容易,但是,在运行该源代码之前,还必须执行 3 个步骤,才能实现简单语言解释器:

1. 标记化 ( Tokenisation ) 技术

标记化你的源代码,并将其转换成许多标记,其中每个标记都表示一种类型(比如数字,变量名称,括号等)和一种特殊值(比如 42," 你好 ",真假等)。

2. 解析(树形化)

解析或树形化(treeification),这会让所有的标记都以列表的形式呈现出来,一目了然,结构清晰,就像树形一样。为什么我非要进行解析或树化处理呢?因为在进行编程时,往往是函数的层次嵌套结构,树形数据结构可以表示数据表素之间一对多的关系。

3. 评估

LEL

Lel 或 "Lisp-esque 语言 " 是基于 lisp 的语法,它是一具有 50 多年的编程语言。

我会在这里分配一个变量,并声明一个函数。

( let   lifeUniverseAndEverything   42 )   ( function   sayHello   ( name )    ( print      "Hello,   "   name   ".   The   meaning   of   life   the   universe   and   everything   is   "   lifeUniverseAndEverything    ) )

'let' 是分配关键词,这里我说创建一个名为 "LifeUniverseAndEverything" 的变量,并将其值设置为 42,只是对 "sayHello" 进行一个函数定义,并将它设置一个参数,然后发出一个消息。

要运行该函数:

( sayHello   "Francis   Stokes" )   ;   ->   "Hello,   Francis   Stokes.   The   meaning   of   life   the   universe   and   everything   is   42"

这里有很多括号,原因是因为 Lel 像所有 lisp 派生语言一样使用 S 表达式(S-expression)。要解释什么是 S 表达式,首先要知道一个表达就是一段代码,当它运行时最终变成某种原始值。这里一个原始值可以是一个数字,一个字符串,或者稍微复杂的一个函数引用。然后,S 表达式表示,它被包含在括号中,并且可以包含其他 S 表达式。

有趣的是,空格完全是无关紧要的。这意味着:

( function   sayHello   ( name )   ( print   "Hello,   "   name   ".   The   meaning   of   life   the   universe   and   everything   is   "   lifeUniverseAndEverything ) )

( function sayHello ( name ) ( print "Hello,   " name ".   The   meaning   of   life   the   universe   and   everything   is   " lifeUniverseAndEverything ) )

在 Lel 中都是有效的,但我绝对不会建议格式化代码。使用空格将逻辑部分组合在一起是最有意义的。

无论如何,来看看一个 If 判断语句:

( if   (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值