From 48f27169d0f4cf6f3fc8873c4075a11b8a3c792f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Sat, 5 Jul 2025 21:58:11 +0900 Subject: [PATCH] Added builder error --- src/Compiler/ModuleBuilder.cpp | 5 +++++ src/Compiler/ModuleBuilder.h | 4 ++++ src/Error.cpp | 10 +++++++++- src/Error.h | 10 +++++++--- src/Logger.cpp | 17 ++++++++++++----- src/Parser/Parser.h | 2 +- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index 4e94401..d8f0710 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -1,5 +1,6 @@ #include "ModuleBuilder.h" +#include "Error.h" #include "Parser/ValueType.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; exit(1); } + +void ModuleBuilder::markError(int line, int column, string message) { + errors.push_back(Error::builderError(line, column, message)); +} diff --git a/src/Compiler/ModuleBuilder.h b/src/Compiler/ModuleBuilder.h index fc75511..2148c2e 100644 --- a/src/Compiler/ModuleBuilder.h +++ b/src/Compiler/ModuleBuilder.h @@ -11,6 +11,7 @@ #include #include +class Error; class ValueType; class Expression; @@ -41,6 +42,7 @@ typedef struct { class ModuleBuilder { private: + vector> errors; string moduleName; string sourceFileName; @@ -86,6 +88,8 @@ private: llvm::Type *typeForValueType(shared_ptr valueType); void failWithMessage(string message); + void markError(int line, int column, string message); + public: ModuleBuilder(string moduleName, string sourceFileName, vector> statements); shared_ptr getModule(); diff --git a/src/Error.cpp b/src/Error.cpp index a4f5b06..3a2f5a5 100644 --- a/src/Error.cpp +++ b/src/Error.cpp @@ -1,11 +1,19 @@ #include "Error.h" +shared_ptr 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) : kind(ErrorKind::LEXER_ERROR), line(line), column(column), lexme(lexme) { } Error::Error(shared_ptr actualToken, optional expectedTokenKind, optional message) : kind(ErrorKind::PARSER_ERROR), actualToken(actualToken), expectedTokenKind(expectedTokenKind), message(message) { } +Error::Error(ErrorKind kind, int line, int column, optional lexme, shared_ptr actualToken, optional expectedTokenKind, optional message): +kind(kind), line(line), column(column), lexme(lexme), actualToken(actualToken), expectedTokenKind(expectedTokenKind), message(message) { } + ErrorKind Error::getKind() { return kind; } @@ -18,7 +26,7 @@ int Error::getColumn() { return column; } -string Error::getLexme() { +optional Error::getLexme() { return lexme; } diff --git a/src/Error.h b/src/Error.h index 97dc968..204562f 100644 --- a/src/Error.h +++ b/src/Error.h @@ -10,7 +10,8 @@ using namespace std; enum class ErrorKind { LEXER_ERROR, - PARSER_ERROR + PARSER_ERROR, + BUILDER_ERROR }; class Error { @@ -19,21 +20,24 @@ private: int line; int column; - string lexme; + optional lexme; shared_ptr actualToken; optional expectedTokenKind; optional message; public: + static shared_ptr builderError(int line, int column, string message); + Error(int line, int column, string lexme); Error(shared_ptr actualToken, optional expectedTokenKind, optional message); + Error(ErrorKind kind, int line, int column, optional lexme, shared_ptr actualToken, optional expectedTokenKind, optional message); ErrorKind getKind(); int getLine(); int getColumn(); - string getLexme(); + optional getLexme(); shared_ptr getActualToken(); optional getExpectedTokenKind(); diff --git a/src/Logger.cpp b/src/Logger.cpp index f4617f1..4863089 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -2,6 +2,8 @@ #include +#include "Error.h" + #include "Lexer/Token.h" #include "Parser/ValueType.h" @@ -24,8 +26,6 @@ #include "Parser/Expression/ExpressionCall.h" #include "Parser/Expression/ExpressionBlock.h" -#include "Error.h" - string Logger::toString(shared_ptr token) { switch (token->getKind()) { case TokenKind::PLUS: @@ -421,10 +421,12 @@ void Logger::print(vector> statements) { void Logger::print(shared_ptr error) { string message; switch (error->getKind()) { - case ErrorKind::LEXER_ERROR: - message = format("Unexpected token \"{}\" at line: {}, column: {}", error->getLexme(), error->getLine() + 1, error->getColumn() + 1); + case ErrorKind::LEXER_ERROR: { + string lexme = error->getLexme() ? *(error->getLexme()) : ""; + message = format("Unexpected token \"{}\" at line: {}, column: {}", lexme, error->getLine() + 1, error->getColumn() + 1); break; - case ErrorKind::PARSER_ERROR: + } + case ErrorKind::PARSER_ERROR: { shared_ptr token = error->getActualToken(); optional expectedTokenKind = error->getExpectedTokenKind(); optional errorMessage = error->getMessage(); @@ -443,6 +445,11 @@ void Logger::print(shared_ptr error) { if (errorMessage) message += format(". {}", *errorMessage); break; + } + case ErrorKind::BUILDER_ERROR: { + message = ""; + break; + } } cout << message << endl; } \ No newline at end of file diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index 1d6533c..79dddee 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -14,9 +14,9 @@ using namespace std; class Parser { private: + vector> errors; vector> tokens; int currentIndex = 0; - vector> errors; shared_ptr nextStatement(); shared_ptr nextInBlockStatement();