【发布时间】:2010-04-03 12:21:17
【问题描述】:
我用 C++ 为一门愚蠢的编程语言创建了一个解释器,整个核心结构都完成了(标记器、解析器、解释器,包括符号表、核心函数等)。
现在我在为这个解释器创建和管理函数库时遇到了问题(我稍后会解释我的意思)
所以目前我的核心函数处理程序是可怕的:
// 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 个,那么每个其他的。无法维护,感觉很糟糕,很可怕。
所以我想:如何创建某种包含所有函数的库,如果它们被导入,则初始化它们自己并将它们的函数添加到正在运行的解释器的符号表中。
但是,这就是我真的不知道该怎么做的地方。
我想要实现的是,例如:我的语言的(外部?)字符串库,例如:字符串,并且它是从该语言的程序中导入的,例如:
import string
myString = "abcde"
print string.at( myString, 2 ) # output: c
我的问题:
- 如何将函数库与核心解释器分离并加载?
- 如何将它们的所有函数放入一个列表中,并在需要时将其添加到符号表中?
我想做什么:
在解释器启动时,所有库都用它编译,每个函数都会调用类似RegisterFunction( string namespace, myLangResult (*functionPtr) ); 的东西,它将自己添加到列表中。当从语言中调用import X 时,使用RegisterFunction 构建的列表随后被添加到符号表中。
想到的缺点:
所有库都直接在解释器核心中,大小会增长,它肯定会减慢速度。
【问题讨论】:
标签: c++ design-patterns interpreter