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 + -
显示快捷键?