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; }
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); }