gpt4 book ai didi

c++ - 用编程语言管理库和导入

转载 作者:行者123 更新时间:2023-11-28 03:58:02 27 4
gpt4 key购买 nike

我已经为一种愚蠢的 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 个。无法维护,感觉很糟糕,很糟糕。

所以我想:如何创建某种包含所有函数的库,如果它们被导入,则初始化它们自己并将它们的函数添加到正在运行的解释器的符号表中。

然而,这是我真的不知道如何继续下去的地步。

我想要实现的是有例如:一个(外部?)我的语言的字符串库,例如:字符串,它是从该语言的程序中导入的,例如:

import string
myString = "abcde"
print string.at( myString, 2 ) # output: c

我的问题:

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

我想做什么:

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

想到的缺点:

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

最佳答案

如果你的解释器是作为一个库来实现的,它将被其他人的 C++ 代码调用。他们不得不从他们自己的代码中调用你的库中的函数来向解释器添加函数,这并不是没有道理的。那是我自己的表达式评估器所做的。用户代码中是这样的:

Interpreter in;    // an instance of the interpreter
in.AddFunc( lenfun, "length", 1 );
in.AddFunc( catfun, "concat", 2 );

调用者必须提供指向实现函数的指针,以及函数的名称和参数数量。这适用于非类型化设置 - 如果您进行严格类型化,当然还有很多工作要做。

关于c++ - 用编程语言管理库和导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2571225/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com