Added builder error
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
#include "ModuleBuilder.h"
|
#include "ModuleBuilder.h"
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
#include "Parser/ValueType.h"
|
#include "Parser/ValueType.h"
|
||||||
|
|
||||||
#include "Parser/Expression/ExpressionGrouping.h"
|
#include "Parser/Expression/ExpressionGrouping.h"
|
||||||
@@ -474,3 +475,7 @@ void ModuleBuilder::failWithMessage(string message) {
|
|||||||
cerr << "Error! Building module \"" << moduleName << "\" from \"" + sourceFileName + "\" failed:" << endl << message << endl;
|
cerr << "Error! Building module \"" << moduleName << "\" from \"" + sourceFileName + "\" failed:" << endl << message << endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModuleBuilder::markError(int line, int column, string message) {
|
||||||
|
errors.push_back(Error::builderError(line, column, message));
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include <llvm/Support/raw_ostream.h>
|
#include <llvm/Support/raw_ostream.h>
|
||||||
#include <llvm/IR/Verifier.h>
|
#include <llvm/IR/Verifier.h>
|
||||||
|
|
||||||
|
class Error;
|
||||||
class ValueType;
|
class ValueType;
|
||||||
|
|
||||||
class Expression;
|
class Expression;
|
||||||
@@ -41,6 +42,7 @@ typedef struct {
|
|||||||
|
|
||||||
class ModuleBuilder {
|
class ModuleBuilder {
|
||||||
private:
|
private:
|
||||||
|
vector<shared_ptr<Error>> errors;
|
||||||
string moduleName;
|
string moduleName;
|
||||||
string sourceFileName;
|
string sourceFileName;
|
||||||
|
|
||||||
@@ -86,6 +88,8 @@ private:
|
|||||||
llvm::Type *typeForValueType(shared_ptr<ValueType> valueType);
|
llvm::Type *typeForValueType(shared_ptr<ValueType> valueType);
|
||||||
void failWithMessage(string message);
|
void failWithMessage(string message);
|
||||||
|
|
||||||
|
void markError(int line, int column, string message);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ModuleBuilder(string moduleName, string sourceFileName, vector<shared_ptr<Statement>> statements);
|
ModuleBuilder(string moduleName, string sourceFileName, vector<shared_ptr<Statement>> statements);
|
||||||
shared_ptr<llvm::Module> getModule();
|
shared_ptr<llvm::Module> getModule();
|
||||||
|
|||||||
@@ -1,11 +1,19 @@
|
|||||||
#include "Error.h"
|
#include "Error.h"
|
||||||
|
|
||||||
|
shared_ptr<Error> Error::builderError(int line, int column, string message) {
|
||||||
|
Error e = Error(ErrorKind::BUILDER_ERROR, line, column, {}, nullptr, {}, message);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
Error::Error(int line, int column, string lexme) :
|
Error::Error(int line, int column, string lexme) :
|
||||||
kind(ErrorKind::LEXER_ERROR), line(line), column(column), lexme(lexme) { }
|
kind(ErrorKind::LEXER_ERROR), line(line), column(column), lexme(lexme) { }
|
||||||
|
|
||||||
Error::Error(shared_ptr<Token> actualToken, optional<TokenKind> expectedTokenKind, optional<string> message) :
|
Error::Error(shared_ptr<Token> actualToken, optional<TokenKind> expectedTokenKind, optional<string> message) :
|
||||||
kind(ErrorKind::PARSER_ERROR), actualToken(actualToken), expectedTokenKind(expectedTokenKind), message(message) { }
|
kind(ErrorKind::PARSER_ERROR), actualToken(actualToken), expectedTokenKind(expectedTokenKind), message(message) { }
|
||||||
|
|
||||||
|
Error::Error(ErrorKind kind, int line, int column, optional<string> lexme, shared_ptr<Token> actualToken, optional<TokenKind> expectedTokenKind, optional<string> message):
|
||||||
|
kind(kind), line(line), column(column), lexme(lexme), actualToken(actualToken), expectedTokenKind(expectedTokenKind), message(message) { }
|
||||||
|
|
||||||
ErrorKind Error::getKind() {
|
ErrorKind Error::getKind() {
|
||||||
return kind;
|
return kind;
|
||||||
}
|
}
|
||||||
@@ -18,7 +26,7 @@ int Error::getColumn() {
|
|||||||
return column;
|
return column;
|
||||||
}
|
}
|
||||||
|
|
||||||
string Error::getLexme() {
|
optional<string> Error::getLexme() {
|
||||||
return lexme;
|
return lexme;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
10
src/Error.h
10
src/Error.h
@@ -10,7 +10,8 @@ using namespace std;
|
|||||||
|
|
||||||
enum class ErrorKind {
|
enum class ErrorKind {
|
||||||
LEXER_ERROR,
|
LEXER_ERROR,
|
||||||
PARSER_ERROR
|
PARSER_ERROR,
|
||||||
|
BUILDER_ERROR
|
||||||
};
|
};
|
||||||
|
|
||||||
class Error {
|
class Error {
|
||||||
@@ -19,21 +20,24 @@ private:
|
|||||||
|
|
||||||
int line;
|
int line;
|
||||||
int column;
|
int column;
|
||||||
string lexme;
|
optional<string> lexme;
|
||||||
|
|
||||||
shared_ptr<Token> actualToken;
|
shared_ptr<Token> actualToken;
|
||||||
optional<TokenKind> expectedTokenKind;
|
optional<TokenKind> expectedTokenKind;
|
||||||
optional<string> message;
|
optional<string> message;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static shared_ptr<Error> builderError(int line, int column, string message);
|
||||||
|
|
||||||
Error(int line, int column, string lexme);
|
Error(int line, int column, string lexme);
|
||||||
Error(shared_ptr<Token> actualToken, optional<TokenKind> expectedTokenKind, optional<string> message);
|
Error(shared_ptr<Token> actualToken, optional<TokenKind> expectedTokenKind, optional<string> message);
|
||||||
|
Error(ErrorKind kind, int line, int column, optional<string> lexme, shared_ptr<Token> actualToken, optional<TokenKind> expectedTokenKind, optional<string> message);
|
||||||
|
|
||||||
ErrorKind getKind();
|
ErrorKind getKind();
|
||||||
|
|
||||||
int getLine();
|
int getLine();
|
||||||
int getColumn();
|
int getColumn();
|
||||||
string getLexme();
|
optional<string> getLexme();
|
||||||
|
|
||||||
shared_ptr<Token> getActualToken();
|
shared_ptr<Token> getActualToken();
|
||||||
optional<TokenKind> getExpectedTokenKind();
|
optional<TokenKind> getExpectedTokenKind();
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
#include "Lexer/Token.h"
|
#include "Lexer/Token.h"
|
||||||
#include "Parser/ValueType.h"
|
#include "Parser/ValueType.h"
|
||||||
|
|
||||||
@@ -24,8 +26,6 @@
|
|||||||
#include "Parser/Expression/ExpressionCall.h"
|
#include "Parser/Expression/ExpressionCall.h"
|
||||||
#include "Parser/Expression/ExpressionBlock.h"
|
#include "Parser/Expression/ExpressionBlock.h"
|
||||||
|
|
||||||
#include "Error.h"
|
|
||||||
|
|
||||||
string Logger::toString(shared_ptr<Token> token) {
|
string Logger::toString(shared_ptr<Token> token) {
|
||||||
switch (token->getKind()) {
|
switch (token->getKind()) {
|
||||||
case TokenKind::PLUS:
|
case TokenKind::PLUS:
|
||||||
@@ -421,10 +421,12 @@ void Logger::print(vector<shared_ptr<Statement>> statements) {
|
|||||||
void Logger::print(shared_ptr<Error> error) {
|
void Logger::print(shared_ptr<Error> error) {
|
||||||
string message;
|
string message;
|
||||||
switch (error->getKind()) {
|
switch (error->getKind()) {
|
||||||
case ErrorKind::LEXER_ERROR:
|
case ErrorKind::LEXER_ERROR: {
|
||||||
message = format("Unexpected token \"{}\" at line: {}, column: {}", error->getLexme(), error->getLine() + 1, error->getColumn() + 1);
|
string lexme = error->getLexme() ? *(error->getLexme()) : "";
|
||||||
|
message = format("Unexpected token \"{}\" at line: {}, column: {}", lexme, error->getLine() + 1, error->getColumn() + 1);
|
||||||
break;
|
break;
|
||||||
case ErrorKind::PARSER_ERROR:
|
}
|
||||||
|
case ErrorKind::PARSER_ERROR: {
|
||||||
shared_ptr<Token> token = error->getActualToken();
|
shared_ptr<Token> token = error->getActualToken();
|
||||||
optional<TokenKind> expectedTokenKind = error->getExpectedTokenKind();
|
optional<TokenKind> expectedTokenKind = error->getExpectedTokenKind();
|
||||||
optional<string> errorMessage = error->getMessage();
|
optional<string> errorMessage = error->getMessage();
|
||||||
@@ -444,5 +446,10 @@ void Logger::print(shared_ptr<Error> error) {
|
|||||||
message += format(". {}", *errorMessage);
|
message += format(". {}", *errorMessage);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ErrorKind::BUILDER_ERROR: {
|
||||||
|
message = "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
cout << message << endl;
|
cout << message << endl;
|
||||||
}
|
}
|
||||||
@@ -14,9 +14,9 @@ using namespace std;
|
|||||||
|
|
||||||
class Parser {
|
class Parser {
|
||||||
private:
|
private:
|
||||||
|
vector<shared_ptr<Error>> errors;
|
||||||
vector<shared_ptr<Token>> tokens;
|
vector<shared_ptr<Token>> tokens;
|
||||||
int currentIndex = 0;
|
int currentIndex = 0;
|
||||||
vector<shared_ptr<Error>> errors;
|
|
||||||
|
|
||||||
shared_ptr<Statement> nextStatement();
|
shared_ptr<Statement> nextStatement();
|
||||||
shared_ptr<Statement> nextInBlockStatement();
|
shared_ptr<Statement> nextInBlockStatement();
|
||||||
|
|||||||
Reference in New Issue
Block a user