From 42ee676bc9cf963cc08cb5ae32476ce906504c8c Mon Sep 17 00:00:00 2001 From: IlushaShurupov Date: Tue, 8 Aug 2023 17:54:14 +0300 Subject: [PATCH] Parser Initial --- Parser/CMakeLists.txt | 22 ++++++++ Parser/private/Parser.cpp | 0 Parser/public/Parser.hpp | 105 ++++++++++++++++++++++++++++++++++++++ Parser/tests/Tests.cpp | 4 ++ 4 files changed, 131 insertions(+) create mode 100644 Parser/CMakeLists.txt create mode 100644 Parser/private/Parser.cpp create mode 100644 Parser/public/Parser.hpp create mode 100644 Parser/tests/Tests.cpp diff --git a/Parser/CMakeLists.txt b/Parser/CMakeLists.txt new file mode 100644 index 0000000..8af7064 --- /dev/null +++ b/Parser/CMakeLists.txt @@ -0,0 +1,22 @@ + +cmake_minimum_required(VERSION 3.2) + +set(CMAKE_CXX_STANDARD 23) + +project(Parser) + +### ---------------------- Static Library --------------------- ### +file(GLOB SOURCES "./private/*.cpp") +file(GLOB HEADERS "./public/*.hpp") +add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS}) +target_include_directories(${PROJECT_NAME} PUBLIC ./public/) +target_link_libraries(${PROJECT_NAME} PUBLIC Strings) + +### -------------------------- Tests -------------------------- ### +enable_testing() +file(GLOB TEST_SOURCES "./tests/*.cpp") +add_executable(${PROJECT_NAME}Tests ${TEST_SOURCES}) +target_link_libraries(${PROJECT_NAME}Tests ${PROJECT_NAME} Utils) +add_test(NAME ${PROJECT_NAME}Tests COMMAND ${PROJECT_NAME}Tests) + +install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}/lib) \ No newline at end of file diff --git a/Parser/private/Parser.cpp b/Parser/private/Parser.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Parser/public/Parser.hpp b/Parser/public/Parser.hpp new file mode 100644 index 0000000..4c64fe0 --- /dev/null +++ b/Parser/public/Parser.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include "Strings.hpp" +#include "Map.hpp" +#include "List.hpp" + +namespace tp { + + template + class ContextFreeGrammar { + public: + class NonTerminalSymbol; + + class RHSArg { + tAlphabetType terminal; + const NonTerminalSymbol* nonTerminal = nullptr; + public: + RHSArg(const NonTerminalSymbol* aNonTerminal) : nonTerminal(aNonTerminal) {} + RHSArg(tAlphabetType terminal) : terminal(terminal) {} + }; + + class NonTerminalSymbol { + String name; + String description; + + struct Rule { + List mArgs; + }; + + List mRules; + + Rule* newRule() { + mRules.pushBack(); + return mRules.last()->data; + } + }; + + private: + Map mNonTerminals; + NonTerminalSymbol* mStart; + + public: + ContextFreeGrammar() = default; + + void setStartNonTerminal(const NonTerminalSymbol* start) { + mStart = start; + } + + const NonTerminalSymbol* addRule(const String& LHS, const InitialierList RHS) { + NonTerminalSymbol* nonTerminal = nullptr; + auto idx = mNonTerminals.presents(LHS); + if (idx) { + nonTerminal = mNonTerminals.get(idx); + } else { + nonTerminal = new NonTerminalSymbol(LHS, "None"); + mNonTerminals.put(LHS, nonTerminal); + } + + auto* rule = nonTerminal->newRule(); + for (auto arg : RHS) { + rule->pushBack(arg); + } + + return nonTerminal; + } + + bool checkSemantic() { + return false; + } + + bool checkNonAmbiguous() { + return false; + } + }; + + template + class Parser { + typedef ContextFreeGrammar Grammar; + + public: + class ASTNode { + const Grammar::NonTerminalSymbol* mNonTerminal; + List mLeafs; + }; + + private: + class InputTape { + }; + + class StateStack { + }; + + private: + Grammar mGrammar; + + public: + Parser() = default; + + Grammar& getGrammar() { return mGrammar; } + + void buildTables() {} + + const ASTNode* parse() {} + }; +} \ No newline at end of file diff --git a/Parser/tests/Tests.cpp b/Parser/tests/Tests.cpp new file mode 100644 index 0000000..7679e67 --- /dev/null +++ b/Parser/tests/Tests.cpp @@ -0,0 +1,4 @@ + +int main() { + +} \ No newline at end of file