Exemplo n.º 1
0
void lalr1( void )
{
    a_state         *x;
    a_shift_action  *tx;
    a_reduce_action *rx;
    a_look          *lk, *look;
    a_word          *lp, *lset;
    a_word          *rp, *rset;

    InitSets( nterm );
    lk = look = CALLOC( nvtrans + nstate, a_look );
    lp = lset = AllocSet( nvtrans );
    rp = rset = AllocSet( nredun );
    for( x = statelist; x != NULL; x = x->next ) {
        x->look = lk;
        for( tx = x->trans; tx->sym != NULL; ++tx ) {
            if( tx->sym->pro != NULL ) {
                lk->trans = tx;
                lk->follow = lp;
                lp += GetSetSize( 1 );
                ++lk;
            }
        }
        ++lk;
        for( rx = x->redun; rx->pro != NULL; ++rx ) {
            rx->follow = rp;
            rp += GetSetSize( 1 );
        }
    }
    stk = CALLOC( nvtrans, a_look * );
    top = stk;
    Nullable();
    CalcReads();
    CalcIncludes();
    Lookback();
    if( lk - look != nvtrans + nstate ) {
        puts( "internal error" );
    }
    if( lp - lset != GetSetSize( nvtrans ) ) {
        puts( "internal error" );
    }
    if( rp - rset != GetSetSize( nredun ) ) {
        puts( "internal error" );
    }
    FREE( look );
    FREE( lset );
    FREE( stk );
    Conflict();
    nbstate = nstate;
}
Exemplo n.º 2
0
void ParserGen::WriteParser () {
	Generator g = Generator(tab, errors);
	int oldPos = buffer->GetPos();  // Pos is modified by CopySourcePart
	symSet->Add(tab->allSyncSets);

	fram = g.OpenFrame(L"Parser.frame");
	gen = g.OpenGen(L"Parser.h");

	Symbol *sym;
	for (int i=0; i<tab->terminals->Count; i++) {
		sym = (Symbol*)((*(tab->terminals))[i]);
		GenErrorMsg(tErr, sym);
	}

	g.GenCopyright();
	g.SkipFramePart(L"-->begin");

	g.CopyFramePart(L"-->prefix");
	g.GenPrefixFromNamespace();

	g.CopyFramePart(L"-->prefix");
	g.GenPrefixFromNamespace();

	g.CopyFramePart(L"-->headerdef");

	if (usingPos != NULL) {CopySourcePart(usingPos, 0); fwprintf(gen, L"\n");}
	g.CopyFramePart(L"-->namespace_open");
	int nrOfNs = GenNamespaceOpen(tab->nsName);

	g.CopyFramePart(L"-->constantsheader");
	GenTokensHeader();  /* ML 2002/09/07 write the token kinds */
	fwprintf(gen, L"\tint maxT;\n");
	g.CopyFramePart(L"-->declarations"); CopySourcePart(tab->semDeclPos, 0);
	g.CopyFramePart(L"-->productionsheader"); GenProductionsHeader();
	g.CopyFramePart(L"-->namespace_close");
	GenNamespaceClose(nrOfNs);

	g.CopyFramePart(L"-->implementation");
	fclose(gen);

	// Source
	gen = g.OpenGen(L"Parser.cpp");

	g.GenCopyright();
	g.SkipFramePart(L"-->begin");
	g.CopyFramePart(L"-->namespace_open");
	nrOfNs = GenNamespaceOpen(tab->nsName);

	g.CopyFramePart(L"-->pragmas"); GenCodePragmas();
	g.CopyFramePart(L"-->productions"); GenProductions();
	g.CopyFramePart(L"-->parseRoot"); fwprintf(gen, L"\t%ls();\n", tab->gramSy->name); if (tab->checkEOF) fwprintf(gen, L"\tExpect(0);");
	g.CopyFramePart(L"-->constants");
	fwprintf(gen, L"\tmaxT = %d;\n", tab->terminals->Count-1);
	g.CopyFramePart(L"-->initialization"); InitSets();
	g.CopyFramePart(L"-->errors"); fwprintf(gen, L"%ls", err);
	g.CopyFramePart(L"-->namespace_close");
	GenNamespaceClose(nrOfNs);
	g.CopyFramePart(NULL);
	fclose(gen);
	buffer->SetPos(oldPos);
}