Комментарии 5
ещё есть tinycc в виде библиотеки, с компиляцией выражения в нативный код.
Можно ссылку на репозиторий или статью?
examples/libtcc_test.c
это тупо с99 компилятор размером 100кБ, который можно использовать в качестве библиотеки, чтобы скомпилировать прям в память, выполнить если надо (в случае простых выражений выполнять нечего), добавив по желанию как extern функции/переменные из своей программы и потом забрать результат.
TCCState *s = tcc_new();
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
tcc_compile_string(s, "int x = (20+1)*2;");
tcc_relocate(s, TCC_RELOCATE_AUTO);
int answer = *(int*)tcc_get_symbol(s,"x");
tcc_delete(s);
printf("%d", answer);
если целиком с99 кажется несколько избыточным для "калькулятора", есть ещё Lua, интерпретатор целиком вместе со всей, хоть и немногочисленной её стандартной библиотекой, в единственный 64кБ .exe вроде ещё недавно помещался (правда возможно не без помощи какого-нибудь upx).
ну или вот ещё похожее упражнение в минимализме,
Как по памяти или инъекции кода? И ещё по собственным функциям? Насколько понимаю это выражения с++?
По памяти скорее всего так себе, с инъекцией кода всё хорошо, ну то есть очень плохо, это ведь тупо компилятор С99, хоть и в какой-то степени огороженный, если ему функций не давать, но вот скомпилировать *(int *) 0 = 1/0;
, и потом выполнить со всеми вытекающими последствиями, пожалуй, помешать ему нельзя.
Чтобы совсем огородить надо засунуть выполнение собственно вычисления в какую-нибудь виртуальную машину типа той же Lua или с4, что на быстродействии не самым положительным образом скажется.
Парсинг математических выражений AngouriMath, DynamicExpresso и MathExpressionEval