前段时间,我用 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   (

自制计算机语言,3个步骤实现简单语言解释器(自制简易编程语言)相关推荐

  1. 运行一个c语言程序主要包括哪些步骤,运行C语言程序的步骤.doc

    运行C语言程序的步骤 运行C语言程序的编辑(把程序代码输入,交给计算机).编译(成目标程序文件.obj).是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2 ...

  2. 简单c语语言游戏教案大全,简单语言领域教案策划方案集锦

    幼儿时期是人语言能力发展的黄金时期,语言作为一种思维工具和交往工具,始终伴随着幼儿的生活,以下是小编精心收集整理的幼儿园大班语言教案,下面小编就和大家分享,来欣赏一下吧. 幼儿园大班语言教案篇1 活动 ...

  3. R语言置换检验(permutation tests、响应变量是否独立于组、两个数值变量是独立的吗、两个分类变量是独立的吗)、置换检验的基本步骤、R语言自助法Bootstrapping计算置信区间

    R语言置换检验(permutation tests.响应变量是否独立于组.两个数值变量是独立的吗.两个分类变量是独立的吗).置换检验的基本步骤.R语言自助法Bootstrapping.自助法计算单个统 ...

  4. axios 使用步骤很简单,首先在前端项目中,引入 axios:

    2019独角兽企业重金招聘Python工程师标准>>> 前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources ...

  5. 几何语言点C是ab的中点,备战中考:初中数学作图基本步骤及作图语言

    尺规作图的基本步骤和作图语言 一.作线段等于已知线段 已知:线段a 求作:线段AB,使AB=a 作法: 1.作射线AC 2.在射线AC上截取AB=a ,则线段AB就是所要求作的线段 二.作角等于已知角 ...

  6. 「萌新上手Mac」安装软件,步骤超简单

    回想起刚拿到Mac 时,安装软件的确是个让我手足无措的难题,不知道大家有没有同样的感受?这边就教大家Mac 安装软件的几种方法! Mac 安装软件方法一:从App Store 苹果在2011 年时释出 ...

  7. Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)

    Git快速入门篇-- Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程) 前言:我们平时在整理代码的时候,尤其是与别人一起开发项目的时候,常常涉及到代码的更新,因此代码版本问 ...

  8. c语言程序水准路线,C++语言在水准路线简易平差中的应用实例(17页)-原创力文档...

    C语言在水准路线简易平差中的应用实例C语言在水准路线简易平差中的应用实例 PAGE C++语言在水准路线简易平差中的应用实例 [摘 要]:水准测量工作分为野外数据采集和内业计算,白天测得的大量数据,晚 ...

  9. 【编译原理】构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 9.)(笔记)语法分析(未完,先搁置了!)

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 9.) 文章目录 spi.py spi_lexer 我记得当我在大学(很久以前) ...

最新文章

  1. mybatis mysql cursor_MySQL JDBC/MyBatis Stream方式读取SELECT超大结果集
  2. java警惕自增的陷阱
  3. 哎呀你不要把他叫出来_不吼不叫,学会这3个亲子互动方法,孩子不专注都难...
  4. Broadcom fullmac WLAN 驱动解析(1)
  5. 我去过细节印象最深的酒店
  6. 如何安装中文manpage
  7. 为什么要学习Linux内核,如何学习?
  8. java 新浪短链接_新浪t.cn短链接如何生成?网址缩短api接口分享
  9. 莫比乌斯反演入门题目(详细)
  10. Linux系统安装--LInix系统随笔(二)
  11. 全息投影助力餐厅,满足全新市场需求
  12. 编写程序,用户输入一个列表和2个整数作为下标,然后输出列表中介于2个下标之间的元素组成的子列表。考试题库7
  13. 【MySQL】——mysql系列之参数调优
  14. 打开EXCEL总提示 您尝试打开的文件*.xls格式与文件扩展名指定的格式不相符
  15. 一些关于java的学习心得
  16. maven 排除某个类_Maven依赖排除的问题和答案
  17. matlab空间计量模型AIC和SC,空间计量模型
  18. Flask Warning: (1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...'
  19. [原创]HttpWatch工具简介及使用技巧
  20. Jenkins 构建定时任务后不触发构建

热门文章

  1. “谷歌杀手”发明者,科学天才 Wolfram
  2. 提醒!赶快弃掉这个区块链平台!
  3. Oracle 抄袭亚马逊的 API 是侵权吗?
  4. 为什么 ofo 彻底凉了?| 畅言
  5. 如何用编程得出泰坦尼克号生还者的年龄段?
  6. Google 推出数据集搜索!百度怎么看?
  7. 福利 | 2018 年,程序员全新的技术之路
  8. JavaScript 框架这一年:React、Angular 们正在互相渗透
  9. ======第一章总结及习题======
  10. 009.共享目录下VS编写的程序在linux下打开出现中文乱码