【问题标题】:Interpreters: Handling includes/imports解释器:处理包含/导入
【发布时间】:2011-02-06 05:44:07
【问题描述】:

我已经用 C++ 构建了一个解释器,到目前为止一切正常,但现在我陷入了导入/包含/无论您想如何调用它的函数的设计。

我想到了以下几点:

  • 处理包括在标记化过程中:当在代码中找到include 时,使用指定的文件名递归调用标记化函数。然后将included 文件的标记化代码添加到包含的先前位置。 缺点:没有条件包含(!)

  • 在口译过程中处理包括:我不知道如何。我所知道的是 PHP must 这样做是因为条件包含是可能的。

现在我的问题:

  • 我应该如何处理包含?
  • 现代解释器(Python/Ruby)如何处理这个问题?他们允许有条件的包含吗?

【问题讨论】:

  • “缺点:没有条件包含(!)”我不知道这个条件一定成立。这将取决于您用于解析代码的抽象表示的性质。

标签: c++ language-design interpreter


【解决方案1】:

如果您有一个简洁的设计并且您知道自己在做什么,那么这个问题很容易解决。否则可能会非常困难。我已经写了至少 6 个解释器,它们都有这个功能,而且相当简单。

  1. 您的解释器需要维护一个了解所有已定义的全局变量、函数、类型等的环境。将其称为“符号表”可能会更舒服。

  2. 您需要定义一个读取文件并更新环境的内部函数。根据您的语言设计,您可能会或可能不会在读入内容的那一刻进行评估。我的解释器非常动态,并在读入每个定义后立即对其进行评估。

  3. 如果您将解释器分层构建,您的生活将会变得无比轻松:

    • 标记器(将输入分解为标记)
    • 解析器(一次读取一个标记,转换为抽象语法树)
    • 评估器(读取抽象语法并更新环境)

抽象语法树确实是关键。如果你有这个,当你在输入中遇到 import/include 构造时,你只需进行递归调用并获得更抽象的语法。您可以在解析器或评估器中执行此操作。如果要条件导入,则必须在求值器中进行,因为只有求值器才能计算条件。

Source code for my interpreters 在网络上。其中两个是用 C 编写的;其他的都是用标准 ML 编写的。

【讨论】:

  • 你要把讲义放回网上吗?我在其他地方读到随附的书应该在几年前出版。进展如何?
  • @Wei:我换了工作,这让这本书倒退了几年。目前我正在重写一些软件,并且正在编写第 8 章的新版本以及第 7 章的额外材料。明年春天我将再次教授 PL,并希望将草稿发送给他们周围的出版商。
  • 谢谢!是否可以阅读您的草稿,还是只有少数课程讲师可以阅读?
  • @Wei 有兴趣的可以发邮件给我 nr@cs.tufts.edu
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多