我已经用C ++构建了一个解释器,到目前为止一切正常,但现在我已经陷入了导入/包含/你想要称之为函数的设计。
我想到了以下内容:
处理包括在标记化过程中:当代码中找到include
时,将使用指定的文件名递归调用标记化函数。然后将include
d文件的标记化代码添加到包含的先前位置。
缺点:无条件包括(!)
处理包括在口译过程中:我不知道如何处理。我所知道的是PHP must
这样做,因为条件包含是可能的。
现在我的问题:
答案 0 :(得分:3)
如果你有一个干净的设计并且你知道你在做什么,这个问题很容易解决。否则可能会非常困难。我写过至少6个解释器,都有这个功能,而且相当简单。
您的口译员需要维护一个环境,它知道已定义的所有全局变量,函数,类型等。将这称为“符号表”可能会让您感觉更舒服。
您需要定义一个读取文件并更新环境的内部函数。根据您的语言设计,您在阅读内容时可能会或可能不会进行一些评估。我的口译员非常有活力,并在阅读后立即评估每个定义。
如果你的解释器分层次构建,你的生活会变得无比轻松:
抽象语法树真的是关键。如果你有这个,当你在输入中遇到import / include构造时,你只需要进行递归调用并获得更抽象的语法。您可以在解析器或评估程序中执行此操作。如果需要条件导入,则必须在求值程序中执行,因为只有求值程序才能计算条件。
网站上有Source code for my interpreters。其中两个是用C语言写的;其他的都是用标准ML编写的。