diff options
-rw-r--r-- | demos/parse/EliminateLeftRecursion.cpp | 10 | ||||
-rw-r--r-- | include/cru/parse/Grammar.h | 9 | ||||
-rw-r--r-- | include/cru/parse/Nonterminal.h | 2 | ||||
-rw-r--r-- | include/cru/parse/Production.h | 12 | ||||
-rw-r--r-- | include/cru/parse/Symbol.h | 11 | ||||
-rw-r--r-- | include/cru/parse/Terminal.h | 3 | ||||
-rw-r--r-- | include/cru/parse/TokenType.h | 12 | ||||
-rw-r--r-- | src/parse/Grammar.cpp | 52 | ||||
-rw-r--r-- | src/parse/Nonterminal.cpp | 2 | ||||
-rw-r--r-- | src/parse/Production.cpp | 2 | ||||
-rw-r--r-- | src/parse/Symbol.cpp | 2 | ||||
-rw-r--r-- | src/parse/Terminal.cpp | 2 | ||||
-rw-r--r-- | src/parse/TokenType.cpp | 2 |
13 files changed, 60 insertions, 61 deletions
diff --git a/demos/parse/EliminateLeftRecursion.cpp b/demos/parse/EliminateLeftRecursion.cpp index 88fd5510..9e054859 100644 --- a/demos/parse/EliminateLeftRecursion.cpp +++ b/demos/parse/EliminateLeftRecursion.cpp @@ -6,16 +6,16 @@ int main() { using namespace cru::parse; Grammar grammar; - auto S = grammar.CreateNonterminal(u"S"); - auto a = grammar.CreateTerminal(u"a"); + auto S = grammar.CreateNonterminal("S"); + auto a = grammar.CreateTerminal("a"); - grammar.CreateProduction(u"S := S a", S, {S, a}); - grammar.CreateProduction(u"S := a", S, {a}); + grammar.CreateProduction("S := S a", S, {S, a}); + grammar.CreateProduction("S := a", S, {a}); grammar.SetStartSymbol(S); grammar.EliminateLeftRecursions(); - std::cout << grammar.ProductionsToString().ToUtf8(); + std::cout << grammar.ProductionsToString(); return 0; } diff --git a/include/cru/parse/Grammar.h b/include/cru/parse/Grammar.h index 7dd1eec0..522cc0fd 100644 --- a/include/cru/parse/Grammar.h +++ b/include/cru/parse/Grammar.h @@ -1,5 +1,6 @@ #pragma once #include "Production.h" +#include "Terminal.h" #include <unordered_map> #include <vector> @@ -17,9 +18,9 @@ class CRU_PARSE_API Grammar : public Object { public: void SetStartSymbol(Nonterminal* start_symbol); - Terminal* CreateTerminal(String name); - Nonterminal* CreateNonterminal(String name); - Production* CreateProduction(String name, Nonterminal* left, + Terminal* CreateTerminal(std::string name); + Nonterminal* CreateNonterminal(std::string name); + Production* CreateProduction(std::string name, Nonterminal* left, std::vector<Symbol*> right); bool RemoveSymbol(Symbol* symbol); @@ -50,7 +51,7 @@ class CRU_PARSE_API Grammar : public Object { void LeftFactor(); public: - String ProductionsToString() const; + std::string ProductionsToString() const; private: Nonterminal* start_symbol_ = nullptr; diff --git a/include/cru/parse/Nonterminal.h b/include/cru/parse/Nonterminal.h index 0ea15149..21744858 100644 --- a/include/cru/parse/Nonterminal.h +++ b/include/cru/parse/Nonterminal.h @@ -4,7 +4,7 @@ namespace cru::parse { class CRU_PARSE_API Nonterminal : public Symbol { public: - Nonterminal(Grammar* grammar, String name); + Nonterminal(Grammar* grammar, std::string name); CRU_DELETE_COPY(Nonterminal) CRU_DELETE_MOVE(Nonterminal) diff --git a/include/cru/parse/Production.h b/include/cru/parse/Production.h index 07bd2962..81236020 100644 --- a/include/cru/parse/Production.h +++ b/include/cru/parse/Production.h @@ -1,15 +1,13 @@ #pragma once -#include "cru/base/String.h" - #include "Nonterminal.h" -#include "Terminal.h" #include <vector> +#include <string> namespace cru::parse { class CRU_PARSE_API Production : public Object { public: - Production(Grammar* grammar, String name, Nonterminal* left, + Production(Grammar* grammar, std::string name, Nonterminal* left, std::vector<Symbol*> right); CRU_DELETE_COPY(Production) @@ -20,8 +18,8 @@ class CRU_PARSE_API Production : public Object { public: Grammar* GetGrammar() const { return grammar_; } - String GetName() const { return name_; } - void SetName(String name) { name_ = std::move(name); } + std::string GetName() const { return name_; } + void SetName(std::string name) { name_ = std::move(name); } Nonterminal* GetLeft() const { return left_; } void SetLeft(Nonterminal* left); @@ -35,7 +33,7 @@ class CRU_PARSE_API Production : public Object { private: Grammar* grammar_; - String name_; + std::string name_; Nonterminal* left_; std::vector<Symbol*> right_; diff --git a/include/cru/parse/Symbol.h b/include/cru/parse/Symbol.h index 0252b3b7..d40243e7 100644 --- a/include/cru/parse/Symbol.h +++ b/include/cru/parse/Symbol.h @@ -1,7 +1,8 @@ #pragma once #include "Base.h" -#include "cru/base/String.h" +#include <cru/base/Base.h> +#include <string> namespace cru::parse { class Grammar; @@ -9,7 +10,7 @@ class Grammar; // Base class of Terminal and Nonterminal. class CRU_PARSE_API Symbol : public Object { public: - explicit Symbol(Grammar* grammar, String name); + explicit Symbol(Grammar* grammar, std::string name); CRU_DELETE_COPY(Symbol) CRU_DELETE_MOVE(Symbol) @@ -19,12 +20,12 @@ class CRU_PARSE_API Symbol : public Object { public: Grammar* GetGrammar() { return grammar_; } - String GetName() const { return name_; } - void SetName(String name) { name_ = std::move(name); } + std::string GetName() const { return name_; } + void SetName(std::string name) { name_ = std::move(name); } private: Grammar* grammar_; - String name_; + std::string name_; }; } // namespace cru::parse diff --git a/include/cru/parse/Terminal.h b/include/cru/parse/Terminal.h index d197ab29..eb3b76c8 100644 --- a/include/cru/parse/Terminal.h +++ b/include/cru/parse/Terminal.h @@ -1,10 +1,11 @@ #pragma once #include "Symbol.h" +#include <cru/base/Base.h> namespace cru::parse { class CRU_PARSE_API Terminal : public Symbol { public: - Terminal(Grammar* grammar, String name); + Terminal(Grammar* grammar, std::string name); CRU_DELETE_COPY(Terminal) CRU_DELETE_MOVE(Terminal) diff --git a/include/cru/parse/TokenType.h b/include/cru/parse/TokenType.h index 4e8545b1..a015a49b 100644 --- a/include/cru/parse/TokenType.h +++ b/include/cru/parse/TokenType.h @@ -1,13 +1,13 @@ #pragma once #include "Base.h" -#include "cru/base/Base.h" -#include "cru/base/String.h" +#include <cru/base/Base.h> +#include <string> namespace cru::parse { class CRU_PARSE_API TokenType : public Object { public: - explicit TokenType(String name); + explicit TokenType(std::string name); CRU_DELETE_COPY(TokenType) CRU_DELETE_MOVE(TokenType) @@ -15,10 +15,10 @@ class CRU_PARSE_API TokenType : public Object { ~TokenType() override; public: - String GetName() const { return name_; } - void SetName(String name) { name_ = std::move(name); } + std::string GetName() const { return name_; } + void SetName(std::string name) { name_ = std::move(name); } private: - String name_; + std::string name_; }; } // namespace cru::parse diff --git a/src/parse/Grammar.cpp b/src/parse/Grammar.cpp index 615901e0..9d7ce5a1 100644 --- a/src/parse/Grammar.cpp +++ b/src/parse/Grammar.cpp @@ -1,5 +1,4 @@ #include "cru/parse/Grammar.h" -#include "cru/base/String.h" #include "cru/parse/Symbol.h" #include <algorithm> @@ -25,21 +24,21 @@ void Grammar::SetStartSymbol(Nonterminal* start_symbol) { start_symbol_ = start_symbol; } -Terminal* Grammar::CreateTerminal(String name) { +Terminal* Grammar::CreateTerminal(std::string name) { auto terminal = new Terminal(this, std::move(name)); terminals_.push_back(terminal); symbols_.push_back(terminal); return terminal; } -Nonterminal* Grammar::CreateNonterminal(String name) { +Nonterminal* Grammar::CreateNonterminal(std::string name) { auto nonterminal = new Nonterminal(this, std::move(name)); nonterminals_.push_back(nonterminal); symbols_.push_back(nonterminal); return nonterminal; } -Production* Grammar::CreateProduction(String name, Nonterminal* left, +Production* Grammar::CreateProduction(std::string name, Nonterminal* left, std::vector<Symbol*> right) { Expects(left->GetGrammar() == this); Expects(std::all_of(right.cbegin(), right.cend(), [this](Symbol* symbol) { @@ -154,9 +153,8 @@ void Grammar::EliminateLeftRecursions() { new_right.insert(new_right.cbegin(), jp->GetRight().cbegin(), jp->GetRight().cend()); CreateProduction( - String::FromUtf8(std::format( - "Merge of {} and {} (Eliminate Left Recursion)", - production->GetName().ToUtf8(), jp->GetName().ToUtf8())), + std::format("Merge of {} and {} (Eliminate Left Recursion)", + production->GetName(), jp->GetName()), ni, std::move(new_right)); } } @@ -176,29 +174,29 @@ void Grammar::EliminateLeftRecursions() { } } - auto ni_h = CreateNonterminal(ni->GetName() + - u" (Eliminate Left Recursion Helper)"); + auto ni_h = + CreateNonterminal(ni->GetName() + " (Eliminate Left Recursion Helper)"); for (auto p : i_nr_ps) { auto right = p->GetRight(); right.push_back(ni_h); - CreateProduction(p->GetName() + u" (Eliminate Left Recursion Of " + - ni->GetName() + u")", - ni, std::move(right)); + CreateProduction( + p->GetName() + " (Eliminate Left Recursion Of " + ni->GetName() + ")", + ni, std::move(right)); } for (auto p : i_r_ps) { auto right = p->GetRight(); right.erase(right.cbegin()); right.push_back(ni_h); - CreateProduction(p->GetName() + u" (Eliminate Left Recursion Of " + - ni->GetName() + u")", - ni_h, std::move(right)); + CreateProduction( + p->GetName() + " (Eliminate Left Recursion Of " + ni->GetName() + ")", + ni_h, std::move(right)); } - CreateProduction(u"Empty Production (Eliminate Left Recursion Of " + - ni->GetName() + u")", - ni_h, std::vector<Symbol*>{}); + CreateProduction( + "Empty Production (Eliminate Left Recursion Of " + ni->GetName() + ")", + ni_h, std::vector<Symbol*>{}); for (auto p : i_r_ps) { RemoveProduction(p); @@ -269,35 +267,35 @@ void Grammar::LeftFactor() { productions.end()); auto helper_nonterminal = - CreateNonterminal(nonterminal->GetName() + u" (Left Factor Helper)"); + CreateNonterminal(nonterminal->GetName() + " (Left Factor Helper)"); for (auto p : productions_with_longest_common_prefix) { auto right = p->GetRight(); right.erase(right.cbegin(), right.cbegin() + longest_common_prefix.size()); - CreateProduction(p->GetName() + u" (Left Factor Helper)", + CreateProduction(p->GetName() + " (Left Factor Helper)", helper_nonterminal, std::move(right)); } auto new_right = longest_common_prefix; new_right.push_back(helper_nonterminal); - CreateProduction(nonterminal->GetName() + u" (Left Factor)", nonterminal, + CreateProduction(nonterminal->GetName() + " (Left Factor)", nonterminal, new_right); } } } -String Grammar::ProductionsToString() const { - String result; +std::string Grammar::ProductionsToString() const { + std::string result; for (const auto& production : productions_) { - result += production->GetName() + u" : "; - result += production->GetLeft()->GetName() + u" := "; + result += production->GetName() + " : "; + result += production->GetLeft()->GetName() + " := "; for (auto s : production->GetRight()) { - result += s->GetName() + u" "; + result += s->GetName() + " "; } - result += u"\n"; + result += "\n"; } return result; diff --git a/src/parse/Nonterminal.cpp b/src/parse/Nonterminal.cpp index 4fb33695..7c1df8f8 100644 --- a/src/parse/Nonterminal.cpp +++ b/src/parse/Nonterminal.cpp @@ -1,7 +1,7 @@ #include "cru/parse/Nonterminal.h" namespace cru::parse { -Nonterminal::Nonterminal(Grammar* grammar, String name) +Nonterminal::Nonterminal(Grammar* grammar, std::string name) : Symbol(grammar, std::move(name)) {} Nonterminal::~Nonterminal() {} diff --git a/src/parse/Production.cpp b/src/parse/Production.cpp index 1552874f..36115802 100644 --- a/src/parse/Production.cpp +++ b/src/parse/Production.cpp @@ -1,7 +1,7 @@ #include "cru/parse/Production.h" namespace cru::parse { -Production::Production(Grammar* grammar, String name, Nonterminal* left, +Production::Production(Grammar* grammar, std::string name, Nonterminal* left, std::vector<Symbol*> right) : grammar_(grammar), name_(std::move(name)), diff --git a/src/parse/Symbol.cpp b/src/parse/Symbol.cpp index fe4cc47c..9cb1380f 100644 --- a/src/parse/Symbol.cpp +++ b/src/parse/Symbol.cpp @@ -1,7 +1,7 @@ #include "cru/parse/Symbol.h" namespace cru::parse { -Symbol::Symbol(Grammar* grammar, String name) +Symbol::Symbol(Grammar* grammar, std::string name) : grammar_(grammar), name_(std::move(name)) {} Symbol::~Symbol() {} diff --git a/src/parse/Terminal.cpp b/src/parse/Terminal.cpp index 421836f7..88c06017 100644 --- a/src/parse/Terminal.cpp +++ b/src/parse/Terminal.cpp @@ -1,7 +1,7 @@ #include "cru/parse/Terminal.h" namespace cru::parse { -Terminal::Terminal(Grammar* grammar, String name) : Symbol(grammar, name) {} +Terminal::Terminal(Grammar* grammar, std::string name) : Symbol(grammar, name) {} Terminal::~Terminal() {} } // namespace cru::parse diff --git a/src/parse/TokenType.cpp b/src/parse/TokenType.cpp index 386b1401..39af4187 100644 --- a/src/parse/TokenType.cpp +++ b/src/parse/TokenType.cpp @@ -1,7 +1,7 @@ #include "cru/parse/TokenType.h" namespace cru::parse { -TokenType::TokenType(String name) : name_(std::move(name)) {} +TokenType::TokenType(std::string name) : name_(std::move(name)) {} TokenType::~TokenType() {} |