From 829d92d2b64d8724f1903fb3450bf1a375c92836 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 28 May 2015 18:42:48 +0200 Subject: [PATCH] fix generating CFG, intersection term./nonterm. --- .../src/grammar/generate/RandomGrammarFactory.cpp | 2 +- .../TerminalNonterminalAlphabetInitialSymbol.cpp | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp index bdc047df55..65f351a6d7 100644 --- a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp +++ b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp @@ -35,7 +35,7 @@ grammar::CFG RandomGrammarFactory::generateCFG( size_t nonterminalsCount, size_t throw exception::AlibException("Too big nonterminals count."); std::vector<alphabet::Symbol> symbols2; - for(int i = 0; i < 26; i++) symbols2.push_back(alphabet::symbolFrom(i + 'a')); + for(int i = 0; i < 26; i++) symbols2.push_back(alphabet::symbolFrom(i + 'A')); if(randomizedAlphabet) random_shuffle(symbols2.begin(), symbols2.end()); std::deque<alphabet::Symbol> nonterminals(symbols2.begin(), symbols2.begin() + nonterminalsCount); diff --git a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp index b201de1dd3..f5871fc07e 100644 --- a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp +++ b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp @@ -42,7 +42,10 @@ void TerminalNonterminalAlphabetInitialSymbol::setTerminalAlphabet(std::set<alph for(const alphabet::Symbol& removedSymbol : removed) { removeTerminalSymbol(removedSymbol); } - // TODO check intersection with nonterminal alphabet + + if(!std::excludes(terminalAlphabet.begin(), terminalAlphabet.end(), nonterminalAlphabet.begin(), nonterminalAlphabet.end())) + throw GrammarException("Terminal alphabet and nonterminal alphabet intersect"); + terminalAlphabet = std::move(alphabet); } @@ -65,7 +68,10 @@ void TerminalNonterminalAlphabetInitialSymbol::setNonterminalAlphabet(std::set<a for(const alphabet::Symbol& removedSymbol : removed) { removeNonterminalSymbol(removedSymbol); } - // TODO check intersection with nonterminal alphabet + + if(!std::excludes(terminalAlphabet.begin(), terminalAlphabet.end(), nonterminalAlphabet.begin(), nonterminalAlphabet.end())) + throw GrammarException("Terminal alphabet and nonterminal alphabet intersect"); + nonterminalAlphabet = std::move(alphabet); } -- GitLab