void leftRecursionEleminationAndLeftFactoring() { grammarr = getGrammarMap(); terminalss = getTerminals(); nonTerminalss = getNonTerminals(); cout << "################## FIRST LEFT FACTORING #################" << endl; allLeftFactor(); cout << "################ LEFT RECURSION ELEMINATION #############" << endl; leftRecursionElemination(); cout << "################## SECOND LEFT FACTORING ################" << endl; allLeftFactor(); }
/*Utility*/ void printGrammar(GrammarADT grammar) { printf("Grammar\n"); printf("Distinguished: %c \n",getDistinguished(grammar)); int i ; printf("Terminals: {"); for(i=0; i < getQuantTerminals(grammar); i++) { printf(" %c ",getTerminals(grammar)[i]); } printf("}\n"); printf("Non Terminals: {"); for(i=0; i < getQuantNonTerminals(grammar); i++) { printf(" %c ",getNonTerminals(grammar)[i]); } printf("}\n"); printProductions(getProductions(grammar)); printf("Production Quant %d\n",getQuant(getProductions(grammar))); return; }
TEST_F(TestCFG, BNF) { auto test = CFG::create(BNF()); ASSERT_NO_THROW(test << "<S> ::= 'a'<A>'b' | ''"); ASSERT_NO_THROW(test << "<A> ::= 'a'<A> | 'b'<A> | ''"); EXPECT_EQ(set({"a", "b"}), test.getTerminals()); EXPECT_EQ(set({"<S>", "<A>"}), test.getNonTerminals()); test.clear(); test << "<S> ::= <S>'s' | <B><C><D>"; test << "<A> ::= <S><A>'a' | ''"; test << "<B> ::= <C>'c'"; test << "<C> ::= <B>'b' | <S>'s' | <A>"; test << "<D> ::= <D>'d' | <D><B> | ''"; ASSERT_EQ(set({"c"}), test.first("<S>")); ASSERT_EQ(set({"c"}), test.first("<A>")); ASSERT_EQ(set({"c"}), test.first("<B>")); ASSERT_EQ(set({"c"}), test.first("<C>")); ASSERT_EQ(set({"c", "d"}), test.first("<D>")); ASSERT_FALSE(test.nullable("<S>")); ASSERT_TRUE(test.nullable("<A>")); ASSERT_FALSE(test.nullable("<B>")); ASSERT_TRUE(test.nullable("<C>")); ASSERT_TRUE(test.nullable("<D>")); }
void toFile(GrammarADT grammar) { FILE * fp = fopen("grammar.gr", "w"); if(fp == NULL) { printf("Error: File could not be created\n"); fclose(fp); return; } fprintf(fp, "G1 = ({"); int i; for(i = 0; i < getQuantNonTerminals(grammar); i++) { fprintf(fp, "%c%s", getNonTerminals(grammar)[i], (i == getQuantNonTerminals(grammar)-1?"}":", ")); } fprintf(fp, ", {"); for(i = 0; i < getQuantTerminals(grammar); i++) { fprintf(fp, "%c%s", getTerminals(grammar)[i], (i == getQuantTerminals(grammar)-1?"}":", ")); } fprintf(fp, ", %c, {", getDistinguished(grammar)); for(i = 0; i < getQuant(getProductions(grammar)); i++) { fprintf(fp, "%c -> %c%c%s", getProductionComponent(getProduction(getProductions(grammar), i), 0), getProductionComponent(getProduction(getProductions(grammar), i), 1), getProductionComponent(getProduction(getProductions(grammar), i), 2), (i == getQuant(getProductions(grammar))-1? "}": ", ")); } fprintf(fp, ")"); fclose(fp); return; }
TEST_F(TestCFG, DidacticNotation) { auto test = CFG::create(DidacticNotation()); ASSERT_NO_THROW(test << "S -> a A b | "); ASSERT_NO_THROW(test << "A -> a A | b A | "); EXPECT_EQ(set({"a", "b"}), test.getTerminals()); EXPECT_EQ(set({"S", "A"}), test.getNonTerminals()); test.clear(); test << "S -> S s | B C D"; test << "A -> S A a | "; test << "B -> C c"; test << "C -> B b | S s | A"; test << "D -> D d | D B | "; ASSERT_EQ(set({"c"}), test.first("S")); ASSERT_EQ(set({"c"}), test.first("A")); ASSERT_EQ(set({"c"}), test.first("B")); ASSERT_EQ(set({"c"}), test.first("C")); ASSERT_EQ(set({"c", "d"}), test.first("D")); ASSERT_FALSE(test.nullable("S")); ASSERT_TRUE(test.nullable("A")); ASSERT_FALSE(test.nullable("B")); ASSERT_TRUE(test.nullable("C")); ASSERT_TRUE(test.nullable("D")); }