Appendix B: Example Code
B.1 Calculation.h
void Calculation::compile(node *g, Variables var) { Require(g != NULL, "The expression tree has a variable"); int T=0; if(leaf(g)) //case single leaf is our tree gencode(LOAD, g->value, var); else if(leaf(g->right) && leaf(g->left)) { gencode(LOAD, g->left->value, var); gencode(translate(g->value), g->right->value, var); } else if((g->left == NULL) && leaf(g->right)) { gencode(translate(g->value), g->right->value, var); } else if((g->left == NULL) && (!leaf(g->right) || g->right != NULL)) { while(T_lock[T] != 0.0001) T++; compile(g->right, var); gencode(STORE, ((char)145+T), var); gencode(translate(g->value), ((char)145+T), var); } //left branch is subexpression while right branch is just leaf else if((!leaf(g->left) || g->left != NULL) && leaf(g->right)) { compile(g->left, var); gencode(translate(g->value), g->right->value, var); } //right branch is subexpression while left branch is just leaf (need temporary registers) else if((!leaf(g->right) || g->right != NULL) && leaf(g->left)) { while(T_lock[T]!=0.0001) T++; //find next unused temp register compile(g->right, var); gencode(STORE, ((char)145+T), var); gencode(LOAD, g->left->value, var); gencode(translate(g->value), ((char)145+T), var); } //both right branch and left branch are subexpressions (need holder variables) else if((!leaf(g->left) || g->left != NULL) && (!leaf(g->right) || g->right != NULL)) { while(T_lock[T]!=0.0001) T++; //find next unused temp register compile(g->right, var); gencode(STORE, ((char)145+T), var); compile(g->left, var);
gencode(translate(g->value), ((char)145+T), var); } }
ภาคผนวก b:ตัวอย่างรหัส B.1 Calculation.h โมฆะ Calculation::compile (โหน * g ตัวแปร var) {ต้อง (g ! = NULL "แผนภูมิเป็นนิพจน์มีตัวแปร"); int T = 0; if(leaf(g)) //case ใบเดี่ยวเป็น gencode ของเราต้นไม้ (โหลด g -> ค่า var); เอา (ใบ (g -> ขวา) & & ใบ (ซ้าย -> g)) { gencode (โหลด g -> ซ้าย -> ค่า var); gencode (แปล (g -> ค่า), g -> ขวา -> ค่า , var); } เอา ((g -> ซ้าย== NULL) & & ใบ (g -> ขวา)) { gencode (แปล (g -> ค่า), g -> ขวา -> ค่า var); } เอา ((g -> ซ้าย== NULL) & & (! ใบ (g -> ขวา) || g -> ขวา! = NULL)) {ขณะ (T_lock [T] ! = 0.0001) T ++ คอมไพล์ (g -> ขวา var); gencode (ร้าน, ((อักขระ) 145 + T), var); gencode (แปล (g -> ค่า) , ((อักขระ) 145 + T), var); } //left สาขาเป็นนิพจน์ย่อยในขณะที่สาขาขวา เพียงใบอื่นถ้า ((! ใบ (g -> ซ้าย) || g -> ซ้าย! = NULL) & & ใบ (g -> ขวา)) {คอมไพล์ (g -> ซ้าย var); gencode (แปล (g -> ค่า), g -> ขวา -> ค่า var); } //right สาขาเป็นนิพจน์ย่อยในขณะที่ซ้ายสาขา อื่นเพียงใบ (ทะเบียนชั่วคราวจำเป็น) ถ้า ((! ใบ (g -> ขวา) || g -> ขวา! = NULL) & & ใบ (ซ้าย -> g)) { while(T_lock[T]!=0.0001) T ++ //find ถัดไปไม่ได้ใช้ คอมไพล์ทะเบียนชั่วคราว (g -> ขวา var); gencode (ร้าน, ((อักขระ) 145 + T), var); gencode (โหลด ซ้าย -> g -> ค่า var); gencode (แปล (g -> ค่า), ((อักขระ) 145 + T), var); } ซ้ายและสาขาด้านขวาของ //both เป็น subexpressions (ต้องใส่ตัวแปร) อื่น ๆ ((! ใบ (ซ้าย -> g) || g -> ซ้าย! = NULL) & & (! ใบ (g -> ขวา) || g -> ขวา! = NULL)) { while(T_lock[T]!=0.0001) T ++ //find ถัดไปทะเบียนชั่วคราวที่ไม่ได้ใช้คอมไพล์ (g -> ขวา var); gencode (ร้าน, ((อักขระ) 145 + T), var); คอมไพล์ (g -> ซ้าย var); gencode (แปล (g -> ค่า), ((อักขระ) 145 + T), var); } }
การแปล กรุณารอสักครู่..
ภาคผนวก B: ตัวอย่างรหัส
B.1 Calculation.h
โมฆะคำนวณ :: รวบรวม (โหนด * G, ตัวแปร var) {require (g = โมฆะ "ต้นไม้แสดงออกมีตัวแปร!"); int T = 0; ถ้า (ใบ (g)) // กรณีใบเดี่ยวเป็น gencode ต้นไม้ของเรา (โหลด, G-> ค่า var); อื่นถ้า (ใบ (G-> ขวา) && ใบ (G-> ซ้าย)) {gencode (โหลด, G-> ซ้าย> ค่า var); gencode (แปล (G-> ค่า), G-> ขวา> ค่า var); } else if ((G-> ซ้าย == NULL) && ใบ (G-> ขวา)) {gencode (แปล (G-> ค่า), G-> ขวา> ค่า var); } else if ((G-> ซ้าย == NULL) && (ใบ (G-> ขวา) || G-> ขวา = NULL)!) {ในขณะที่ (T_lock [T] = 0.0001) T ++; รวบรวม (G-> ขวา var); gencode (เก็บ ((ถ่าน) 145 + T) var); gencode (แปล (G-> ค่า), ((ถ่าน) 145 + T) var); } // สาขาซ้าย subexpression ขณะที่สาขาที่เหมาะสมเป็นเพียงใบอื่นถ้า ((! ใบ (G-> ซ้าย) || G-> ซ้าย! = NULL) && ใบ (G-> ขวา)) {รวบรวม (G-> ซ้าย var); gencode (แปล (G-> ค่า), G-> ขวา> ค่า var); } // สาขาที่เหมาะสมเป็น subexpression ขณะที่สาขาซ้ายเป็นเพียงใบ (ต้องลงทะเบียนชั่วคราว) อื่นถ้า ((! ใบ (G-> ขวา) || G-> ถูกต้อง! = NULL) && ใบ (G-> ซ้าย)) { ในขณะที่ (T_lock [T] = 0.0001) T ++; // พบต่อไปที่ไม่ได้ใช้ชั่วคราวลงทะเบียนรวบรวม (G-> ขวา var); gencode (เก็บ ((ถ่าน) 145 + T) var); gencode (โหลด, G-> ซ้าย> ค่า var); gencode (แปล (G-> ค่า), ((ถ่าน) 145 + T) var); } // ทั้งสาขาที่เหมาะสมและสาขาด้านซ้ายจะ subexpressions (ตัวแปรถือจำเป็น) อื่นถ้า ((! ใบ (G-> ซ้าย) || G-> ซ้าย! = NULL) && (! ใบ (G-> ขวา) || G-> ขวา = NULL)) {ในขณะที่ (T_lock [T] = 0.0001) T ++!; // พบต่อไปที่ไม่ได้ใช้ชั่วคราวลงทะเบียนรวบรวม (G-> ขวา var); gencode (เก็บ ((ถ่าน) 145 + T) var); รวบรวม (G-> ซ้าย var);
gencode (แปล (G-> ค่า), ((ถ่าน) 145 + T) var); }}
การแปล กรุณารอสักครู่..