minivc.c
来自「压缩包里面的都是精致的基本C语言小程序」· C语言 代码 · 共 176 行
C
176 行
#include <stdio.h>#include "../lib/error.h"#include "../lib/commonInter.h"#include "../lib/mystdlib.h"#include "../lib/nat.h"#include "../lib/poly.h"#include "../lib/str.h"#include "../lib/linkedList.h"#include "miniVC.h"static str res;static operand resOp;static int counter = 0;str newId (){ nat n = newNat (counter++); str s = newStr ("t_"); str t = getVft (n)->toString (n); s = strConcat (s, t); return s;}void emit (linkedList l, instruction i){ linkedListInsertHead (l, i);}void compileExp (linkedList l, exp e){ switch (e->kind) { case ADD : { str es = miniCToStringExp (e); es = strConcat (newStr ("start of expression: "), es); instruction ci = miniPNewInstrComment (es); emit (l, ci); compileExp (l, (e->u).binop.e1); str t1 = newId (); instruction i1 = miniPNewInstrMovl (resOp, t1); emit (l, i1); compileExp (l, (e->u).binop.e2); str t2 = newId (); instruction i2 = miniPNewInstrMovl (resOp, t2); emit (l, i2); instruction i3 = miniPNewInstrAddl (miniPNewOperandId (t2), t1); emit (l, i3); instruction i4 = miniPNewInstrMovl (miniPNewOperandId (t1), res); emit (l, i4); es = strConcat (newStr ("end of expression: "), es); ci = miniPNewInstrComment (es); emit (l, ci); break; } case SUB : { str es = miniCToStringExp (e); es = strConcat (newStr ("start of expression: "), es); instruction ci = miniPNewInstrComment (es); emit (l, ci); compileExp (l, (e->u).binop.e1); str t1 = newId (); instruction i1 = miniPNewInstrMovl (resOp, t1); emit (l, i1); compileExp (l, (e->u).binop.e2); str t2 = newId (); instruction i2 = miniPNewInstrMovl (resOp, t2); emit (l, i2); instruction i3 = miniPNewInstrSubl (miniPNewOperandId (t2), t1); emit (l, i3); instruction i4 = miniPNewInstrMovl (miniPNewOperandId (t1), res); emit (l, i4); es = strConcat (newStr ("end of expression: "), es); ci = miniPNewInstrComment (es); emit (l, ci); break; } case TIMES : { str es = miniCToStringExp (e); es = strConcat (newStr ("start of expression: "), es); instruction ci = miniPNewInstrComment (es); emit (l, ci); compileExp (l, (e->u).binop.e1); str t1 = newId (); instruction i1 = miniPNewInstrMovl (resOp, t1); emit (l, i1); compileExp (l, (e->u).binop.e2); str t2 = newId (); instruction i2 = miniPNewInstrMovl (resOp, t2); emit (l, i2); instruction i3 = miniPNewInstrMull (miniPNewOperandId (t2), t1); emit (l, i3); instruction i4 = miniPNewInstrMovl (miniPNewOperandId (t1), res); emit (l, i4); es = strConcat (newStr ("end of expression: "), es); ci = miniPNewInstrComment (es); emit (l, ci); break; } case ID : { instruction i = miniPNewInstrMovl (miniPNewOperandId ((e->u).id), res); emit (l, i); break; } case NUM : { instruction i = miniPNewInstrMovl (miniPNewOperandNum ((e->u).i), res); emit (l, i); break; } default: break; } return;}void compileStm (linkedList l, stm s){ switch (s->kind) { case ASSIGN: { str es = miniCToStringStm (s); es = strConcat (newStr ("start of assignment statement: "), es); instruction ci = miniPNewInstrComment (es); emit (l, ci); compileExp (l, (s->u).a.e); instruction i = miniPNewInstrMovl (resOp, (s->u).a.id); emit (l, i); ci = miniPNewInstrComment (newStr ("end of assignment statement:")); emit (l, ci); break; } case PRINT: { str es = miniCToStringStm (s); es = strConcat (newStr ("start of print statement: "), es); instruction ci = miniPNewInstrComment (es); emit (l, ci); compileExp (l, (s->u).print); instruction i = miniPNewInstrPrint (resOp); emit (l, i); ci = miniPNewInstrComment (newStr ("end of print statement:")); emit (l, ci); break; } default: { error ("no this case\n"); break; } }}pentiumProg miniVC (prog p){ res = newStr ("result"); resOp = miniPNewOperandId (res); linkedList result = newLinkedList (); linkedList l = linkedListGetFirst (p->stms); while (l) { compileStm (result, l->data); l = l->next; } pentiumProg pp = miniPNewProg (linkedListReverse (result)); return pp;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?