aboutsummaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/CMakeLists.txt2
-rw-r--r--src/parse/Grammar.cpp26
2 files changed, 25 insertions, 3 deletions
diff --git a/src/parse/CMakeLists.txt b/src/parse/CMakeLists.txt
index de096c08..5c8a6dfa 100644
--- a/src/parse/CMakeLists.txt
+++ b/src/parse/CMakeLists.txt
@@ -7,4 +7,4 @@ add_library(cru_parse SHARED
Token.cpp
TokenType.cpp
)
-target_link_libraries(cru_parse PUBLIC cru_common)
+target_link_libraries(cru_parse PUBLIC cru_base)
diff --git a/src/parse/Grammar.cpp b/src/parse/Grammar.cpp
index 9d486c38..19095150 100644
--- a/src/parse/Grammar.cpp
+++ b/src/parse/Grammar.cpp
@@ -1,4 +1,5 @@
#include "cru/parse/Grammar.hpp"
+#include "cru/common/String.hpp"
#include "cru/parse/Symbol.hpp"
#include <algorithm>
@@ -19,6 +20,10 @@ Grammar::~Grammar() {
}
}
+void Grammar::SetStartSymbol(Nonterminal* start_symbol) {
+ start_symbol_ = start_symbol;
+}
+
Terminal* Grammar::CreateTerminal(String name) {
auto terminal = new Terminal(this, std::move(name));
terminals_.push_back(terminal);
@@ -147,8 +152,10 @@ 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));
+ CreateProduction(
+ Format(u"Merge of {} and {} (Eliminate Left Recursion)",
+ production->GetName(), jp->GetName()),
+ ni, std::move(new_right));
}
}
}
@@ -278,4 +285,19 @@ void Grammar::LeftFactor() {
}
}
}
+
+String Grammar::ProductionsToString() const {
+ String result;
+
+ for (const auto& production : productions_) {
+ result += production->GetName() + u" : ";
+ result += production->GetLeft()->GetName() + u" := ";
+ for (auto s : production->GetRight()) {
+ result += s->GetName() + u" ";
+ }
+ result += u"\n";
+ }
+
+ return result;
+}
} // namespace cru::parse