diff options
Diffstat (limited to 'include/cru/parse')
-rw-r--r-- | include/cru/parse/ParsingAlgorithm.hpp | 2 | ||||
-rw-r--r-- | include/cru/parse/ParsingAlgorithmContext.hpp | 11 | ||||
-rw-r--r-- | include/cru/parse/ParsingContext.hpp | 5 | ||||
-rw-r--r-- | include/cru/parse/RecursiveDescentAlgorithm.hpp | 19 | ||||
-rw-r--r-- | include/cru/parse/RecursiveDescentAlgorithmContext.hpp | 22 |
5 files changed, 53 insertions, 6 deletions
diff --git a/include/cru/parse/ParsingAlgorithm.hpp b/include/cru/parse/ParsingAlgorithm.hpp index 1ea30a80..acca159e 100644 --- a/include/cru/parse/ParsingAlgorithm.hpp +++ b/include/cru/parse/ParsingAlgorithm.hpp @@ -14,7 +14,7 @@ class ParsingAlgorithm { CRU_DELETE_COPY(ParsingAlgorithm) CRU_DELETE_MOVE(ParsingAlgorithm) - ~ParsingAlgorithm() = default; + virtual ~ParsingAlgorithm() = default; virtual bool CanHandle(Grammar* grammar) const = 0; virtual ParsingAlgorithmContext* CreateContext(Grammar* grammar) const = 0; diff --git a/include/cru/parse/ParsingAlgorithmContext.hpp b/include/cru/parse/ParsingAlgorithmContext.hpp index 072203ec..f67ccbbc 100644 --- a/include/cru/parse/ParsingAlgorithmContext.hpp +++ b/include/cru/parse/ParsingAlgorithmContext.hpp @@ -1,5 +1,8 @@ #pragma once +#include <vector> #include "Grammar.hpp" +#include "cru/parse/ParsingTreeNode.hpp" +#include "cru/parse/Terminal.hpp" namespace cru::parse { class ParsingAlgorithm; @@ -9,15 +12,17 @@ class ParsingAlgorithm; // contain any state machine. class ParsingAlgorithmContext { public: - ParsingAlgorithmContext(Grammar* grammar, ParsingAlgorithm* algorithm); + ParsingAlgorithmContext(Grammar* grammar, const ParsingAlgorithm* algorithm); CRU_DELETE_COPY(ParsingAlgorithmContext) CRU_DELETE_MOVE(ParsingAlgorithmContext) - ~ParsingAlgorithmContext(); + virtual ~ParsingAlgorithmContext(); + + virtual ParsingTreeNode* Parse(const std::vector<Terminal*>& input) = 0; private: Grammar* grammar_; - ParsingAlgorithm* algorithm_; + const ParsingAlgorithm* algorithm_; }; } // namespace cru::parse diff --git a/include/cru/parse/ParsingContext.hpp b/include/cru/parse/ParsingContext.hpp index 369acf41..ebb7115a 100644 --- a/include/cru/parse/ParsingContext.hpp +++ b/include/cru/parse/ParsingContext.hpp @@ -1,12 +1,13 @@ #pragma once #include "ParsingAlgorithmContext.hpp" +#include "cru/parse/ParsingTreeNode.hpp" namespace cru::parse { // A parsing context contains all info that a program needs to know when parsing // a input sequence of terminals. class ParsingContext { public: - ParsingContext(ParsingAlgorithmContext* parsing_algorithm_context, + ParsingContext(const ParsingAlgorithmContext* parsing_algorithm_context, std::vector<Terminal*> input); CRU_DELETE_COPY(ParsingContext) @@ -15,7 +16,7 @@ class ParsingContext { ~ParsingContext(); private: - ParsingAlgorithmContext* parsing_algorithm_context_; + const ParsingAlgorithmContext* parsing_algorithm_context_; std::vector<Terminal*> input_; }; } // namespace cru::parse diff --git a/include/cru/parse/RecursiveDescentAlgorithm.hpp b/include/cru/parse/RecursiveDescentAlgorithm.hpp new file mode 100644 index 00000000..c12a84f6 --- /dev/null +++ b/include/cru/parse/RecursiveDescentAlgorithm.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "ParsingAlgorithm.hpp" + +namespace cru::parse { +class RecursiveDescentAlgorithm : public ParsingAlgorithm { + public: + RecursiveDescentAlgorithm() = default; + + CRU_DELETE_COPY(RecursiveDescentAlgorithm) + CRU_DELETE_MOVE(RecursiveDescentAlgorithm) + + ~RecursiveDescentAlgorithm() override = default; + + public: + bool CanHandle(Grammar* grammar) const override; + ParsingAlgorithmContext* CreateContext(Grammar* grammar) const override; +}; +} // namespace cru::parse diff --git a/include/cru/parse/RecursiveDescentAlgorithmContext.hpp b/include/cru/parse/RecursiveDescentAlgorithmContext.hpp new file mode 100644 index 00000000..1b888da9 --- /dev/null +++ b/include/cru/parse/RecursiveDescentAlgorithmContext.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "ParsingAlgorithmContext.hpp" +#include "cru/parse/ParsingTreeNode.hpp" +#include "cru/parse/RecursiveDescentAlgorithm.hpp" +#include "cru/parse/Terminal.hpp" + +namespace cru::parse { +class RecursiveDescentAlgorithmContext : public ParsingAlgorithmContext { + public: + RecursiveDescentAlgorithmContext(Grammar* grammar, + const RecursiveDescentAlgorithm* algorithm); + + CRU_DELETE_COPY(RecursiveDescentAlgorithmContext) + CRU_DELETE_MOVE(RecursiveDescentAlgorithmContext) + + ~RecursiveDescentAlgorithmContext() override; + + public: + ParsingTreeNode* Parse(const std::vector<Terminal*>& input) override; +}; +} // namespace cru::parse |