diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parse/Grammar.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/parse/Grammar.cpp b/src/parse/Grammar.cpp index e69de29b..8d929212 100644 --- a/src/parse/Grammar.cpp +++ b/src/parse/Grammar.cpp @@ -0,0 +1,38 @@ +#include "cru/parse/Grammar.hpp" +#include "cru/parse/Symbol.hpp" + +#include <algorithm> + +namespace cru::parse { +Grammar::Grammar() {} + +Grammar::~Grammar() {} + +Terminal* Grammar::CreateTerminal(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) { + 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, + std::vector<Symbol*> right) { + Expects(left->GetGrammar() == this); + Expects(std::all_of(right.cbegin(), right.cend(), [this](Symbol* symbol) { + return symbol->GetGrammar() == this; + })); + + auto production = + new Production(this, std::move(name), left, std::move(right)); + productions_.push_back(production); + return production; +} + +} // namespace cru::parse |