【问题标题】:How to write an interpreter?如何编写解释器?
【发布时间】:2009-12-18 07:25:23
【问题描述】:

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

【问题讨论】:

标签: ruby lisp interpreter


【解决方案1】:

你至少要学习:

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

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

【讨论】:

  • 感谢您的出色回答。只是好奇,您认为完成一个简单的工作口译员需要多长时间?
  • 这个问题的答案取决于许多因素,其中最重要的是:(a) 执行人员的经验水平,以及 (b) 解释语言的选择。也可能是(c)实现语言的选择。作为一个粗略的猜测,对于一个学习这些技术的中级程序员来说,我可能会说几个星期的专注工作。
【解决方案2】:

我还没有决定要翻译的语言,但我正在寻找 不是玩具语言,但相对容易编写 口译员。提前致谢。

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

使用 Lisp,无需担心语法的特殊性,因为 Lisp 的语法更接近于抽象语法树。

【讨论】:

【解决方案3】:

This SICP chapter 展示了如何在 Lisp(元循环求值器)中编写 Lisp 解释器。在我看来,这是最好的起点。然后你可以转到Lisp in Small Pieces 学习如何为 Lisp 编写高级解释器和编译器。实现像 Lisp 这样的语言(在 Lisp 本身中!)的优势在于,您可以免费获得词法分析器、解析器、AST、数据/程序表示和 REPL。您可以专注于让您的出色语言发挥作用!

【讨论】:

    【解决方案4】:

    有一个树顶项目可以为您提供帮助http://treetop.rubyforge.org/

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        几天前我也有类似的想法。 LISP 是迄今为止最容易实现的,因为语法非常简单,并且该语言操作的数据结构与编写代码的结构相同。因此,您只需要一个最小的实现,并且可以根据以下方式定义其余部分自己。

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

        如果您想查看我的(实际上是两天前的)lisp Java 实现,请查看mylisp.googlecode.com。我仍在努力,但令人难以置信的是,让现有的东西开始工作的时间是如此之短。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            您需要的知识?

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

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

            【讨论】:

              【解决方案9】:

              它没有在 Lisp 中实现,但我发现 Write Yourself A Scheme in 48 Hours 在我开始使用 Haskell 时是一个非常有用的文档(尽管我在 48 小时后还没有完成它; YMMV)。它还可以让您深入了解口译员。

              【讨论】:

                【解决方案10】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-10-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多