cvm.c

来自「压缩包里面的都是精致的基本C语言小程序」· C语言 代码 · 共 88 行

C
88
字号
#include <stdio.h>#include "../lib/error.h"#include "../lib/hash.h"#include "../lib/nat.h"#include "../lib/mystdlib.h"#include "../lib/linkedList.h"#include "store.h"#include "cvm.h"nat cvmExp (store st, exp e){  switch (e->kind)  {    case ADD :    {      nat n1 = cvmExp (st, (e->u).binop.e1);      nat n2 = cvmExp (st, (e->u).binop.e2);      nat n = natAdd (n1, n2);      return n;    }    case SUB :     {      nat n1 = cvmExp (st, (e->u).binop.e1);      nat n2 = cvmExp (st, (e->u).binop.e2);      nat n = natSub (n1, n2);      return n;    }    case TIMES :     {      nat n1 = cvmExp (st, (e->u).binop.e1);      nat n2 = cvmExp (st, (e->u).binop.e2);      nat n = natTimes (n1, n2);      return n;    }    case ID :     {      nat n = storeLookup (st, (e->u).id);      return n;    }    case NUM :     {      return (newNat ((e->u).i));    }    default: return (newNat (0));  }}void cvmStm (store st, stm s){  switch (s->kind)  {    case ASSIGN:      {        nat n = cvmExp (st, (s->u).a.e);        storeUpdate (st, (s->u).a.id, n);        break;      }    case PRINT:      {                nat n = cvmExp (st, (s->u).print);        natOutput (n);        printf ("\n");        break;      }    default:      {        error ("no this case\n");        break;      }  }}void cvmProg (prog p){  printf ("\nCVM starts:\n");  linkedList l = linkedListGetFirst (p->stms);  store st = newStore ();      while (l)  {    cvmStm (st, l->data);    l = l->next;  }    printf ("\nCVM halts\n");  return;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?