#include #include #include using namespace std; #include "include/errors.h" #include "include/colors.h" #include "include/tokenize.h" string UserError::get_message(void) const { switch (this->type) { case ErrorType::NotImplemented: return "Not implemented"; case ErrorType::UnknownToken: return "Unknown token"; case ErrorType::IntegerTooLarge: return "Integer constant is too large"; case ErrorType::EmptyInput: return "Input must not be empty"; case ErrorType::InvalidSyntax: return "Invalid syntax"; case ErrorType::ExceptedLParen: return "Expected '("; case ErrorType::ExpectedRParen: return "Expected ')'"; case ErrorType::ExpectedLCurlyBracket: return "Expected '{'"; case ErrorType::ExpectedRCurlyBracket: return "Expected '}'"; case ErrorType::ExpectedSemicolon: return "Expected ';'"; case ErrorType::DependentDeclaration: return "A dependant statement may not be a declaration"; case ErrorType::UnknownType: return "Unknown type '"+get(this->data)+"'"; case ErrorType::TypeNotCastable: return "Can't find an explicit cast to "+get(this->data)+"'"; case ErrorType::TypesNotComparable: return "Types not comparable"; case ErrorType::ExpectedIntegralType: return "Expression must have integral type"; case ErrorType::NestedFunction: return "Function definition is not allowed here"; case ErrorType::FunctionRedefinition: return "Redefinition of '"+get(this->data)+"'"; case ErrorType::IncompatibleRedefinition: return "Redefinition of '"+get(this->data)+"' as different kind of symbol"; case ErrorType::IncompatibleDefinition: return "Declaration of '"+get(this->data)+"' is incompatible with previous prototype"; case ErrorType::UnexpectedArgumentCount: return "Expected "+to_string(get(this->data))+" arguments to function call"; case ErrorType::ExpectedArithmeticType: return "Expression must have arithmetic type"; case ErrorType::UnknownIdentifier: return "Unknown identifier '"+get(this->data)+"'"; case ErrorType::AlreadyDeclaredIdentifier: return "Already declared identifier '"+get(this->data)+"'"; case ErrorType::UninitializedIdentifier: return "Accessing uninitialized identifier '"+get(this->data)+"'"; case ErrorType::DivisionByZero: return "Division by 0"; case ErrorType::ModuloByZero: return "Modulo by 0"; case ErrorType::BreakNotWithinLoop: return "Break statement not within loop"; case ErrorType::ContinueNotWithinLoop: return "Continue statement not within loop"; case ErrorType::ControlReachesEndOfNonVoidFn: return "Control reaches end of non-void function"; default: return "Unknown error type"; } } void print_error_position(vector history, CodePosition pos) { if (pos.column == -1 || pos.line == -1) return; cout << endl; string line = history[pos.line]; printf(BOLD "%4d " RESET , pos.line+1); cout << line << endl; for (int i=0; i < pos.column + 5; i++) cout << " "; cout << BOLD RED "^--" RESET << endl; }