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();
}
コード例 #2
0
ファイル: Grammar.c プロジェクト: fnmartinez/TLATPE
/*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;
}
コード例 #3
0
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>"));
}
コード例 #4
0
ファイル: Grammar.c プロジェクト: fnmartinez/TLATPE
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;

}
コード例 #5
0
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"));
}