Skip to content
Snippets Groups Projects
Commit 59050696 authored by Tomáš Pecka's avatar Tomáš Pecka
Browse files

algo: rg2rg interface

parent 4862813f
No related branches found
No related tags found
No related merge requests found
......@@ -9,31 +9,22 @@
 
namespace rg2rg {
 
LeftToRightRegularGrammar::LeftToRightRegularGrammar( const grammar::LeftRG & lrg ) : m_lrg( lrg ) {
}
LeftToRightRegularGrammar::~LeftToRightRegularGrammar( void )
{
}
grammar::RightRG LeftToRightRegularGrammar::convert( void )
grammar::RightRG LeftToRightRegularGrammar::convert(const grammar::LeftRG& lrg)
{
// 1.
alphabet::Symbol s = alphabet::createUniqueSymbol( m_lrg.getInitialSymbol( ), m_lrg.getNonterminalAlphabet(), m_lrg.getTerminalAlphabet() );
alphabet::Symbol s = alphabet::createUniqueSymbol( lrg.getInitialSymbol( ), lrg.getNonterminalAlphabet(), lrg.getTerminalAlphabet() );
 
grammar::RightRG rrg( s );
 
for(const auto & nonterminalSymbol : m_lrg.getNonterminalAlphabet() ) {
for(const auto & nonterminalSymbol : lrg.getNonterminalAlphabet() ) {
rrg.addNonterminalSymbol( nonterminalSymbol );
}
 
rrg.setTerminalAlphabet( m_lrg.getTerminalAlphabet( ) );
rrg.setGeneratesEpsilon( m_lrg.getGeneratesEpsilon( ) );
rrg.setTerminalAlphabet( lrg.getTerminalAlphabet( ) );
rrg.setGeneratesEpsilon( lrg.getGeneratesEpsilon( ) );
 
// 2
for( const auto & rule : m_lrg.getRules( ) ) {
for( const auto & rule : lrg.getRules( ) ) {
const alphabet::Symbol& lhs = rule.first;
 
for(const auto & ruleRHS : rule.second ) {
......@@ -44,7 +35,7 @@ grammar::RightRG LeftToRightRegularGrammar::convert( void )
std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( rhs.second, lhs );
rrg.addRule( leftSide, rightSide );
 
if( lhs == m_lrg.getInitialSymbol( ) ) {
if( lhs == lrg.getInitialSymbol( ) ) {
alphabet::Symbol leftSide = rhs.first;
alphabet::Symbol rightSide = rhs.second;
rrg.addRule( leftSide, rightSide );
......@@ -56,7 +47,7 @@ grammar::RightRG LeftToRightRegularGrammar::convert( void )
std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( rhs, lhs );
rrg.addRule( leftSide, rightSide );
 
if( lhs == m_lrg.getInitialSymbol( ) ) {
if( lhs == lrg.getInitialSymbol( ) ) {
alphabet::Symbol leftSide = rrg.getInitialSymbol( );
alphabet::Symbol rightSide = rhs;
rrg.addRule( leftSide, rightSide );
......
......@@ -17,24 +17,11 @@ namespace rg2rg
class LeftToRightRegularGrammar
{
public:
/**
* @param lrg Original left regular grammar.
*/
LeftToRightRegularGrammar( const grammar::LeftRG & lrg );
~LeftToRightRegularGrammar( void );
/**
/**
* Performs conversion.
* @return right regular grammar which is equivalent to source left regular grammar.
*/
grammar::RightRG convert( void );
protected:
/**
* input grammar
*/
const grammar::LeftRG & m_lrg;
grammar::RightRG convert(const grammar::LeftRG& lrg);
};
 
} /* namespace rg2rg */
......
......@@ -10,32 +10,22 @@
namespace rg2rg
{
 
RightToLeftRegularGrammar::RightToLeftRegularGrammar( const grammar::RightRG & rrg ) : m_rrg( rrg )
{
}
RightToLeftRegularGrammar::~RightToLeftRegularGrammar( void )
{
}
grammar::LeftRG RightToLeftRegularGrammar::convert( void )
grammar::LeftRG RightToLeftRegularGrammar::convert(const grammar::RightRG& rrg)
{
// 1.
alphabet::Symbol s = alphabet::createUniqueSymbol( m_rrg.getInitialSymbol( ), m_rrg.getNonterminalAlphabet(), m_rrg.getTerminalAlphabet() );
alphabet::Symbol s = alphabet::createUniqueSymbol( rrg.getInitialSymbol( ), rrg.getNonterminalAlphabet(), rrg.getTerminalAlphabet() );
 
grammar::LeftRG lrg(s);
 
for(const auto & nonterminalSymbol : m_rrg.getNonterminalAlphabet()) {
for(const auto & nonterminalSymbol : rrg.getNonterminalAlphabet()) {
lrg.addNonterminalSymbol( nonterminalSymbol );
}
 
lrg.setTerminalAlphabet( m_rrg.getTerminalAlphabet( ) );
lrg.setGeneratesEpsilon( m_rrg.getGeneratesEpsilon( ) );
lrg.setTerminalAlphabet( rrg.getTerminalAlphabet( ) );
lrg.setGeneratesEpsilon( rrg.getGeneratesEpsilon( ) );
 
// 2.
for( const auto & rule : m_rrg.getRules( ) ) {
for( const auto & rule : rrg.getRules( ) ) {
const alphabet::Symbol& lhs = rule.first;
 
for(const auto & ruleRHS : rule.second ) {
......@@ -46,7 +36,7 @@ grammar::LeftRG RightToLeftRegularGrammar::convert( void )
std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair( lhs, rhs.first );
lrg.addRule( leftSide, rightSide );
 
if( lhs == m_rrg.getInitialSymbol( ) ) {
if( lhs == rrg.getInitialSymbol( ) ) {
alphabet::Symbol leftSide = rhs.second;
alphabet::Symbol rightSide = rhs.first;
lrg.addRule( leftSide, rightSide );
......@@ -58,7 +48,7 @@ grammar::LeftRG RightToLeftRegularGrammar::convert( void )
std::pair<alphabet::Symbol, alphabet::Symbol> rightSide = std::make_pair ( lhs, rhs );
lrg.addRule( leftSide, rightSide );
 
if( lhs == m_rrg.getInitialSymbol( ) ) {
if( lhs == rrg.getInitialSymbol( ) ) {
alphabet::Symbol leftSide = lrg.getInitialSymbol( );
alphabet::Symbol rightSide = rhs;
lrg.addRule( leftSide, rightSide );
......
......@@ -20,24 +20,11 @@ namespace rg2rg
class RightToLeftRegularGrammar
{
public:
/**
* @param rrg Original right regular grammar.
*/
RightToLeftRegularGrammar( const grammar::RightRG & rrg );
~RightToLeftRegularGrammar( void );
/**
* Performs conversion.
* @return left regular grammar which is equivalent to source right regular grammar.
*/
grammar::LeftRG convert( void );
private:
/**
*
*/
const grammar::RightRG & m_rrg;
grammar::LeftRG convert(const grammar::RightRG& rrg);
};
 
} /* namespace rg2rg */
......
......@@ -32,8 +32,8 @@ void rg2rgTest::testConversion() {
rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))));
rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
 
rg2rg::RightToLeftRegularGrammar convertor(rrGrammar);
grammar::LeftRG lrGrammar = convertor.convert();
rg2rg::RightToLeftRegularGrammar convertor;;
grammar::LeftRG lrGrammar = convertor.convert(rrGrammar);
 
grammar::LeftRG lrGrammarRef(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))));
 
......@@ -64,8 +64,8 @@ void rg2rgTest::testConversion2() {
lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b"))))));
lrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a"))))));
 
rg2rg::LeftToRightRegularGrammar convertor(lrGrammar);
grammar::RightRG rrGrammar = convertor.convert();
rg2rg::LeftToRightRegularGrammar convertor;
grammar::RightRG rrGrammar = convertor.convert(lrGrammar);
 
grammar::RightRG rrGrammarRef(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))));
 
......
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