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

本文介绍了如何用3个步骤实现一个简单的编程语言解释器,以Lel(Layout Expression Language)为例。步骤包括:标记化源代码成标记、解析标记为树形结构、评估表达式。Lel基于Lisp语法,使用S表达式。文章详细阐述了每个步骤的实现原理,并给出了代码示例。
摘要由CSDN通过智能技术生成
本文讲的是 3个步骤实现简单语言解释器(自制简易编程语言)

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
))
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值