Я создал интерпретатор для глупого языка программирования в C ++, и вся структура ядра завершена (Tokenizer, Parser, Interpreter, включая таблицы символов, функции ядра и т. Д.).
Теперь у меня проблема с созданием и управлением библиотеками функций для этого интерпретатора (позже я объясню, что я имею в виду)
Так что в настоящее время мой основной обработчик функций ужасен :
// 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 функций. Неустойчив, чувствует себя ужасно, ужасно.
Итак, я подумал: как создать какую-то библиотеку, которая содержит все функции и, если они импортированы, инициализировать себя и добавить свои функции в таблицу символов работающего интерпретатора.
Однако в этот момент я действительно не знаю, как продолжать.
То, чего я хотел добиться, - это, например, наличие библиотеки строк (extern?) Для моего языка, например, строки, и она импортируется из программы на этом языке, например:
import string
myString = "abcde"
print string.at( myString, 2 ) # output: c
Мои проблемы:
- Как отделить библиотеки функций от основного интерпретатора и загрузить их?
- Как получить все их функции в списке и при необходимости добавить их в таблицу символов?
Что я думал сделать:
В начале интерпретатора, поскольку все библиотеки скомпилированы с ним, каждая отдельная функция вызывает что-то вроде RegisterFunction( string namespace, myLangResult (*functionPtr) );
, которое добавляет себя в список. Когда import X
вызывается из языка, список, созданный с помощью RegisterFunction, добавляется в таблицу символов.
Недостатки, которые приходят на ум:
Все библиотеки находятся непосредственно в ядре интерпретатора, размер увеличивается, и это определенно замедлит его.