From 57c8a3e458dbc773a7ce798ace43d731c76ac3b3 Mon Sep 17 00:00:00 2001 From: Gustav Date: Wed, 14 Oct 2020 00:07:09 +0200 Subject: [PATCH] more error handling --- fel/interpreter.cc | 38 +++++++++++++++++++------------------- fel/log.cc | 8 ++++---- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/fel/interpreter.cc b/fel/interpreter.cc index ba76309..29c0cf8 100644 --- a/fel/interpreter.cc +++ b/fel/interpreter.cc @@ -73,7 +73,7 @@ namespace fel BinaryHelper ( Log* log, - const Where& where, + const Token& op, std::shared_ptr lhs, std::shared_ptr rhs, std::shared_ptr left, @@ -95,7 +95,7 @@ namespace fel { if(left == nullptr || right == nullptr) { - log->AddError(where, log::Type::InvalidOperationOnNull); + log->AddError(op.where, log::Type::InvalidOperationOnNull, {op.lexeme}); log->AddError(lhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(left), Stringify(left)}); log->AddError(rhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(right), Stringify(right)}); return nullptr; @@ -132,7 +132,7 @@ namespace fel } } - log->AddError(where, log::Type::InvalidBinaryOperation); + log->AddError(op.where, log::Type::InvalidBinaryOperation, {op.lexeme}); log->AddError(lhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(left), Stringify(left)}); log->AddError(rhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(right), Stringify(right)}); return nullptr; @@ -143,7 +143,7 @@ namespace fel CompareHelper ( Log* log, - const Where& where, + const Token& op, std::shared_ptr lhs, std::shared_ptr rhs, std::shared_ptr left, @@ -153,7 +153,7 @@ namespace fel { if(left == nullptr || right == nullptr) { - log->AddError(where, log::Type::InvalidOperationOnNull); + log->AddError(op.where, log::Type::InvalidOperationOnNull, {op.lexeme}); log->AddError(lhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(left), Stringify(left)}); log->AddError(rhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(right), Stringify(right)}); return nullptr; @@ -170,7 +170,7 @@ namespace fel // todo(Gustav): allow comparing of strings? - log->AddError(where, log::Type::InvalidBinaryOperation); + log->AddError(op.where, log::Type::InvalidBinaryOperation, {op.lexeme}); log->AddError(lhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(left), Stringify(left)}); log->AddError(rhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(right), Stringify(right)}); return nullptr; @@ -181,7 +181,7 @@ namespace fel EqualHelper ( Log* log, - const Where& where, + const Token& op, std::shared_ptr lhs, std::shared_ptr rhs, std::shared_ptr left, @@ -227,7 +227,7 @@ namespace fel // todo(Gustav): allow comparing of strings? - log->AddError(where, log::Type::InvalidBinaryOperation); + log->AddError(op.where, log::Type::InvalidBinaryOperation, {op.lexeme}); log->AddError(lhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(left), Stringify(left)}); log->AddError(rhs->GetLocation(), log::Type::ThisEvaluatesTo, {TypeToString(right), Stringify(right)}); return nullptr; @@ -244,7 +244,7 @@ namespace fel { case TokenType::Minus: return BinaryHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](int lhs, int rhs) -> int {return lhs - rhs;}, @@ -252,7 +252,7 @@ namespace fel ); case TokenType::Mult: return BinaryHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](int lhs, int rhs) -> int {return lhs * rhs;}, @@ -260,7 +260,7 @@ namespace fel ); case TokenType::Div: return BinaryHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, nullptr, @@ -268,7 +268,7 @@ namespace fel ); case TokenType::Mod: return BinaryHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](int lhs, int rhs) -> int {return lhs % rhs;}, @@ -276,7 +276,7 @@ namespace fel ); case TokenType::Plus: return BinaryHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](int lhs, int rhs) -> int {return lhs + rhs;}, @@ -298,42 +298,42 @@ namespace fel ); case TokenType::Less: return CompareHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](float lhs, float rhs) -> bool { return lhs < rhs; } ); case TokenType::LessEqual: return CompareHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](float lhs, float rhs) -> bool { return lhs <= rhs; } ); case TokenType::Greater: return CompareHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](float lhs, float rhs) -> bool { return lhs > rhs; } ); case TokenType::GreaterEqual: return CompareHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, [](float lhs, float rhs) -> bool { return lhs >= rhs; } ); case TokenType::Equal: return EqualHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, false ); case TokenType::NotEqual: return EqualHelper ( - log, exp->op.where, + log, exp->op, exp->left, exp->right, left, right, true diff --git a/fel/log.cc b/fel/log.cc index ad6a8e7..ec5461a 100644 --- a/fel/log.cc +++ b/fel/log.cc @@ -100,12 +100,12 @@ namespace fel::log o << "Expected expression"; break; case Type::InvalidOperationOnNull: - assert(entry.arguments.size() == 0); - o << "Invalid operation on null"; + assert(entry.arguments.size() == 1); + o << "Invalid operation on null: " << Arg(entry, 0); break; case Type::InvalidBinaryOperation: - assert(entry.arguments.size() == 0); - o << "Invalid binary operation"; + assert(entry.arguments.size() == 1); + o << "Invalid binary operation: " << Arg(entry, 0); break; case Type::ThisEvaluatesTo: assert(entry.arguments.size() == 2);