Add error pretty print
This commit is contained in:
parent
cb3444fcf3
commit
b87bcd68b0
24
src/errors.cpp
Normal file
24
src/errors.cpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "include/colors.h"
|
||||||
|
#include "include/tokenize.h"
|
||||||
|
|
||||||
|
|
||||||
|
void pretty_print_error(vector<string> history, CodePosition pos) {
|
||||||
|
if (pos.column == -1 || pos.line == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cout << pos.column << ";" << pos.line << 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;
|
||||||
|
}
|
6
src/include/errors.h
Normal file
6
src/include/errors.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <string>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "tokenize.h"
|
||||||
|
|
||||||
|
void pretty_print_error(vector<string> history, CodePosition pos);
|
@ -111,10 +111,12 @@ class ParseException : public std::exception {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class SyntaxError : public std::runtime_error {
|
class SyntaxError : public runtime_error {
|
||||||
public:
|
public:
|
||||||
explicit SyntaxError(const std::string& message)
|
explicit SyntaxError(const string& message, CodePosition pos)
|
||||||
: std::runtime_error(message) {}
|
: runtime_error(message), pos(pos) {}
|
||||||
|
|
||||||
|
const CodePosition pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -16,13 +16,13 @@ void _debug_print_tree(const Node& node, int depth, const string& prefix = "") {
|
|||||||
|
|
||||||
string new_prefix = prefix;
|
string new_prefix = prefix;
|
||||||
size_t pos = new_prefix.find("└──");
|
size_t pos = new_prefix.find("└──");
|
||||||
while (pos != std::string::npos) {
|
while (pos != string::npos) {
|
||||||
new_prefix.replace(pos, 9, " ");
|
new_prefix.replace(pos, 9, " ");
|
||||||
pos = new_prefix.find("└──", pos + 4);
|
pos = new_prefix.find("└──", pos + 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = new_prefix.find("├──");
|
pos = new_prefix.find("├──");
|
||||||
while (pos != std::string::npos) {
|
while (pos != string::npos) {
|
||||||
new_prefix.replace(pos, 9, "│ ");
|
new_prefix.replace(pos, 9, "│ ");
|
||||||
pos = new_prefix.find("├──", pos + 6);
|
pos = new_prefix.find("├──", pos + 6);
|
||||||
}
|
}
|
||||||
@ -43,8 +43,13 @@ void _debug_print_tree(const Node& node, int depth, const string& prefix = "") {
|
|||||||
Node parse(vector<Token> tokens) {
|
Node parse(vector<Token> tokens) {
|
||||||
reverse(tokens.begin(), tokens.end());
|
reverse(tokens.begin(), tokens.end());
|
||||||
|
|
||||||
if (tokens.size() == 0)
|
if (tokens.size() == 0) {
|
||||||
throw SyntaxError("Input must not be empty");
|
CodePosition pos = {
|
||||||
|
.line = -1,
|
||||||
|
.column = -1
|
||||||
|
};
|
||||||
|
throw SyntaxError("Input must not be empty", pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// At least 1 instruction
|
// At least 1 instruction
|
||||||
@ -417,8 +422,13 @@ ParseReturn parse_f(vector<Token> tokens) {
|
|||||||
ParseReturn ret = parse_expr(tokens);
|
ParseReturn ret = parse_expr(tokens);
|
||||||
tokens=ret.tokens;
|
tokens=ret.tokens;
|
||||||
|
|
||||||
if (tokens.size() < 1 || tokens.back().type != TokenType::RParenthese)
|
if (tokens.size() < 1 || tokens.back().type != TokenType::RParenthese) {
|
||||||
throw SyntaxError("Missing ')'");
|
CodePosition pos = {
|
||||||
|
.line = -1,
|
||||||
|
.column = -1
|
||||||
|
};
|
||||||
|
throw SyntaxError("Missing ')'", pos);
|
||||||
|
}
|
||||||
|
|
||||||
tokens.pop_back();
|
tokens.pop_back();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user