口译员:处理包括/进口

时间:2010-04-09 16:30:45

标签: c++ language-design interpreter

我已经用C ++构建了一个解释器,到目前为止一切正常,但现在我已经陷入了导入/包含/你想要称之为函数的设计。

我想到了以下内容:

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

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

现在我的问题:

  • 我该怎么办?
  • 现代口译员(Python / Ruby)如何处理这个问题?他们是否允许有条件的包含?

1 个答案:

答案 0 :(得分:3)

如果你有一个干净的设计并且你知道你在做什么,这个问题很容易解决。否则可能会非常困难。我写过至少6个解释器,都有这个功能,而且相当简单。

  1. 您的口译员需要维护一个环境,它知道已定义的所有全局变量,函数,类型等。将这称为“符号表”可能会让您感觉更舒服。

  2. 您需要定义一个读取文件并更新环境的内部函数。根据您的语言设计,您在阅读内容时可能会或可能不会进行一些评估。我的口译员非常有活力,并在阅读后立即评估每个定义。

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

    • Tokenizer(将输入分解为令牌)
    • Parser(一次读取一个令牌,转换为抽象语法树)
    • Evaluator(读取抽象语法并更新环境)
  4. 抽象语法树真的是关键。如果你有这个,当你在输入中遇到import / include构造时,你只需要进行递归调用并获得更抽象的语法。您可以在解析器或评估程序中执行此操作。如果需要条件导入,则必须在求值程序中执行,因为只有求值程序才能计算条件。

    网站上有

    Source code for my interpreters。其中两个是用C语言写的;其他的都是用标准ML编写的。