如何编写一个解释器?

15

我决定用Ruby编写一个小型解释器作为我的下一个项目。为了成功,我需要具备哪些知识/技能?
我还没有决定要解释的语言,但我正在寻找一个不是玩具语言,但相对容易编写解释器的语言。

提前感谢。


哎?如果还没有决定使用哪种语言,怎么能知道呢?有些可能非常简单,甚至可以使用库来解释... - Camilo Martin
2
@Svante:“Lisp”是一系列以少量函数为特征的语言。编写一个非常原始的Lisp解释器并不那么困难。我没有使用过Ruby,但它可能具有更多实际要求和更复杂的语法(因为几乎所有东西的语法都比Lisp更复杂)。 - David Thornley
1
编译器/解释器参考的标准列表:https://dev59.com/x3VD5IYBdhLWcg3wXaed。此外还有多个重复的问题。 严肃:https://dev59.com/b0rSa4cB1Zd3GeqPWGzf https://dev59.com/yXI-5IYBdhLWcg3w8NSB https://dev59.com/D3I_5IYBdhLWcg3wK_s6 https://dev59.com/oUnSa4cB1Zd3GeqPN2sv 趣味:https://dev59.com/w3I-5IYBdhLWcg3wlpeW http://stackoverflow.com/questions/1253258/ - dmckee --- ex-moderator kitten
@dmckee:在我提问之前,我已经看过你建议的大部分问题,如果不是全部的话。但我发现它们大多集中于编写编译器,而不是解释器。 - bennybdbc
我喜欢的除了第一个之外,都是解释器问题,而且问题都是相同的。 - dmckee --- ex-moderator kitten
显示剩余3条评论
10个回答

30
您将需要学习至少以下内容:
  • 词法分析(将字符分组为标记)
  • 解析(将标记组合成结构)
  • 抽象语法树(用数据结构表示程序结构)
  • 数据表示(假设您的语言将具有变量)
  • 运行您的程序的评估循环

一些这些主题的优秀介绍可以在入门文本《计算机程序的构造和解释》中找到。该书使用的语言是Scheme,它是一个功能强大、规范良好的语言,非常适合作为您第一个解释器实现的选择。强烈推荐。


谢谢你的好回答。只是好奇,你认为完成一个简单的工作解释器需要多长时间? - bennybdbc
2
那个问题的答案取决于许多因素,其中最重要的是:(a)实施人员的经验水平,以及(b)解释语言的选择。也许还有(c)实现语言的选择。作为一个完全粗略的猜测,对于学习技术的中级程序员,我可能会说需要几周的专注工作。 - Greg Hewgill

5
我还没有决定要解释的语言,但我正在寻找一种不是玩具语言,但相对容易编写解释器的语言。谢谢提前。

尝试使用Lisp的某个方言,如Scheme或Clojure。(现在有一个想法:Clojure-in-Ruby,它可以像Clojure与Java一样与Ruby集成。)

使用Lisp,无需烦恼于语法的怪异性,因为Lisp的语法更接近抽象语法树。


1
Clorure听起来像是Scooby Doo会喜欢的语言。 - FMc
已经完成 http://www.springerlink.com/content/q3n77q7172831288/ 和 http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red - Joshua Fox

2

这个SICP章节展示了如何在Lisp中写一个Lisp解释器(元循环求值器)。我认为这是最好的开始。然后你可以继续学习《Lisp实现解析》,学习如何为Lisp编写高级解释器和编译器。在Lisp中实现像Lisp这样的语言的优点是你可以免费获得词法分析器、解析器、AST、数据/程序表示和REPL。这样你可以集中精力完成你伟大的语言!


2

有一个名为 Tree top 的项目,对于您可能会有所帮助。您可以访问以下链接了解更多信息:http://treetop.rubyforge.org/


2

2
我几天前也有类似的想法。LISP是最容易实现的语言,因为其语法非常简单,而且语言操作的数据结构与代码编写的结构相同。因此,你只需要进行最小的实现,就可以通过自身来定义其他内容。
然而,如果你正在尝试学习解析,你可能需要使用更复杂的语言,如抽象语法树等。
如果你想查看我的(刚刚两天)Java实现的lisp,请访问mylisp.googlecode.com。我仍在努力完善它,但已经很惊奇于让现有的东西运行起来所需的时间是多么短暂。

1

这并不是太难。这里有一个Ruby中的LISP解释器,源代码非常小,你可以复制/粘贴它。但是你现在要学习LISP吗?呵呵。


1
如果你只是为了好玩而做这个,那就自己编一个简单的语言试试。我的建议是选择非常简单的经典BASIC(不要使用Visual Basic或面向对象的东西),带有行号、GOTO、INPUT和PRINT等基础指令,这样你可以掌握基本操作,并更好地理解工作原理。
你需要掌握的知识包括:
- Tokenizing(将一大段字符转换为更易读的内容,有效地将其分割成“单词”); - Parsing(遍历这些单词并从中构建数据结构); - Interpreting(循环遍历数据结构并执行每个命令)。
对于最后一个,你还需要一种方法来存储变量。通常你可以实现一个“堆栈”,一个大块数据,可以在末尾标记出一个区域。

1

虽然Lisp中没有实现,但我发现48小时自制Scheme对我开始学习Haskell非常有用(尽管我在48小时内没有完成它;结果可能因人而异)。它还能让你深入了解解释器的一般情况。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接