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

我考虑了以下几点:

  • 处理包括在 token 化过程中:当在代码中找到include时,将使用指定的文件名递归调用 token 化函数。然后将include d文件的标记化代码添加到include的先前位置。
    缺点:无条件in​​clude(!)
  • 处理过程包括口译过程:我不知道如何做。我所知道的是,PHP must可以这样做,因为有条件的包含是可能的。

  • 现在我的问题是:
  • 我应该如何处理包含?
  • 现代解释器(Python / Ruby)如何处理此问题?他们是否允许条件包含?
  • 最佳答案

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

  • 您的解释器需要维护一个已知所有已定义的全局变量,函数,类型等的环境。您称它为“符号表”可能会更自在。
  • 您需要定义一个内部函数来读取文件并更新环境。视您的语言设计而定,您读入内容时可能会或可能不会做一些评估。我的解释器非常动态,并且在读入每个定义后立即对其进行评估。
  • 如果您将解释器分层构建,您的生活将变得更加轻松:
  • token 生成器(将输入分为 token )
  • 解析器(一次读取一个 token ,转换为抽象语法树)
  • 评估程序(读取抽象语法并更新环境)

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

    Source code for my interpreters在网络上。其中两个是用C语言编写的;其他的则用Standard ML编写。

    关于c++ - 解释器:处理包含/导入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2609145/

    10-12 15:06
    查看更多