首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用编程语言管理库和导入

问用编程语言管理库和导入
EN

Stack Overflow用户
提问于 2010-04-03 12:21:17
回答 3查看 139关注 0票数 0

我在C++中为一种愚蠢的编程语言创建了一个解释器,并完成了整个核心结构(Tokenizer、Parser、解释器包括符号表、核心函数等)。

现在,我在为这个解释器创建和管理函数库时遇到了问题(稍后我将解释我的意思)

所以目前我的核心函数处理程序是可怕的。

代码语言:javascript
复制
// 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,它是从该语言的程序中导入的,例如:

代码语言:javascript
复制
import string
myString = "abcde"
print string.at( myString, 2 ) # output: c

我的问题:

  • 如何将函数库从核心解释器中分离出来并加载它们?
  • 如何将所有函数放入列表并在需要时将其添加到符号表中?

我想做的是:

在解释器开始时,由于所有库都是用解释器编译的,每个函数都调用类似于RegisterFunction( string namespace, myLangResult (*functionPtr) );的函数,后者将自己添加到列表中。然后在语言中调用import X时,使用RegisterFunction构建的列表将被添加到符号表中。

想到的缺点是:

所有库都直接在解释器核心中,大小会增加,而且肯定会减慢速度。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-03 12:28:40

如果您的解释器是作为库实现的,则将从其他人的C++代码中调用它。他们必须从自己的代码调用库中的函数来向解释器添加函数,这并不是不合理的。这是我自己的表达式计算器做的。在用户代码中如下所示:

代码语言:javascript
复制
Interpreter in;    // an instance of the interpreter
in.AddFunc( lenfun, "length", 1 );
in.AddFunc( catfun, "concat", 2 );

其中,调用方必须提供指向实现函数的指针,以及函数的名称和参数数。这对非类型化的设置很好--如果您做了严格的输入,当然还有很多工作要做。

票数 1
EN

Stack Overflow用户

发布于 2010-04-03 12:26:42

我认为您应该研究一下Command模式。然后,您可以将每个函数实现为Command,并有一个映射,该映射将函数名映射到Command对象。

这还将使您能够从外部库中加载其他函数,方法是让每个库都有一个初始化函数,该函数将其函数添加到映射中。

票数 1
EN

Stack Overflow用户

发布于 2010-04-03 13:25:30

目前还不清楚你的目标是一个功能齐全的编程语言朗,或者这是一个玩具,所以我不知道你想花多少时间在这上面。我怀疑动态库加载会比您需要的要复杂得多。您可能需要一个库位置的路径列表,或者需要注册名称空间-这使您回到了现在的位置。

一种更简单的方法是保留一个带有关联处理程序的全局符号表。

使用std::map (或hash_map)进行比if/else构造更快的函数查找。让所有函数在符号表中注册。

存储在符号表中的“处理程序”可以是简单对象(或函数指针),并且可以自己进行参数检查。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2571225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档