怎么写口译员?

我决定用Ruby编写一个小解释器作为我的下一个项目。 我需要什么样的知识/技能才能获得成功?
我还没有确定要解释的语言,但是我正在寻找一种不是玩具语言的东西,但是为它编写翻译会相对容易。 提前致谢。

你至少要学习:

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

其中一些主题的精彩介绍可以在计算机程序的结构和解释的介绍性文本中找到。 该书中使用的语言是Scheme,它是一种强大的,指定良好的语言,非常适合您的第一个解释器实现。 强烈推荐。

我还没有确定要解释的语言,但是我正在寻找一种不是玩具语言的东西,但是为它编写翻译会相对容易。 提前致谢。

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

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

这个SICP章节展示了如何在Lisp中编写一个Lisp解释器(一个metacircular评估器)。 在我看来,这是最好的起点。 然后你可以继续使用Lisp in Small Pieces来学习如何为Lisp编写高级解释器和编译器。 实现像Lisp这样的语言(在Lisp本身!中)的优点是你可以免费获得词法分析器,解析器,AST,数据/程序表示和REPL。 您可以专注于让您的优秀语言运作的任务!

有一个树顶项目可以帮助你http://treetop.rubyforge.org/

您可以查看Ruby草案规范http://ruby-std.netlab.jp/

几天前我有类似的想法。 到目前为止,LISP是最容易实现的,因为语法非常简单,语言操作的数据结构与编写代码的结构相同。因此,您只需要一个最小的实现,并且可以根据本身。

但是,如果您正在尝试学习解析,则可能需要使用抽象语法树等执行更复杂的语言。

如果你想查看我的(字面上两天)Java实现的lisp,请查看mylisp.googlecode.com 。 我还在努力,但令人难以置信的是,让现有的东西工作的时间有多短。

这并不难。 这是一个ruby的LISP解释器,源代码很小,你应该复制/粘贴它。 但是你现在要学习LISP吗? 呵呵。

如果您只是为了好玩而这样做,请编写您自己的简单语言,然后尝试一下。 我的建议就像一个非常简单的经典BASIC(没有视觉基础或面向对象的东西)。 使用行号,GOTO,INPUT和PRINT就是这样。 您可以完成基础知识,并且可以更好地理解事物的运作方式。

你需要的知识?

  • 令牌化(将大量字符转化为更有效的可读性,有效地将其分解为“单词”)
  • 解析(遍历令牌并从中构建数据结构)
  • 解释(循环数据结构并执行每个命令)

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

它没有在Lisp中实现 ,但我在48小时内发现自己写一个方案是一个非常有用的文档,而我开始使用Haskell(尽管我在48小时之后没有接近完成它; YMMV)。 它还为您提供了大量有关口译员的见解。

我可以推荐这本书。 它讨论了编写解析器和解释器的模式等等:

http://www.amazon.co.uk/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=language+implementation+patterns&x=0&y=0