怎么写口译员?

时间:2009-12-18 07:25:24

标签: ruby lisp interpreter

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

10 个答案:

答案 0 :(得分:30)

你必须至少学习:

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

可以在介绍性文本Structure and Interpretation of Computer Programs中找到对其中一些主题的精彩介绍。该书中使用的语言是Scheme,它是一种强大的,指定良好的语言,非常适合您的第一个解释器实现。强烈推荐。

答案 1 :(得分:5)

  

我还没有确定要解释的语言,但我正在寻找   不是玩具语言的东西,但写起来比较容易   口译员。提前谢谢。

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

你需要的知识?

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

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

答案 8 :(得分:1)

在Lisp中没有实现,但是当我开始使用Haskell时,我发现Write Yourself A Scheme in 48 Hours是一个非常有用的文档(虽然我在48之后没有接近完成它小时; YMMV)。它还为您提供了大量有关口译员的见解。

答案 9 :(得分:0)

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

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