自制计算机语言,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 (
自制计算机语言,3个步骤实现简单语言解释器(自制简易编程语言)相关推荐
- 运行一个c语言程序主要包括哪些步骤,运行C语言程序的步骤.doc
运行C语言程序的步骤 运行C语言程序的编辑(把程序代码输入,交给计算机).编译(成目标程序文件.obj).是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2 ...
- 简单c语语言游戏教案大全,简单语言领域教案策划方案集锦
幼儿时期是人语言能力发展的黄金时期,语言作为一种思维工具和交往工具,始终伴随着幼儿的生活,以下是小编精心收集整理的幼儿园大班语言教案,下面小编就和大家分享,来欣赏一下吧. 幼儿园大班语言教案篇1 活动 ...
- R语言置换检验(permutation tests、响应变量是否独立于组、两个数值变量是独立的吗、两个分类变量是独立的吗)、置换检验的基本步骤、R语言自助法Bootstrapping计算置信区间
R语言置换检验(permutation tests.响应变量是否独立于组.两个数值变量是独立的吗.两个分类变量是独立的吗).置换检验的基本步骤.R语言自助法Bootstrapping.自助法计算单个统 ...
- axios 使用步骤很简单,首先在前端项目中,引入 axios:
2019独角兽企业重金招聘Python工程师标准>>> 前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources ...
- 几何语言点C是ab的中点,备战中考:初中数学作图基本步骤及作图语言
尺规作图的基本步骤和作图语言 一.作线段等于已知线段 已知:线段a 求作:线段AB,使AB=a 作法: 1.作射线AC 2.在射线AC上截取AB=a ,则线段AB就是所要求作的线段 二.作角等于已知角 ...
- 「萌新上手Mac」安装软件,步骤超简单
回想起刚拿到Mac 时,安装软件的确是个让我手足无措的难题,不知道大家有没有同样的感受?这边就教大家Mac 安装软件的几种方法! Mac 安装软件方法一:从App Store 苹果在2011 年时释出 ...
- Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)
Git快速入门篇-- Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程) 前言:我们平时在整理代码的时候,尤其是与别人一起开发项目的时候,常常涉及到代码的更新,因此代码版本问 ...
- c语言程序水准路线,C++语言在水准路线简易平差中的应用实例(17页)-原创力文档...
C语言在水准路线简易平差中的应用实例C语言在水准路线简易平差中的应用实例 PAGE C++语言在水准路线简易平差中的应用实例 [摘 要]:水准测量工作分为野外数据采集和内业计算,白天测得的大量数据,晚 ...
- 【编译原理】构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 9.)(笔记)语法分析(未完,先搁置了!)
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 9.) 文章目录 spi.py spi_lexer 我记得当我在大学(很久以前) ...
最新文章
- mybatis mysql cursor_MySQL JDBC/MyBatis Stream方式读取SELECT超大结果集
- java警惕自增的陷阱
- 哎呀你不要把他叫出来_不吼不叫,学会这3个亲子互动方法,孩子不专注都难...
- Broadcom fullmac WLAN 驱动解析(1)
- 我去过细节印象最深的酒店
- 如何安装中文manpage
- 为什么要学习Linux内核,如何学习?
- java 新浪短链接_新浪t.cn短链接如何生成?网址缩短api接口分享
- 莫比乌斯反演入门题目(详细)
- Linux系统安装--LInix系统随笔(二)
- 全息投影助力餐厅,满足全新市场需求
- 编写程序,用户输入一个列表和2个整数作为下标,然后输出列表中介于2个下标之间的元素组成的子列表。考试题库7
- 【MySQL】——mysql系列之参数调优
- 打开EXCEL总提示 您尝试打开的文件*.xls格式与文件扩展名指定的格式不相符
- 一些关于java的学习心得
- maven 排除某个类_Maven依赖排除的问题和答案
- matlab空间计量模型AIC和SC,空间计量模型
- Flask Warning: (1366, Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...'
- [原创]HttpWatch工具简介及使用技巧
- Jenkins 构建定时任务后不触发构建
热门文章
- “谷歌杀手”发明者,科学天才 Wolfram
- 提醒!赶快弃掉这个区块链平台!
- Oracle 抄袭亚马逊的 API 是侵权吗?
- 为什么 ofo 彻底凉了?| 畅言
- 如何用编程得出泰坦尼克号生还者的年龄段?
- Google 推出数据集搜索!百度怎么看?
- 福利 | 2018 年,程序员全新的技术之路
- JavaScript 框架这一年:React、Angular 们正在互相渗透
- ======第一章总结及习题======
- 009.共享目录下VS编写的程序在linux下打开出现中文乱码