⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tc.c

📁 COCO類似C的編譯器
💻 C
字号:
/**********************************************************
**   TC.C
**   Coco/R C Taste Example.
**   Adapted to C++ by Frankie Arzu <farzu@uvg.edu.gt>
**      from Moessenboeck's (1990) Oberon example
**
**   May 24, 1996  Version 1.06
**********************************************************/

#include "tc.h"
#include <stdio.h>
#include <stdlib.h>

#define MEMSIZE 15000

int progStart;     /* address of first instruction of main program */
int pc = 1;        /* program counter */
int generatingCode = 1;

static unsigned char code[MEMSIZE];
static int stack[1000];
static int top;
static int base;

extern SemError (int n);

void Emit (int op)
{ 
  if (generatingCode) {
    if (pc >= MEMSIZE - 5) { SemError(125); generatingCode = 0; }
    else code[pc++] = op;
  }
}

void Emit2 (int op, int val)
{
  if (generatingCode) {
    Emit(op);
    code[pc++] = val / 256;
    code[pc++] = val % 256;
  }
}

void Emit3 (int op, int level, int val)
{
  if (generatingCode) {
    Emit(op);
    code[pc++] = level;
    code[pc++] = val / 256;
    code[pc++] = val % 256;
  }
}

void Fixup (int adr)
{
  if (generatingCode) {
    code[adr++] = pc / 256;
    code[adr++] = pc % 256;
  }
}

static int Next(void)
{
  pc++;
  return code[pc-1];
}

static int Next2(void)
{
  int x, y;
  x = code[pc++];
  y = code[pc++];
  return x * 256 + y;
}

static void Push(int val)
{ 
  stack[top++] = val;
}

static int Pop(void)
{  
  top--;
  return stack[top];
}

static int Up (int level)
{
  int b = base;
  while (level > 0) { b = stack[b]; level--; }
  return b;
}

void Interpret(void)
{
  int val, a, lev;

  printf("Interpreting\n");
  pc = progStart;
  base = 0;
  top = 3;
  while (1) {
    switch (Next()) {
    case LOAD:
      lev = Next();
      a = Next2();
      Push(stack[Up(lev) + a]);
      break;
    case LIT:
      Push(Next2());
      break;
    case STO:
      lev = Next();
      a = Next2();
      stack[Up(lev) + a] = Pop();
      break;
    case ADD:
      val = Pop(); Push(Pop() + val);
      break;
    case SUB:
      val = Pop(); Push(Pop() - val);
      break;
    case MUL:
      val = Pop(); Push(Pop() * val);
      break;
    case DIVI:
      val = Pop();
      if (!val) { printf("Divide by zero\n"); exit(1); }
      Push(Pop() / val);
      break;
    case EQU:
      val = Pop(); Push(Pop() == val);
      break;
    case LSS:
      val = Pop(); Push(Pop() < val);
      break;
    case GTR:
      val = Pop(); Push(Pop() > val);
      break;
    case CALL:
      Push(Up(Next()));
      Push(base);
      Push(pc + 2);
      pc = Next2();
      base = top - 3;
      break;
    case RET:
      top = base;
      base = stack[top+1];
      pc = stack[top+2];
      break;
    case RES:
      top+= Next2();
      break;
    case JMP:
      pc = Next2();
      break;
    case FJMP:
      a = Next2();
      if (Pop() == 0) pc = a;
      break;
    case HALTc:
      return;
    case NEG:
      Push(-Pop());
      break;
    case READ:
      lev = Next();
      a = Next2();
      printf("? ");
      scanf("%d", &val);
      stack[Up(lev) + a] = val;
      break;
    case WRITE:
      printf("%d\n", Pop());
      break;
    default:
      exit(1);
    }
  }
}

⌨️ 快捷键说明

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