From a0febfba0e91d9c3fcae73c4355118fdd6365af0 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Tue, 26 Dec 2023 13:41:14 +0100 Subject: [PATCH] even better parser --- src/vm/CMakeLists.txt | 2 +- src/vm/includes/SParser.h | 14 -------------- src/vm/src/Parser.cpp | 22 ++++++++++++++++++---- src/vm/src/SParser.cpp | 5 ----- test/vm/VMWithParserTest.cpp | 6 +++--- 5 files changed, 22 insertions(+), 27 deletions(-) delete mode 100644 src/vm/includes/SParser.h delete mode 100644 src/vm/src/SParser.cpp diff --git a/src/vm/CMakeLists.txt b/src/vm/CMakeLists.txt index f7c69d9..067692e 100644 --- a/src/vm/CMakeLists.txt +++ b/src/vm/CMakeLists.txt @@ -2,6 +2,6 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(vm src/VM.cpp src/Cell.cpp - src/Parser.cpp src/SParser.cpp src/MemoryContext.cpp src/ConsUtils.cpp) + src/Parser.cpp src/MemoryContext.cpp src/ConsUtils.cpp) target_include_directories(vm PUBLIC includes) diff --git a/src/vm/includes/SParser.h b/src/vm/includes/SParser.h deleted file mode 100644 index e2bdbdb..0000000 --- a/src/vm/includes/SParser.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// Created by Stepan Usatiuk on 25.12.2023. -// - -#ifndef PSIL_SPARSER_H -#define PSIL_SPARSER_H - - -class SParser { - // SParser() -}; - - -#endif//PSIL_SPARSER_H diff --git a/src/vm/src/Parser.cpp b/src/vm/src/Parser.cpp index 16edb4d..2445e84 100644 --- a/src/vm/src/Parser.cpp +++ b/src/vm/src/Parser.cpp @@ -4,6 +4,7 @@ #include "Parser.h" +#include #include #include @@ -62,10 +63,23 @@ std::string_view Parser::Tokenizer::peek() const { } void Parser::Tokenizer::load(std::string_view input) { - for (const auto &w: input | std::views::split(' ') | std::views::transform([](auto &&rng) { - return std::string_view(&*rng.begin(), std::ranges::distance(rng)); - })) { - _tokens.emplace(w); + std::string_view::size_type curpos = input.find_first_not_of(' '); + + static const std::string alnum = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + static const std::string special = "()."; + + while (curpos != std::string_view::npos) { + if (alnum.find(input.at(curpos)) != std::string::npos) { + std::string_view::size_type end = input.find_first_not_of(alnum, curpos); + _tokens.emplace(input.cbegin() + curpos, input.cbegin() + end); + curpos = end; + } else if (special.find(input.at(curpos)) != std::string::npos) { + _tokens.emplace(1, input.at(curpos)); + curpos++; + } else { + throw std::invalid_argument("Unexpected symbol " + std::string(1, input.at(curpos))); + } + curpos = input.find_first_not_of(' ', curpos); } } diff --git a/src/vm/src/SParser.cpp b/src/vm/src/SParser.cpp deleted file mode 100644 index ca55a17..0000000 --- a/src/vm/src/SParser.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// -// Created by Stepan Usatiuk on 25.12.2023. -// - -#include "SParser.h" diff --git a/test/vm/VMWithParserTest.cpp b/test/vm/VMWithParserTest.cpp index bdc3837..be5030a 100644 --- a/test/vm/VMWithParserTest.cpp +++ b/test/vm/VMWithParserTest.cpp @@ -10,7 +10,7 @@ TEST(VMWithParserTest, BasicHello) { MemoryContext mc; VM vm(ssin, ssout); Parser parser; - parser.loadStr("( LDC 104 PUTCHAR STOP )"); + parser.loadStr("(LDC 104 PUTCHAR STOP)"); vm.loadControl(parser.parseExpr()); vm.run(); } @@ -26,7 +26,7 @@ TEST(VMWithParserTest, BasicBranch) { VM vm(ssin, ssout); Parser parser; parser.loadStr( - "( LDC 1 SEL ( LDC 10 PUTNUM JOIN ) ( LDC 20 PUTNUM JOIN ) LDC 0 SEL ( LDC 30 PUTNUM JOIN ) ( LDC 40 PUTNUM JOIN ) STOP )"); + "(LDC 1 SEL (LDC 10 PUTNUM JOIN) (LDC 20 PUTNUM JOIN) LDC 0 SEL (LDC 30 PUTNUM JOIN) (LDC 40 PUTNUM JOIN) STOP)"); vm.loadControl(parser.parseExpr()); vm.run(); } @@ -41,7 +41,7 @@ TEST(VMWithParserTest, BasicFunction) { MemoryContext mc; VM vm(ssin, ssout); Parser parser; - parser.loadStr("( NIL LDC 1 CONS LDC 2 CONS LDF ( LD ( 1 . 1 ) LD ( 1 . 2 ) ADD RET ) AP PUTNUM STOP )"); + parser.loadStr("(NIL LDC 1 CONS LDC 2 CONS LDF (LD (1 . 1) LD (1.2) ADD RET) AP PUTNUM STOP)"); vm.loadControl(parser.parseExpr()); vm.run(); }