我在C++中为一种愚蠢的编程语言创建了一个解释器,并完成了整个核心结构(Tokenizer、Parser、解释器包括符号表、核心函数等)。
现在,我在为这个解释器创建和管理函数库时遇到了问题(稍后我将解释我的意思)
所以目前我的核心函数处理程序是可怕的。
// Simplified version
myLangResult SystemFunction( name, argc, argv )
{
if ( name == "print" )
{
if( argc < 1 )
{
Error('blah');
}
cout << argv[ 0 ];
} else if ( name == "input" ) {
if( argc < 1 )
{
Error('blah');
}
string res;
getline( cin, res );
SetVariable( argv[ 0 ], res );
} else if ( name == "exit ) {
exit( 0 );
}现在想一想,如果是原来的10倍,还有25种系统功能。无法维护,感觉很可怕,很可怕。
所以我想:如何创建一些包含所有函数的库,如果它们是导入的,初始化它们自己,并将它们的函数添加到运行解释器的符号表中。
然而,这一点我真的不知道如何继续下去。
我想要实现的是有这样一个例子:a (extern?)用于我的语言的字符串库,例如: string,它是从该语言的程序中导入的,例如:
import string
myString = "abcde"
print string.at( myString, 2 ) # output: c我的问题:
我想做的是:
在解释器开始时,由于所有库都是用解释器编译的,每个函数都调用类似于RegisterFunction( string namespace, myLangResult (*functionPtr) );的函数,后者将自己添加到列表中。然后在语言中调用import X时,使用RegisterFunction构建的列表将被添加到符号表中。
想到的缺点是:
所有库都直接在解释器核心中,大小会增加,而且肯定会减慢速度。
发布于 2010-04-03 12:28:40
如果您的解释器是作为库实现的,则将从其他人的C++代码中调用它。他们必须从自己的代码调用库中的函数来向解释器添加函数,这并不是不合理的。这是我自己的表达式计算器做的。在用户代码中如下所示:
Interpreter in; // an instance of the interpreter
in.AddFunc( lenfun, "length", 1 );
in.AddFunc( catfun, "concat", 2 );其中,调用方必须提供指向实现函数的指针,以及函数的名称和参数数。这对非类型化的设置很好--如果您做了严格的输入,当然还有很多工作要做。
发布于 2010-04-03 12:26:42
我认为您应该研究一下Command模式。然后,您可以将每个函数实现为Command,并有一个映射,该映射将函数名映射到Command对象。
这还将使您能够从外部库中加载其他函数,方法是让每个库都有一个初始化函数,该函数将其函数添加到映射中。
发布于 2010-04-03 13:25:30
目前还不清楚你的目标是一个功能齐全的编程语言朗,或者这是一个玩具,所以我不知道你想花多少时间在这上面。我怀疑动态库加载会比您需要的要复杂得多。您可能需要一个库位置的路径列表,或者需要注册名称空间-这使您回到了现在的位置。
一种更简单的方法是保留一个带有关联处理程序的全局符号表。
使用std::map (或hash_map)进行比if/else构造更快的函数查找。让所有函数在符号表中注册。
存储在符号表中的“处理程序”可以是简单对象(或函数指针),并且可以自己进行参数检查。
class FuncHandler {
virtual MyLangResult Run(argv, argc) = 0;
}
typedef std::map<string, FuncHandler*> FuncTableType;
// Simplified version
myLangResult SystemFunction(name, argc, argv )
{
FuncTableType::const_iterator it = function_table_.find(name);
if (it == function_table_.end()) return Error("Unknown function: " + name);
return it->second(argc, argv);
}我编写了一些代码来执行这个问题中的类的自注册,但在这里不一定需要它:Accessing C++ Functions From Text storage
https://stackoverflow.com/questions/2571225
复制相似问题