C ++中的解释器:函数表存储问题

时间:2010-04-04 19:52:43

标签: c++ design-patterns interpreter

在我的翻译中,我有内置函数,如print exit input等语言。 显然可以从语言内部访问这些函数。然后,解释器在向量中查找具有正确名称的相应函数,并通过存储有其名称的指针调用它。

因此,我将所有这些功能收集在io.cppstring.cpparithmetic.cpp等文件中。但是我必须将每个函数添加到解释器中的函数列表中,以便找到它。

所以在这些函数文件中我有类似的东西:

void print( arg )
{
     cout << arg.ToString;
}

我将这个打印功能添加到解释器功能列表中:

interpreter.AddFunc( "print", print );
  • 但我应该在哪里拨打interpreter.AddFunc

我不能把它放在print函数下面,因为它必须是根据C ++语法的函数。

  • 所有功能应该在何处以及如何添加到列表中?

3 个答案:

答案 0 :(得分:2)

在每个模块(io,string等)中,定义一个用解释器注册模块的方法,例如:

void IOModule::Register(Interpreter &interpreter) {
    interpreter.AddFunc( "print", print );
    //...
}

如果您的模块未在类中实现,这也可以是正常的函数。

然后在应用程序的主初始化中,调用所有模块的寄存器方法。

这种方法有助于保持模块化:主应用程序初始化需要知道存在哪些模块,但导出哪些函数的细节留给模块本身。

答案 1 :(得分:1)

最简单的方法是将map函数名称保存到函数指针并在程序启动时加载 。您已将函数链接到解释器可执行文件中,因此在调用main()时可以访问它们。

您还可以提出一种方案,其中函数在动态库中隐藏(.dll.so,具体取决于平台),并且一些配置文件将函数名称映射到库/入口点。 / p>

答案 2 :(得分:1)

每个翻译都包含所有内容吗?如果是这样,我建议在构造函数中添加它(假设解释器是一个对象)或init方法。

如果没有,您可能需要考虑在您的语言中添加“include”类型指令。然后在遇到include指令时执行此操作。