怎样写一个解释器

我这个标题起的有一些不厚道,与大神的文章同名,倒不是因为我自比大神,是因为这两个说的是同一个东西。

简单地说,这篇是我在学习了 eopl 前面三章之后,把里面课后作业的解释器的构建过程,拿出来给团队同事们介绍一遍,并且从两条最简单的语法规则开始(输入一个字符串,返回一个数字),逐步完成书中介绍的 ``let-lang‘‘ 的全部语法:

在这个简单的解释器里面,介绍了 AST, environement, closure 等名词,会使你了解一些平时困扰你的问题,比如 pyhton 的 lambda 中为什么不能只写一条 print。

这个 slides 是用 beamer 写成的,所以只有 pdf 格式了,如果对你有帮助,欢迎你拿去使用。里面有错误的话,可以邮件我: [email protected] .

sildes 下载地址:地址1 地址2

时间: 2025-01-05 05:59:11

怎样写一个解释器的相关文章

如何写一个解释器(1):编译原理

最近在看DSL的东西,对于外部DSL,写一个解释器是必不可少的.我试图归纳一下我学到的,以写一个解释器为目标,讲一下如果来实现一个可用的解释器.一个解释器通常可以分为一下几个阶段: 词法分析(Lexer) 语法分析(Parser, BNF, CFG, AST) 语义分析(AST的处理, annotated AST) 目标语言生成(stack-based) 这里的解释器不包括目标语言的执行和运行时环境,如果需要类似于python/ruby的解析执行器的话,还需要bytecode-compiler,

王垠:怎样写一个解释器

卖了好久关子了,说要写一个程序语言理论的入门读物,可是一直没有下笔.终于狠下心来兑现一部分承诺.今天就从解释器讲起吧. 解释器是比较深入的内容.虽然我试图从最基本的原理讲起,尽量让这篇文章不依赖于其它的知识,但是这篇教程并不是针对函数式编程的入门,所以我假设 你已经学会了最基本的 Scheme 和函数式编程.如果你完全不了解这些,可以读一下< SICP | 计算机程序的构造和解释> 的第一,二章.当然你也可以继续读这篇文章,有不懂的地方再去查资料.我在这里也会讲递归和模式匹配的原理.如果你已经

python 写一个scheme解释器(一)

解释器的本质 ? 我们换一种语言来写解释器的时候,其实本质和scheme写scheme是一样的,即将输入的一串字符串作为源程序执行而语法和语义均由自己预先设计好并严格执行. ? 这里我们采用python 来实现我们的第二版的scheme解释器,首先python支持的列表推导式.lambda.模式匹配等语法糖十分适合去编写解释器,另一方面,python内置数据结构齐全,使用简单. 当然我们采用C++ 也是完全可行的,但由于C++对字符串的处理功能比较弱,并且不同类型数据的转换都需要手工去完成,实现

写一个简单的lisp解释器(1)

YouTube上看到了一个2004年版的SICP讲解 看完解释器那一个视频后,对解释器中的Eval和Apply有了基本的认识于是想开始直接写一个简单lisp的解释器 我的理解是: Eval是来求表达式的值的; Apply 则是用来求函数值的; 什么是表达式 ? atom 或者 a list of expression atom 包括 symbol number 还有 string number 和 string 都是代表它们自己 symbol 代表一个变量(variable) 它需要绑定一个值(

学了编译原理能否用 Java 写一个编译器或解释器?

16 个回答 默认排序? RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和解释器.其实用什么语言来实现编译器并不是最重要的部分(虽然Java也不是实现编译器最方便的语言),最初用啥语言都可以. 我在大学的时候,我们的软件工程和计算机科学的编译原理课的作业好像都是可以用Java来写的.反正我印象中我给这两门课写的作业都是用的Java. ===================

用C写一个web服务器(四) CGI协议

* { margin: 0; padding: 0 } body { font: 13.34px helvetica, arial, freesans, clean, sans-serif; color: black; line-height: 1.4em; background-color: #F8F8F8; padding: 0.7em } p { margin: 1em 0; line-height: 1.5em } table { font-size: inherit; font: 10

以鶸ice为例,手撸一个解释器(一)明确目标

代码地址 # HelloWorld.ice print("hello, world") 前言(废话) 其实从开始学习编译原理到现在已经有快半年的时间了,但是其间常常不能坚持看下去龙书(经常三天打鱼两天晒网,更何况每次打鱼不到半小时就累得不行又会放下书(笑)),截至到现在只勉强看完了前六章的部分,半年间其它事也没有做,其实想想上大学已经快两年了还是一事无成,知识也没有学到,不免觉得很羞愧. 暑假也要到了,这个学期马上也要结束了,临近大二结束之际,还是尝试着写一下以前想写的玩具吧,而本系列

手把手带你写一个minishell

先解释一下Shell : Shell是一个功能为命令行解释器的应用程序,连接了用户和Linux内核,让我们能高效和安全地使用Linux内核. 要写一个minishell,我们要先理解它的过程: 读取输入->>命令解析->>创建子进程->>(子进程)程序替换->>(父进程)进程等待 代码及注释如下: 1 //minishell: 2 //命令行解释器: 3 //从标准输入读取数据(scanf) ls -l -a 4 //ls----运行ls命令----ls命令

请写一个算法,用于将list集合内重复元素剔除

package Homework; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Scanner;/** * list集合是否可以包含重复元素? * 如果可以,请写一个算法,用于将list集合内重复元素剔除. * @author 张致远 * */public class Homework2 { public static void main(String[]