aboutsummaryrefslogtreecommitdiff
path: root/src/parse/Grammar.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-09-14 22:10:02 +0800
committercrupest <crupest@outlook.com>2021-09-14 22:10:02 +0800
commit46d4838ac8ff1bd8658b57cf4ebb4438e396fce8 (patch)
treef1e04c19630c7f42ad57618e9a2d7cf5ea4d31c1 /src/parse/Grammar.cpp
parent9bc202a2e1664df3e3c148abfe90a90501bc1650 (diff)
downloadcru-46d4838ac8ff1bd8658b57cf4ebb4438e396fce8.tar.gz
cru-46d4838ac8ff1bd8658b57cf4ebb4438e396fce8.tar.bz2
cru-46d4838ac8ff1bd8658b57cf4ebb4438e396fce8.zip
...
Diffstat (limited to 'src/parse/Grammar.cpp')
-rw-r--r--src/parse/Grammar.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/parse/Grammar.cpp b/src/parse/Grammar.cpp
index 95c65e99..34eb2dd4 100644
--- a/src/parse/Grammar.cpp
+++ b/src/parse/Grammar.cpp
@@ -122,8 +122,6 @@ Grammar::GenerateLeftProductionMap() const {
}
void Grammar::EliminateLeftRecursions() {
- // TODO: Use a better name.
-
auto nonterminals = nonterminals_;
for (int i = 0; i < nonterminals.size(); i++) {
auto ni = nonterminals[i];
@@ -148,6 +146,7 @@ void Grammar::EliminateLeftRecursions() {
auto new_right = right;
new_right.insert(new_right.cbegin(), jp->GetRight().cbegin(),
jp->GetRight().cend());
+ // TODO: What should this name be.
CreateProduction(u"", ni, std::move(new_right));
}
}
@@ -167,22 +166,29 @@ void Grammar::EliminateLeftRecursions() {
}
}
- auto ni_h = CreateNonterminal(u"");
+ auto ni_h = CreateNonterminal(ni->GetName() +
+ u" (Eliminate Left Recursion Helper)");
for (auto p : i_nr_ps) {
auto right = p->GetRight();
right.push_back(ni_h);
- CreateProduction(u"", ni, std::move(right));
+ CreateProduction(p->GetName() + u" (Eliminate Left Recursion Of " +
+ ni->GetName() + u")",
+ ni, std::move(right));
}
for (auto p : i_r_ps) {
auto right = p->GetRight();
right.erase(right.cbegin());
right.push_back(ni_h);
- CreateProduction(u"", ni_h, std::move(right));
+ CreateProduction(p->GetName() + u" (Eliminate Left Recursion Of " +
+ ni->GetName() + u")",
+ ni_h, std::move(right));
}
- CreateProduction(u"", ni_h, std::vector<Symbol*>{});
+ CreateProduction(u"Empty Production (Eliminate Left Recursion Of " +
+ ni->GetName() + u")",
+ ni_h, std::vector<Symbol*>{});
for (auto p : i_r_ps) {
RemoveProduction(p);
@@ -193,4 +199,6 @@ void Grammar::EliminateLeftRecursions() {
}
}
}
+
+void Grammar::LeftFactor() {}
} // namespace cru::parse