From d4c85a3d86a8adadcab14dbdaf4ec3670c814e2b Mon Sep 17 00:00:00 2001 From: IlyaShurupov Date: Wed, 6 Mar 2024 10:58:50 +0300 Subject: [PATCH] Parser done implementing --- Objects/private/compiler/function.cpp | 10 +++------ Objects/private/parser/parser.cpp | 29 ++++++++++++++++++------- Objects/public/parser/parser.h | 31 ++++----------------------- Objects/tests/TestParser.cpp | 3 +++ 4 files changed, 31 insertions(+), 42 deletions(-) diff --git a/Objects/private/compiler/function.cpp b/Objects/private/compiler/function.cpp index 5f029ef..c5c338f 100644 --- a/Objects/private/compiler/function.cpp +++ b/Objects/private/compiler/function.cpp @@ -555,17 +555,13 @@ void obj::BCgen::deinit() {} bool obj::BCgen::Compile(obj::MethodObject* method) { - Parser sParger; + Parser parser; auto script = method->mScript->mReadable->val; - auto res = sParger.parse(script); + auto res = parser.parse(script); - if (res.err) { + if (res.isError) { // TODO : print parse error - auto loc = res.err->getErrorLocation(script.read()); - printf("Parser Error (%i,%i): %s\n", loc.head, loc.tail, res.err->mDescription.read()); - // tp::gLogeer->write(tp::sfmt("Parser Error (%i,%i): \n", loc.head, loc.tail), true, tp::Logger::LogEntry::ERR); - // tp::GLog->write(res.err->mDescr, true, tp::Logger::LogEntry::ERR); return false; } diff --git a/Objects/private/parser/parser.cpp b/Objects/private/parser/parser.cpp index 3548e37..ece8b6a 100644 --- a/Objects/private/parser/parser.cpp +++ b/Objects/private/parser/parser.cpp @@ -6,24 +6,37 @@ using namespace obj; +lalr::ErrorPolicy::~ErrorPolicy() = default; +void lalr::ErrorPolicy::lalr_error(int line, int column, int error, const char* format, va_list args) {} +void lalr::ErrorPolicy::lalr_vprintf(const char* format, va_list args){}; + +class CustomErrorPolicy : public lalr::ErrorPolicy { +public: + virtual ~CustomErrorPolicy() override {} + + virtual void lalr_error(int line, int column, int error, const char* format, va_list args) override { + printf("Parser Error: %i %i \n", line, column); + vfprintf(stdout, format, args); + printf("\n"); + } + + virtual void lalr_vprintf(const char* format, va_list args) override { printf(format, args); } +}; + Parser::Result Parser::parse(const tp::String& stream) { - lalr::ErrorPolicy errorPolicy; + CustomErrorPolicy errorPolicy; LalrParser parser(oscript_parser_state_machine, &errorPolicy); bind(parser); - + std::string streamStd(stream.read()); - LALR_ASSERT(parser.valid()); + ASSERT(parser.valid()); parser.parse(streamStd.begin(), streamStd.end()); - - parser.accepted(); - parser.full(); - auto scope = (BCgen::StatementScope*) parser.user_data(); - return { nullptr, scope }; + return { scope, parser.accepted() && parser.full() }; } \ No newline at end of file diff --git a/Objects/public/parser/parser.h b/Objects/public/parser/parser.h index 9e8b38d..ebb40c3 100644 --- a/Objects/public/parser/parser.h +++ b/Objects/public/parser/parser.h @@ -9,35 +9,12 @@ namespace obj { public: Parser() = default; - struct Error { - tp::String mDescription = "No Description"; - tp::alni mAdvancedIdx = 0; - - Error() = default; - Error(const tp::String& description, tp::alni idx) { - mDescription = description; - mAdvancedIdx = idx; - } - - tp::Pair getErrorLocation(const char* stream) const { - tp::alni line = 1; - tp::alni column = 1; - - for (auto i : tp::Range(mAdvancedIdx)) { - if (stream[i] == '\n') { - column = 0; - line++; - } - column++; - } - - return { line, column }; - } - }; - struct Result { - Error* err = nullptr; obj::BCgen::StatementScope* scope = nullptr; + bool isError = false; + tp::String description; + tp::halni line = 0; + tp::halni column = 0; }; Result parse(const tp::String& stream); diff --git a/Objects/tests/TestParser.cpp b/Objects/tests/TestParser.cpp index 8fe2e41..aabc5fc 100644 --- a/Objects/tests/TestParser.cpp +++ b/Objects/tests/TestParser.cpp @@ -11,6 +11,9 @@ TEST_DEF_STATIC(Basic) { String stream = "var i = true; print (i + 1) * 10;"; auto res = parser.parse(stream); + + TEST(!res.isError); + delete res.scope; }