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

  for ( p = TNM; p < ptn; p += strlen( p )+1) {

    if (!strcmp( p, nm ))

      return p;

  }

  ptn += strlen( nm )+1;

  if (ptn >= TNM+400) {

    puts( "Переполнение таблицы идентификаторов!" );

    exit( 0 );

  }

  else

    return( strcpy( p, nm ));

}

spl_prog.c

#include "lex.h"

enum {OPR, LIT, LDE, LDI, STE, STI, CAL, INI, JMP, JMC}; //команды SPL

typedef struct {

  int cod;               //код команды

  int opd;               //операнд команды

} cmd;

cmd TCD[300];            //глобальный массив для таблицы команд

int tc = 0;              //количество команд в TCD

typedef struct {

  char *name;            //имя объекта (идентификатора)

  int what;              /*целое число: если конст., то 1,

если глоб. перем. - 2,

                         лок. перем. - 3*/

  int val;

} odc;

odc TOB[100];            //глобальный массив для таблицы объектов

odc *pto = TOB;          //указатель на первый свободный элемент в таблице объектов

odc *ptol = TOB;         //действует после sp (локальный)

int out = 1;             //признак - глоб. или лок.

typedef struct {

  char *name;

  int isd;               //если 1 - функция описана, 0 - не описана

  int cpt;               //количество параметров у функции

  int start;             /*точка входа в таблицу команд -                 откуда начинается в таблице команд           выполнение данной функции*/

} fnd;

fnd TFN[30];             //массив структур для функций

fnd *ptf = TFN;          //указатель на первый свободный в              таблице функций

int st[500];             //стек

int cgv = 0;             //количество глоб. переменных

int clv = 0;             //количество лок. переменных

int adrnm, cpnm;         /* - адрес начала функции main() в TCD

                         - количество фактических параметров               main()*/

int t;                   //вершина стека

int sp;                  /*граница, откуда заносятся локальные      переменные (начало области локальных                переменных)*/

int p;                   //счетчик

void newob( char *nm, int wt, int vl ); //функция занесения                новых объектов в таблицу объектов

odc *findob( char *nm ); //функция поиска объекта в таблице                  объектов

fnd *newfn( char *nm, int is, int cp, int st); //функция                занесения новых функций в таблицу                  функций

fnd *findfn( char *nm ); //функция поиска функции в таблице                  функций

fnd *eval( char *nm, int cp ); //вызов функции

void defin( char *nm, int cp, int st); //описание функций

fnd *fmain( void ); //поиск функции main() и неописанных              функций

int gen( int co, int op ); //функция занесения команд в TCD

int body( void ); //тело функции

void stat( void ); //оператор

void expr( void ); //выражение

void term( void ); //слагаемое

void fact( void ); //множитель

int fctl( void ); //последовательность выражений

void prog( void ); //программа

void dconst( void ); //описание констант

void cons( void ); //константы

void dvarb( void ); //описание переменных

void dfunc( void ); //описание функций

int param( void ); //параметры функции

void exam( int lx ); //проверка лексемы

void stml( void ); //последовательность операторов

void push( int a ); //функция занесения в вершину стека целого             числа a

int red( void ); //функция ввода

void interp( void ); //заполнение стека (вызывает comman)

void comman( void ); //выполнение команд, перечисленных в enum     (вызывает operat)

void operat( int a ); //выполнение одной из 11-ти команд OPR

void main( int ac, char *av[] ) {

  if (ac < 2)

    puts( "Нет исходного файла!" );

  else {

    PF = fopen( av[1], "r" );

    if (!PF) {

      puts( "Файл var2.s не открылся!" );

      exit( 0 );

    }

    else

      get();