#pragma once #include "cru/common/String.hpp" #include "Nonterminal.hpp" #include "Terminal.hpp" #include namespace cru::parse { class CRU_PARSE_API Production : public Object { public: Production(Grammar* grammar, String name, Nonterminal* left, std::vector right); CRU_DELETE_COPY(Production) CRU_DELETE_MOVE(Production) ~Production() override; public: Grammar* GetGrammar() const { return grammar_; } String GetName() const { return name_; } void SetName(String name) { name_ = std::move(name); } Nonterminal* GetLeft() const { return left_; } void SetLeft(Nonterminal* left); const std::vector& GetRight() const { return right_; } void SetRight(std::vector right); bool IsLeftRecursion() const { return !right_.empty() && left_ == right_.front(); } private: Grammar* grammar_; String name_; Nonterminal* left_; std::vector right_; }; } // namespace cru::parse