2009-12-18 76 views
14

我决定在Ruby中编写一个小型的解释器作为我的下一个项目。我需要什么知识/技能才能成功?
我还没有决定要解释的语言,但我正在寻找一些不是玩具语言的东西,但是为了编写解释器会相对容易。 在此先感谢。如何撰写口译员?

+0

呵呵?如果没有决定这个语言,你怎么知道?有些解释可能非常简单,即使使用库... – 2009-12-18 07:29:32

+0

我认为在Lisp中编写Ruby解释器比反编译容易得多。 – Svante 2009-12-18 08:01:21

+0

Svante,我不太确定。 – 2009-12-18 08:50:11

回答

29

你必须学会​​至少:

  • 词法分析(分组字符转换为标记)
  • 解析(分组令牌连成结构)
  • 抽象语法树(代表数据程序结构结构)
  • 数据表示(假设您的语言将有变量)
  • “运行”您的程序的评估循环

在介绍性文字Structure and Interpretation of Computer Programs中可以找到有关这些主题的优秀介绍。该书中使用的语言是Scheme,它是一种健壮,精心指定的语言,非常适合您的第一个解释器实现。强烈推荐。

+0

感谢您的好评。只是好奇,你认为需要多长时间才能完成一个简单的工作翻译? – bennybdbc 2009-12-18 11:36:35

+2

该问题的答案取决于许多因素,其中最重要的是:(a)执行人员的经验水平,以及(b)解释语言的选择。也许(c)实现语言的选择。作为一个粗略的猜测,对于一个学习这些技术的中级程序员,我可能会说几个星期的专门工作。 – 2009-12-18 11:58:47

1

这不是太难。这是一个LISP interpreter in ruby,源代码太小,你应该复制/粘贴它。但你现在要学习LISP吗?呵呵。

5

我还没有决定对语言尚未解释,但我期待的 东西是不是一个玩具语言,但会比较容易编写的 口译。提前致谢。

尝试Lisp的一些方言,如Scheme或Clojure。 (现在有个想法:Clojure-in-Ruby,与Ruby集成以及Clojure在Java中实现)。

使用Lisp,没有必要打扰语法的特性,因为Lisp的语法更接近于抽象语法树。

+1

Clorure听起来像Scooby Doo会挖掘的语言。 – FMc 2009-12-18 07:45:19

+0

已完成http://www.springerlink.com/content/q3n77q7172831288/和http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red – 2010-07-29 20:42:24

2

This SICP chapter显示了如何在Lisp(一个metacircular评估器)中编写一个Lisp解释器。在我看来,这是最好的开始。然后,您可以转到Lisp in Small Pieces以了解如何为Lisp编写高级解释器和编译器。实现像Lisp这样的语言(在Lisp本身!)的优点是你可以免费获得词法分析器,解析器,AST,数据/程序表示和REPL。你可以专注于让你的伟大语言工作的任务!

2

草案一两天以前也有过类似的想法。 LISP是迄今为止最容易实现的语法,因为语法非常简单,并且语言操作的数据结构与编写代码的结构相同。因此,只需要最少的实现,并且可以根据本身。

但是,如果您想了解解析,您可能需要使用抽象语法树等来执行更复杂的语言。

如果你想看看我的(实际上是两天前)lisp的Java实现,请查看mylisp.googlecode.com。我仍然在努力,但是让现有的东西工作需要多少时间是不可思议的。

1

如果你只是这样做的乐趣,弥补自己的,简单的语言,只是尝试。我的建议是像一个非常简单的经典BASIC(没有视觉基本或面向对象的东西)。使用行号,GOTO,INPUT和PRINT即可。你需要做的基本知识,你会更好地了解事情的工作。

您需要的知识?

  • 符号化(转向字符是大块为更有效地读取,有效地分裂它分为“字”)
  • 解析(打算在令牌和建设从它的数据结构)
  • 解读(循环数据结构并执行每个命令)

对于最后一个,您还需要一种方法来保持变量。通常你只需要实现一个“堆栈”,一个巨大的数据块,你可以在最后标记一个区域。

1

这不是Lisp中实现,但我发现Write Yourself A Scheme in 48 Hours是一个非常有用的文件,而我是用哈斯克尔开始了(虽然我没有在任何地方获得近48小时后完成它;因人而异)。它也让你对一般口译有很多见解。