54 lines
2.6 KiB
C++
54 lines
2.6 KiB
C++
#include <vector>
|
|
#include <string>
|
|
#include <iostream>
|
|
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<string>(this->data)+"'";
|
|
case ErrorType::TypeNotCastable: return "Can't find an explicit cast to "+get<string>(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::ExpectedArithmeticType: return "Expression must have arithmetic type";
|
|
case ErrorType::UnknownIdentifier: return "Unknown identifier '"+get<string>(this->data)+"'";
|
|
case ErrorType::AlreadyDeclaredIdentifier: return "Already declared identifier '"+get<string>(this->data)+"'";
|
|
case ErrorType::UninitializedIdentifier: return "Accessing uninitialized identifier '"+get<string>(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";
|
|
default: return "Unknown error type";
|
|
}
|
|
}
|
|
|
|
void print_error_position(vector<string> 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;
|
|
} |