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