110 likes | 304 Views
Backpatching. דוגמא: switch. דוגמא switch :. הדקדוק. שלבי פיתרון. שלב I – תרשים פריסת הקוד. שלב II – סכימת תירגום. תכונות סמנטיות שנצטרך S – nextlist E – place C – value, quad, nextlist CL – nextlist , quad_list (stack) value_list (stack). שלב II – סכימת תירגום.
E N D
Backpatching דוגמא: switch
שלב II – סכימת תירגום • תכונות סמנטיות שנצטרך S –nextlist E – place C – value, quad, nextlist CL – nextlist, quad_list (stack) value_list (stack)
שלב II – סכימת תירגום • מרקרים שימושים N →ε { N.nextlist = makelist(nextquad); emit('goto ___'); } M →ε { M.quad = nextquad(); }
שלב II – סכימת תירגום • הכללים סמנטיים: C →casenum: M S ;break; { C.quad = M.quad; C.value = num.value; C.nextlist = S.nextlist; }
שלב II – הכללים סמנטיים C L → C { CL.quad_list = newstack(); CL.quad_list.push(C.quad); CL.value_list = newstack(); CL.value_list.push(C.value); CL.nextlist = C.nextlist; }
שלב II – הכללים סמנטיים C L → C CL1 { CL.quad_list = CL1.quad_list; CL.quad_list.push(C.quad); CL.value_list = CL1. value_list; CL.value_list.push(C.value); CL.nextlist = merge( C.nextlist, CL1.nextlist); }
שלב II – הכללים סמנטיים S → switch(E N){CL} { backpatch(N.nextlist, nextquad() ); while (!CL.value_list.empty()) { value = CL.value_list.pop(); quad= CL. quad_list.pop(); emit('if' || E.place || '=' ||value || 'goto‘ ||quad); } S.nextlist = merge(CL.nextlist, makelist(nextquad()); emit(“goto __”); }