aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-09-11 17:16:51 +0800
committercrupest <crupest@outlook.com>2021-09-11 17:16:51 +0800
commit9f0aa0b06666dc99515a4250085b31f0efa81af8 (patch)
tree1af7177d0117f8d7ef6a6eb0c9ec6a7152f8f734
parentf6c39185f36070d4e092e4c9d2074b418b8bcf03 (diff)
downloadcru-9f0aa0b06666dc99515a4250085b31f0efa81af8.tar.gz
cru-9f0aa0b06666dc99515a4250085b31f0efa81af8.tar.bz2
cru-9f0aa0b06666dc99515a4250085b31f0efa81af8.zip
...
-rw-r--r--include/cru/parse/Grammar.hpp4
-rw-r--r--src/parse/Grammar.cpp10
2 files changed, 14 insertions, 0 deletions
diff --git a/include/cru/parse/Grammar.hpp b/include/cru/parse/Grammar.hpp
index 42649c30..98bed1b1 100644
--- a/include/cru/parse/Grammar.hpp
+++ b/include/cru/parse/Grammar.hpp
@@ -1,6 +1,7 @@
#pragma once
#include "Production.hpp"
+#include <unordered_map>
#include <vector>
namespace cru::parse {
@@ -38,6 +39,9 @@ class Grammar : public Object {
Grammar* Clone() const;
public: // Algorithms
+ std::unordered_map<Nonterminal*, std::vector<Production*>>
+ GenerateLeftProductionMap() const;
+
void EliminateLeftRecursions();
private:
diff --git a/src/parse/Grammar.cpp b/src/parse/Grammar.cpp
index 5486542b..8253c3c3 100644
--- a/src/parse/Grammar.cpp
+++ b/src/parse/Grammar.cpp
@@ -112,4 +112,14 @@ Grammar* Grammar::Clone() const {
return g;
}
+std::unordered_map<Nonterminal*, std::vector<Production*>>
+Grammar::GenerateLeftProductionMap() const {
+ std::unordered_map<Nonterminal*, std::vector<Production*>> result;
+ for (auto p : productions_) {
+ result[p->GetLeft()].push_back(p);
+ }
+ return result;
+}
+
+void Grammar::EliminateLeftRecursions() {}
} // namespace cru::parse