Implemented all Lexer errors

This commit is contained in:
Pasha Bibko
2025-07-20 22:34:11 +01:00
parent bb3d8fb13e
commit a6afeff493
6 changed files with 58 additions and 11 deletions

View File

@@ -64,4 +64,39 @@ namespace LXC::Util
return contents;
}
// Struct to hold a position within a file //
struct FileLocation
{
unsigned short col;
unsigned short line;
};
// Finds the location of a given index within a file //
inline bool GetFileLocationAtIndex(FileLocation& location, const std::string& file, __int32 index)
{
// Returns false if outside the bounds //
if (index < 0 || index > file.length())
return false;
// Resets location //
location.line = 1;
location.col = 1;
// Finds the location //
__int32 localIndex = 0;
while (localIndex != index)
{
if (file[localIndex] == '\n')
{
location.line += 1;
location.col = 0;
}
location.col++;
localIndex++;
}
return true;
}
}

View File

@@ -7,5 +7,5 @@
// LXC util files //
#include <Result.h>
#include <FileRead.h>
#include <File.h>
#include <IO.h>

View File

@@ -27,8 +27,6 @@ int main(int argc, char** argv)
Util::Stop();
}
Util::Log("Succesfully opened source file.");
// Turns the file contents into a vector of tokens //
Util::ReturnVal tokens = Lexer::TokenizeFile(fileContents);
if (tokens.Failed()) _UNLIKELY
@@ -36,11 +34,23 @@ int main(int argc, char** argv)
// Stores the error for easier access //
Lexer::LexerError& err = tokens.Error();
// Finds the file location of the error //
Util::FileLocation location;
Util::GetFileLocationAtIndex(location, fileContents, err.index);
// Prints the error to the console //
Util::PrintAs<Util::WHITE>("[LXC] ");
Util::Print(src.filename().string());
Util::Print(src.filename().string(), '(', location.line, ',', location.col, ')');
Util::PrintAs<Util::LIGHT_RED>(" Error: ");
Util::Print(Lexer::LexerError::ReasonStr(err.reason));
if (err.reason == Lexer::LexerError::InvalidCharacter)
Util::PrintLn(": {", fileContents.Result()[err.index], '}');
else
Util::PrintLn();
Util::Log("Error occured in Lexer: ", Lexer::LexerError::ReasonStr(err.reason));
Util::Stop();
}

View File

@@ -40,8 +40,8 @@ namespace LXC::Lexer
{
static const char* reasons[] =
{
"Invalid character found in source: ",
"Unterminated string literal in source starting at: "
"Invalid character found in source",
"Unterminated string literal in source"
};
return reasons[reason];

View File

@@ -104,14 +104,16 @@ namespace LXC::Lexer
// If an if-statement has not been triggered the character must be invalid //
else
{
return Util::FunctionFail<LexerError>(LexerError::InvalidCharacter, -1);
}
return Util::FunctionFail<LexerError>(LexerError::InvalidCharacter, ctx.index);
// Iterates to the next index //
ctx.column++;
ctx.index++;
}
}
// Checks for an unterminated string literal //
if (trackers.inStrLiteral)
return Util::FunctionFail<LexerError>(LexerError::UnterminatedStringLiteral, trackers.sectionStart);
return ctx.out;
}

View File

@@ -1 +1 @@
FILE 4 CONTENTS "A" GO B HERE 34 * 5 "ELLO THER"
FILE 4 CONTENTS "A" GO B HERE 34 5 "ELLO THER"