CI-2700 Compiladores Proyecto Cuatro - Procedimientos y Funciones Agregar procedimientos y funciones al lenguaje Tiny. La siguiente guía es para funciones. Para implementar procedimientos, se requerirán algunos cambios. CONSTRAINER. ------------ ProgramNode: Enter "" with T OpenScope Procesar hijos 2 .. 7 CloseScope SubprogsNode: Procesar todos los hijos FcnNode: NodeName(FK(FK(T)))=NodeName(FK(LK(T))) ? Enter "f" con FK(T) OpenScope Enter "" con T T1 := Lookup(R) Decorate ( FK(T), Decoration(T1) ) Decorate ( FK(FK(T)), T) Procesar hijos 2,4,5,6,7 CloseScope ParamsNode: Procesar todos los hijos CallNode: Type := Expression ( FK(T) ) ModeOf(FK(T)) debe ser "function" Temp := Decoration ( FK(T) ) Temp := SK(Decoration(FK(Temp))) Contar # de parametros bajo Temp, comparar con Nkids(T)-1 Comparar tipo de cada parametro con Expression(Child(T,i)) return (Type) ReturnNode: Type:=Expression(FK(T)) N=Lookup("") if NodeName(N) <> FcnNode then Error if Decoration(FK(N)) <> Type then Error CODE GENERATOR -------------- ProgramNode: Procesar hijos 2,3,4,5 (cascada CL) Generatar GOTO L1 (con CL) Procesar hijo 6 con NoLabel, ignorar etiqueta retornada Procesar hijo 7 con L1; retornando Currlabel return Currlabel FcnNode: OpenFrame Decorate(FK(T),MakeAddress) IncrementFrameSize L1 = Makelabel Decorate (T,L1) Procesar hijo 2, SIN GENERAR INSTRUCCIONES LIT, usando CL Procesar hijos 4,5 usando CL Procesar hijo 6, usando L1, retornando CL Procesar hijo 7, usando CL CodeGen ( LLV 0, Currlabel) CodeGen ( RTN 1, Nolabel) CloseFrame return Nolabel CallNode: CodeGen(LIT 0, Currlabel ) IncrementFrameSize L1=Dec(Dec(FK(Dec(FK(T))))) for k=2 to Nkids do Expression(Child(T,k),NoLabel) CodeGen (CODEOP, L1, Nolabel) DecrementFrameSize, PARA CADA PARAMETRO CodeGen (CALLOP, MakeStringOf(FrameSize-1), NoLabel) ReturnNode: Expression(FK(T),Currlabel) CodeGen(RTN 1, NoLabel) DecrementFrameSize return Nolabel UN EJEMPLO: program fact: var n : integer; function f(n:integer):integer; begin if n > 0 then return (n*f(n-1)) else return(1); end f; begin read(n); output(f(n)); end. /////////////////////////////////// FrameSize Global Local LIT 0 | 1 GOTO L1 | 1 L2 LLV 1 | 3 LIT 0 | 4 BOP BGT | 3 COND L3 L4 | 2 L3 LLV 1 | 3 LIT 0 | 4 LLV 1 | 5 LIT 1 | 6 BOP BMINUS | 5 CODE L2 | 4 { porque decrementamos FrameSize para cada parámetro} CALL 3 | 4 BOP BMULT | 3 RTN 1 | 2 GOTO L5 | 2 L4 LIT 1 | 3 RTN 1 | 2 NOP | 2 L5 LLV 0 | 2 RTN 1 | 2 L1 SOS INPUT | 2 SGV 0 | 1 LIT 0 | 2 LGV 0 | 3 CODE L2 | 2 { porque decrementamos FrameSize para cada parámetro} CALL 1 | 2 SOS OUTPUT | 1 SOS OUTPUTL | 1 HALT | 1 Fecha límite: "al final del semestre".