在我的翻译中,我有内置函数,如print
exit
input
等语言。
显然可以从语言内部访问这些函数。然后,解释器在向量中查找具有正确名称的相应函数,并通过存储有其名称的指针调用它。
因此,我将所有这些功能收集在io.cpp
,string.cpp
,arithmetic.cpp
等文件中。但是我必须将每个函数添加到解释器中的函数列表中,以便找到它。
所以在这些函数文件中我有类似的东西:
void print( arg )
{
cout << arg.ToString;
}
我将这个打印功能添加到解释器功能列表中:
interpreter.AddFunc( "print", print );
interpreter.AddFunc
?我不能把它放在print函数下面,因为它必须是根据C ++语法的函数。
答案 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指令时执行此操作。