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 ));
}
#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();
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.