Как мне написать неявное приведение типов для моего строго типизированного интерпретатора? (С++)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как мне написать неявное приведение типов для моего строго типизированного интерпретатора? (С++)

Сообщение Anonymous »

Сейчас я пишу интерпретатор, и он строго типизирован. Он имеет short, int, long, float и double.
Я хочу выполнить двоичную операцию между двумя числами и иметь неявное приведение.
Например, я хочу иметь возможность добавлять int к double и вернуть double или добавить long к double и вернуть double.
Код эваулятора для двоичного выражения записывается следующим образом

Код: Выделить всё

std::any Interpreter::visitBinaryExpression(BinaryExpression& binaryExpression)
{
std::any left = binaryExpression.left->accept(*this);
std::any right = binaryExpression.right->accept(*this);
Token_t op = binaryExpression.op;

if (left.type() == typeid(short) && right.type() == typeid(short))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(int) && right.type() == typeid(int))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(long) && right.type() == typeid(long))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(float) && right.type() == typeid(float))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(double) && right.type() == typeid(double))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}

if (left.type() == typeid(bool) && right.type() == typeid(bool))
{
return eva_bool(std::any_cast(left), op, std::any_cast(right));
}
std::string left_err = left.type().name();
std::string right_err = right.type().name();
throw std::invalid_argument("Runtime Error: couldn't evaluate type '" + left_err + "' with type '" + right_err + "'");
}
Парсер генерирует AST, а затем я интерпретирую каждое утверждение, используя шаблон посетителя.
Проблема в том, что, поскольку я использую std: :any Мне нужно проверить каждый сценарий на предмет типа переменной. И в результате я получу более 100 операторов IF, что звучит неправильно.
Я пытался заменить std::any на std: :variant но у меня все равно будет более 100 операторов if.
Я пытался использовать метапрограммирование, но я действительно не знаю, как это реализовать (я новичок)кто-нибудь знаете, как решить эту проблему без жестокого написания всех операторов if?

Подробнее здесь: https://stackoverflow.com/questions/781 ... erpreter-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»