aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/parse/EliminateLeftRecursion.cpp10
-rw-r--r--include/cru/parse/Grammar.h9
-rw-r--r--include/cru/parse/Nonterminal.h2
-rw-r--r--include/cru/parse/Production.h12
-rw-r--r--include/cru/parse/Symbol.h11
-rw-r--r--include/cru/parse/Terminal.h3
-rw-r--r--include/cru/parse/TokenType.h12
-rw-r--r--src/parse/Grammar.cpp52
-rw-r--r--src/parse/Nonterminal.cpp2
-rw-r--r--src/parse/Production.cpp2
-rw-r--r--src/parse/Symbol.cpp2
-rw-r--r--src/parse/Terminal.cpp2
-rw-r--r--src/parse/TokenType.cpp2
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() {}