Я работаю над небольшим парсером и «решателем уравнений» в C, часть этого процесса - выполнять арифметические операции над токенами
Каждый токен содержит void * указатель на числовые данные и enum, который определяет тип данных.
Это пример функции, которая создает новый токен путем добавления двух других токенов. Для этого мне нужно
- тип чека
- литье
- сделать операцию
- создать новый токен из результата
а
Token* _CreateTokenByAddition(Token* arg1, Token* arg2){
Token *tokenResult;
if ((arg1->_type == tk_IntData) && (arg2->_type == tk_IntData)){
int* intResult = malloc(sizeof(int));
*intResult = *(int*)arg1->_data + *(int*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_IntData);
}else
if ((arg1->_type == tk_IntData) && (arg2->_type == tk_FloatData)){
float* intResult = malloc(sizeof(float));
*intResult = *(int*)arg1->_data + *(float*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}else
if ((arg1->_type == tk_FloatData) && (arg2->_type == tk_IntData)){
float* intResult = malloc(sizeof(float));
*intResult = *(float*)arg1->_data + *(int*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}
else
if ((arg1->_type == tk_FloatData) && (arg2->_type == tk_FloatData)){
float* intResult = malloc(sizeof(float));
*intResult = *(float*)arg1->_data + *(float*)arg2->_data;
tokenResult = CreateTokenFromValue(intResult, tk_FloatData);
}
return tokenResult;
}
У меня почти идентичные функции для -, *, /. И мне, вероятно, нужно будет создать больше.
Вопросы:
Как я могу создать одну универсальную функцию, которая будет поддерживать все простые операции, такие как + - * /?
Я не хочу помещать эту функцию в макрос, а затем дублировать ее 4 раза, заменяя математический операнд.
В любом случае, как я могу упростить проверки типов данных и приведение типов из пустых указателей?
В любом случае, я могу сделать этот код лучше?
Предположение: у меня нет никаких нечисловых типов данных (например, строк)
Спасибо
Круто, большое спасибо за эти ответы, я понимаю, что вы подразумеваете под указателями на функции.
Я собираюсь подумать об этом и использовать один из этих методов. Спасибо