Skip to content
Snippets Groups Projects
Commit b89c3cbe authored by Jan Trávníček's avatar Jan Trávníček
Browse files

Composers for grammars

parent 903c5a61
No related branches found
No related tags found
No related merge requests found
......@@ -40,64 +40,157 @@ std::list<sax::Token> GrammarToXMLComposer::compose(const UnknownGrammar& gramma
 
std::list<sax::Token> GrammarToXMLComposer::compose(const LeftLG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("LeftLG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
 
out.push_back(sax::Token("LeftLG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const LeftRG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("LeftRG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
 
out.push_back(sax::Token("LeftRG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const RightLG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("RightLG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
 
out.push_back(sax::Token("RightLG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const RightRG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("RightRG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("RightRG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const LG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("LG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("LG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const CFG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("CFG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("CFG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const EpsilonFreeCFG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("EpsilonFreeCFG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("EpsilonFreeCFG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const CNF& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("CNF", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("CNF", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const GNF& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("GNF", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("GNF", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const CSG& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("CSG", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("CSG", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const NonContractingGrammar& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("NonContractingGrammar", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("NonContractingGrammar", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
std::list<sax::Token> GrammarToXMLComposer::compose(const ContextPreservingUnrestrictedGrammar& grammar) const {
std::list<sax::Token> out;
out.push_back(sax::Token("ContextPreservingUnrestrictedGrammar", sax::Token::TokenType::START_ELEMENT));
composeNonterminalAlphabet(out, grammar.getNonterminalAlphabet());
composeTerminalAlphabet(out, grammar.getTerminalAlphabet());
composeInitialSymbol(out, grammar.getInitialSymbol());
composeRules(out, grammar);
out.push_back(sax::Token("ContextPreservingUnrestrictedGrammar", sax::Token::TokenType::END_ELEMENT));
return out;
}
 
......@@ -162,7 +255,210 @@ void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const Unrest
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
 
composeRuleLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const ContextPreservingUnrestrictedGrammar& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const NonContractingGrammar& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const CSG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const GNF& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
 
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const CNF& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const EpsilonFreeCFG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const CFG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const LG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const RightLG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const RightRG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const LeftLG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
}
}
out.push_back(sax::Token("rules", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRules(std::list<sax::Token>& out, const LeftRG& grammar) const {
out.push_back(sax::Token("rules", sax::Token::TokenType::START_ELEMENT));
for (const auto& rule : grammar.getRules()) {
for(const auto& rhs : rule.second) {
out.push_back(sax::Token("rule", sax::Token::TokenType::START_ELEMENT));
composeRuleSingleSymbolLHS(out, rule.first);
composeRuleRHS(out, rhs);
 
out.push_back(sax::Token("rule", sax::Token::TokenType::END_ELEMENT));
......@@ -180,6 +476,12 @@ void GrammarToXMLComposer::composeRuleLHS(std::list<sax::Token>& out, const std:
out.push_back(sax::Token("lhs", sax::Token::TokenType::END_ELEMENT));
}
 
void GrammarToXMLComposer::composeRuleSingleSymbolLHS(std::list<sax::Token>& out, const alphabet::Symbol& symbol) const {
out.push_back(sax::Token("lhs", sax::Token::TokenType::START_ELEMENT));
out.splice(out.end(), alib::ToXMLComposers::symbolComposer.compose(symbol));
out.push_back(sax::Token("lhs", sax::Token::TokenType::END_ELEMENT));
}
void GrammarToXMLComposer::composeRuleRHS(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols) const {
out.push_back(sax::Token("rhs", sax::Token::TokenType::START_ELEMENT));
for (const auto& symbol : symbols) {
......
......@@ -55,8 +55,21 @@ class GrammarToXMLComposer : public GrammarBase::const_visitor_type {
void composeRules(std::list<sax::Token>& out, const UnknownGrammar& grammar) const;
void composeRules(std::list<sax::Token>& out, const UnrestrictedGrammar& grammar) const;
void composeRules(std::list<sax::Token>& out, const ContextPreservingUnrestrictedGrammar& grammar) const;
void composeRules(std::list<sax::Token>& out, const NonContractingGrammar& grammar) const;
void composeRules(std::list<sax::Token>& out, const CSG& grammar) const;
void composeRules(std::list<sax::Token>& out, const GNF& grammar) const;
void composeRules(std::list<sax::Token>& out, const CNF& grammar) const;
void composeRules(std::list<sax::Token>& out, const EpsilonFreeCFG& grammar) const;
void composeRules(std::list<sax::Token>& out, const CFG& grammar) const;
void composeRules(std::list<sax::Token>& out, const LG& grammar) const;
void composeRules(std::list<sax::Token>& out, const LeftLG& grammar) const;
void composeRules(std::list<sax::Token>& out, const LeftRG& grammar) const;
void composeRules(std::list<sax::Token>& out, const RightLG& grammar) const;
void composeRules(std::list<sax::Token>& out, const RightRG& grammar) const;
 
void composeRuleLHS(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols) const;
void composeRuleSingleSymbolLHS(std::list<sax::Token>& out, const alphabet::Symbol& symbols) const;
void composeRuleRHS(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols) const;
public:
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment