Программа-интерпретатор для учебного языка SPL, страница 13

  if (lx != lex) {

    printf( "Не совпадает lx = %d и lex = %d в строке nst = %d!\n",

            lx, lex, nst );

    exit(0);

  }

  get();

  return;

}

void stml() {

  stat();

  while (lex == ';') {

    get();

    stat();

  }

  return;

}

void push( int a ) {

  if (t >= 499) {

    puts( "Переполнение стека!" );

    exit( 0 );

  }

  st[++t] = a;

  return;

}

int red() {

  int v, c;

  do {

    puts( "Введите число:" );

    fflush( stdin );

    c = getchar();

  } while (isspace( c ));

  if (!isdigit( c )) {

    puts( "Недопустимый символ!" );

    exit( 0 );

  }

  for (v = 0; isdigit( c ); c = getchar())

    v = 10*v+c-'0';

  ungetc( c, stdin );

  return v;

}

void interp() {

  int i;

  t = -1;

  for (i = 0; i < cgv; i++)

    push( 0 );

  if (cpnm) {

    printf( "Введите %d фактических переменных для main:\n", cpnm );

    fflush( stdin );

    for (i = 0; i < cpnm; i++)

      push( red() );

  }

  push( cpnm );

  push( -2 );

  push( -1 );

  sp = t;

  p = adrnm;

  do {

    comman();

    p++;

  } while (p >= 0);

  if (p == -1)

    printf( "%d\n", st[t] );

  return;

}

void comman() {

  int i;

  int a = TCD[p].opd;

  switch (TCD[p].cod) {

    case OPR: operat( a );

              break;

    case LIT: push( a );

              break;

    case LDE: push( st[a] );

              break;

    case LDI: push( st[sp+a] );

              break;

    case STE: st[a] = st[t--];

              break;

    case STI: st[sp+a] = st[t--];

              break;

    case CAL: push( p );

              push( sp );

              sp = t;

              p = a-1;

              break;

    case INI: for (i = 0; i < a; i++)

                push( 0 );

              break;

    case JMP: p = a-1;

              break;

    case JMC: if (st[t--] <= 0)

                p = a-1;

              break;

  }

  return;

}

void operat( int a ) {

  int j = t-1;

  switch (a) {

    case 1: printf( "1>" );

            fflush( stdin );

            push( red() );

            break;

    case 2: printf( "%d\n", st[t--]);

            break;

    case 3: st[j] += st[t--];

            break;

    case 4: st[j] -= st[t--];

            break;

    case 5: st[j] *= st[t--];

            break;

    case 6: if (st[t] == 0) {

              puts( "Деление на 0!" );

              exit( 0 );

            }

            st[j] /= st[t--];

            break;

    case 7: if (st[t] == 0) {

              puts( "Деление на 0!" );

              exit( 0 );

            }

            st[j] %= st[t--];

            break;

    case 8: st[t] = -st[t];

            break;

    case 9: j = st[sp-2];

            st[sp-j-2] = st[t];

            t = sp-j-2;

            p = st[sp-1];

            sp = st[sp];

            break;

    case 10: p = -3;

             break;

    case 11: st[t] = st[t]*st[t]; //собственная команда                  возведения в квадрат

             break;

  }

  return;

}


Список литературы

1)  [Авраменко, 2003]                                          Авраменко Виктор Васильевич: Системное                                           программирование / Конспект лекций. СумГУ, 2003.

2)  [Проценко, 1993]            Проценко В.С., Чаленко П.Й., Ставровський А.Б. Техніка            програмування мовою Сі. «Либідь», Київ. 1993.

3)  [Stroustrup, 2001]             Bjarne Stroustrup. The C++ Programming Language / Special           edition. AT&T Labs, Florham Park, New Jersey. 2001.

4)  [Немнюгин, 2000]           С.А. Немнюгин. TURBO PASCAL. Санкт-Петербург,           Москва, Харьков, Минск. 2000.