Code Generation Procedure and Function with Parameters • Definisi Proc and Func with parameters • declaration: – type 'func' identifier C3 C26 R7 C22 C23 C5 C0 R2 funcBody, – 'proc' identifier C3 C24 R7 C22 C0 R1 procBody • funcBody: '=' expression C36 C11 C11 C2 R6 R43 R9 C7, '(' C30 parameters C35 C1 ')' '=' expression C36 C11 C11 C27 R6 R43 R9 C7 • procBody: scope R42 R9 C7, '(' C30 parameters C35 C1 ')' scope C27 R5 R42 R9 C7 • parameters: identifier C3 C4 C25 ':' type C5 C11 C7 C34 moreParameters • moreParameters: , ',' identifier C3 C4 C25 ':' type C5 C11 C7 C34 moreParameters • Pemanggilan Proc with arguments – assignOrCall: C28 C29 R45 R44 C7, '(' R45 C28 C30 arguments ')' C32 R44 C7, • Pemanggilan Func with arguments – primary: identifier C6 subsOrCall – subsOrCall: C37 R49 C29 C8 R50 C7, '(' C33 R46 C30 arguments ')' C32 C8 R47 C7, – arguments: expression C34 C31 C11 R48 moreArguments – moreArguments: , ',' expression C34 C31 C11 R48 moreArguments Untuk Fungsi dan prosedur – C22 masukkan lexical level dan order number ke dlm tabSim – C23 masukkan type int atau bool – C36 periksa bahwa type dari ekspresi sama dengan type dari fungsi Untuk parameter – – – – – – – – – – – – – C24 masukkan prosedur ke dlm tabSim C25 masukkan parameter ke dlm tabSim C26 masukkan fungsi ke dlm tabSim C27 keluar dari scope yang mengandung parameter C28 periksa bahwa id merupakan nama prosedur C29 periksa bahwa fungsi atau prosedur tak punya parameter C30 push jumlah argument = 0 C31 periksa argument terhadap parameter C32 periksa bahwa semua argumen sudah dilihat, pop jumlah argumen C33 periksa bahwa id adalah nama fungsi C34 tambah nilai jumlah argumen C35 masukkan jumlah argumen (parameter) ke dalam tabSim, pop jumlah argumen C37 if id suatu fungsi maka C33 else C20 • Fungsi, prosedur dan parameter. – R1 periksa bahwa lexic level <displaySize. Buat instruksi untuk memasuki scope statement. – R2 periksa bahwa lexic level <displaySize. Buat instruksi untuk memasuki scope ekspresi. – R42 buat instruksi unutk kembali dari prosedure. – R43 buat instruksi untuk kembali dari fungsi. – R44 buat instruksi untuk memanggil suatu prosedur. – R45 buat instruksi untuk membentuk tanda block untuk pemanggilan prosedur. – R46 buat instruksi untuk membentuk tanda block untuk pemanggilan fungsi. – R47 buat instruksi untuk memanggil fungsi. – R48 buat instruksi untuk menyimpan argument untuk pemanggilan prosedu/fungsi. – R49 if identifier suatu fungsi maka R46 else R31 – R50 if identifier suatu fungsi maka R47 else R32 Contoh proc dan func with parms {var a: int proc b (a: int,c:int) { var d : int; put “in proc b, a “,a,” c “,c } var c : int int func d (a:int,c:int) = a*c var e : int; a:=2 c:=2 e:=2 b(a*c,e) e:=e+d(a,c) Put “e “,e } Diskusikan masalah2 aksi semantik dan pembentukan kodenya yang terkait dengan proc dan func dgn parameters