ATTR vardecnum: int; ATTR niveau: int; ATTR index:int; ATTR indexliste: int/*ptrnliste*/; ATTR table,pere: int /* *symtab*/; ATTR nivdec: int /* *varinfo */; ATTR decalage: int; TERM ident:int; RULE: program ::= bloc COMPUTE bloc.niveau=1; bloc.pere=0; bloc.decalage=0; END; RULE: fndecl ::= 'function' bloc COMPUTE bloc.niveau= INC(INCLUDING bloc.niveau); bloc.pere=INCLUDING bloc.table; bloc.decalage=0; END; RULE: inst::= bloc COMPUTE bloc.niveau=INCLUDING bloc.niveau; bloc.pere=INCLUDING bloc.table; bloc.decalage=ADD(INCLUDING bloc.decalage, INCLUDING bloc.vardecnum); END; SYMBOL bloc COMPUTE SYNT.vardecnum = CONSTITUENTS vardecl.vardecnum WITH (int, ADD, SAME, ZERO); END; RULE: bloc ::= 'begin' decls insts 'end' COMPUTE bloc.table=construire(bloc.pere,bloc.niveau,decls.indexliste,bloc.decalage); /*printf("decls liste:\n");pliste(decls.indexliste); PTGOut(PTGListe(PTGniveau(bloc.niveau),PTGConst(bloc.vardecnum)));*/ END; SYMBOL decls COMPUTE SYNT.vardecnum = CONSTITUENTS var.index WITH (int, ADD, SAME, ZERO); /*SYNT.indexliste = CONSTITUENTS var.index WITH (int, concat, liste1,liste0);*/ END; RULE: vardecl::= 'var' idlist COMPUTE vardecl.indexliste=idlist.indexliste; END; RULE: decl::=vardecl COMPUTE decl.indexliste=vardecl.indexliste; END; RULE: decl::=fndecl COMPUTE decl.indexliste=0; END; RULE: decls::= COMPUTE decls.indexliste=0; END; RULE: decls::= decl ';' decls COMPUTE decls[1].indexliste=concat(decl.indexliste,decls[2].indexliste); END; RULE: vardecl ::= 'var' idlist COMPUTE vardecl.vardecnum=idlist.vardecnum; /*pliste(idlist.indexliste);*/ END; RULE: idlist::= var COMPUTE idlist.vardecnum=1; idlist.indexliste=liste1(var.index); END; RULE: idlist::= var ',' idlist COMPUTE idlist[1].vardecnum=INC(idlist[2].vardecnum); idlist[1].indexliste=liste2(var.index,idlist[2].indexliste); END; RULE: var ::= ident COMPUTE var.index=ident; END; RULE: inst ::= utiliservar COMPUTE utiliservar.nivdec=recherche(INCLUDING bloc.table,utiliservar.index); Afficher(utiliservar.index, utiliservar.nivdec); END; RULE: utiliservar ::= var COMPUTE utiliservar.index=var.index; END;