From 9bc24b51c70bb0d1bea9c400148adefa2406f26a Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sun, 15 Nov 2015 12:21:30 +0100 Subject: [PATCH] another complex test of first follow confl. resol. --- .../parsing/HandleFirstFollowConflict.cpp | 76 ++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp b/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp index 1b36570d8e..e31770e522 100644 --- a/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp +++ b/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp @@ -56,7 +56,7 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict ( ) { comp.addRule ( C, std::vector < alphabet::Symbol > { a, C } ); comp.addRule ( C, std::vector < alphabet::Symbol > { b, B } ); - std::cout << "res " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp " << alib::StringDataFactory::toString ( grammar::Grammar ( comp ) ) << std::endl; +// std::cout << "res " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp " << alib::StringDataFactory::toString ( grammar::Grammar ( comp ) ) << std::endl; CPPUNIT_ASSERT ( res == comp ); @@ -78,10 +78,82 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict ( ) { comp2.addRule ( C, std::vector < alphabet::Symbol > { a, C } ); comp2.addRule ( C, std::vector < alphabet::Symbol > { b, B } ); - std::cout << "res2 " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp2 " << alib::StringDataFactory::toString ( grammar::Grammar ( comp2 ) ) << std::endl; +// std::cout << "res2 " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp2 " << alib::StringDataFactory::toString ( grammar::Grammar ( comp2 ) ) << std::endl; CPPUNIT_ASSERT ( res == comp2 ); } void HandleFirstFollowConflict::testHandleFirstFollowConflict2 ( ) { + alphabet::Symbol A = alphabet::symbolFrom ( "A" ); + alphabet::Symbol B = alphabet::symbolFrom ( "B" ); + alphabet::Symbol C = alphabet::symbolFrom ( "C" ); + alphabet::Symbol X = alphabet::symbolFrom ( "X" ); + + alphabet::Symbol a = alphabet::symbolFrom ( 'a' ); + alphabet::Symbol b = alphabet::symbolFrom ( 'b' ); + alphabet::Symbol c = alphabet::symbolFrom ( 'c' ); + alphabet::Symbol d = alphabet::symbolFrom ( 'd' ); + + alphabet::Symbol Ba = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) ), { }, { } ); + alphabet::Symbol Xa = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( X, a ) ) ), { }, { } ); + + grammar::CFG grammar ( A ); + + grammar.setTerminalAlphabet ( { a, b, c, d } ); + grammar.setNonterminalAlphabet ( { A, B, C, X } ); + grammar.setInitialSymbol ( A ); + + grammar.addRule ( A, std::vector < alphabet::Symbol > { a, X, C, a } ); + grammar.addRule ( A, std::vector < alphabet::Symbol > { c, C } ); + grammar.addRule ( X, { c, B }); + grammar.addRule ( B, std::vector < alphabet::Symbol > { a, B, a, d } ); + grammar.addRule ( B, std::vector < alphabet::Symbol > { } ); + grammar.addRule ( C, std::vector < alphabet::Symbol > { a, C } ); + grammar.addRule ( C, std::vector < alphabet::Symbol > { b, B, c } ); + + grammar::CFG res = grammar; + grammar::parsing::HandleFirstFollowConflict::handleFirstFollowConflict ( res, a, B, { { a, B, C }, { } } ); + + grammar::CFG comp ( A ); + + comp.setTerminalAlphabet ( { a, b, c, d } ); + comp.setNonterminalAlphabet ( { A, B, C, X } ); + comp.setInitialSymbol ( A ); + + comp.addRule ( A, std::vector < alphabet::Symbol > { a, X, a, C, a } ); + comp.addRule ( A, std::vector < alphabet::Symbol > { a, X, b, B, c, a } ); + comp.addRule ( A, std::vector < alphabet::Symbol > { c, C } ); + comp.addRule ( X, { c, B } ); + comp.addRule ( B, std::vector < alphabet::Symbol > { a, B, a, d } ); + comp.addRule ( B, std::vector < alphabet::Symbol > { } ); + comp.addRule ( C, std::vector < alphabet::Symbol > { a, C } ); + comp.addRule ( C, std::vector < alphabet::Symbol > { b, B, c } ); + +// std::cout << "res " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp " << alib::StringDataFactory::toString ( grammar::Grammar ( comp ) ) << std::endl; + + CPPUNIT_ASSERT ( res == comp ); + + grammar::parsing::HandleFirstFollowConflict::handleFirstFollowConflict ( res, a, B, { { a, B, C }, { } } ); + + grammar::CFG comp2 ( A ); + + comp2.setTerminalAlphabet ( { a, b, c, d } ); + comp2.setNonterminalAlphabet ( { A, B, Ba, C, X, Xa } ); + comp2.setInitialSymbol ( A ); + + comp2.addRule ( A, std::vector < alphabet::Symbol > { a, Xa, C, a } ); + comp2.addRule ( A, std::vector < alphabet::Symbol > { a, X, b, B, c, a } ); + comp2.addRule ( A, std::vector < alphabet::Symbol > { c, C } ); + comp2.addRule ( X, { c, B } ); + comp2.addRule ( Xa, { c, Ba } ); + comp2.addRule ( B, std::vector < alphabet::Symbol > { a, Ba, d } ); + comp2.addRule ( B, std::vector < alphabet::Symbol > { } ); + comp2.addRule ( Ba, std::vector < alphabet::Symbol > { a, Ba, d, a } ); + comp2.addRule ( Ba, std::vector < alphabet::Symbol > { a } ); + comp2.addRule ( C, std::vector < alphabet::Symbol > { a, C } ); + comp2.addRule ( C, std::vector < alphabet::Symbol > { b, B, c } ); + +// std::cout << "res2 " << alib::StringDataFactory::toString ( grammar::Grammar ( res ) ) << std::endl << "comp2 " << alib::StringDataFactory::toString ( grammar::Grammar ( comp2 ) ) << std::endl; + + CPPUNIT_ASSERT ( res == comp2 ); } -- GitLab