С для профессиональных программистов

Интерпретатор языка Small Basic


Разрабатываемый интерпретатор будет распознавать следующие ключевые слова языка программирования BASIC:

PRINT

INPUT

IF

THEN

FOR

NEXT

TO

GOTO

GOSUB

RETURN

END

Внутреннее представление этих команд (плюс значение EOL для конца строки и FINISHED для сигнализации о конце программы) определяется так:



#define PRINT   1

#define INPUT   2

#define IF                         3

#define THEN    4

#define FOR                    5

#define NEXT    6

#define TO                       7

#define GOTO    8

#define EOL                     9

#define FINISHED 10

#define GOSUB    11

#define RETURN   12

#define END                       13

Для преобразования внешнего представления лексем во внутренний формат используется вспомагательная структура table.

struct commands  /* Вспомогательная структура ключевых

слов анализатора                                                           */

char command[20];

char tok;

 table[] =  /* Таблица обрабатывает команды, введенные */

"print",PRINT, /* на нижнем регистре */

"input",INPUT,

"if",IF,

"then",THEN,

"goto",GOTO,

"for",FOR,

"next",NEXT,

"to",TO,

"gosub",GOSUB,

"return",RETURN,

"end",END,

"",END  /* mark end of table */

;

Обратите внимание на то, что признак конца файла (нулевая строка) помещен в конец таблицы.

Функция look_up() возвращает внутреннее представление каждой лексемы или символа '\0', если таковая не обнаружена.

/* Преобразование каждой лексемы из таблицы лексем

во внутреннее представление.

*/

look_up(s)

char *s;

register int i,j;

char *p;

/* преобразование в символы нижнего регистра */

p =s;

while(*p) *p = tolower(*p); p++;

/* если лексема обнаружена в таблице */

for(i=0; *table[i].command; i++)

if(!strcmp(table[i].command, s)) return table[i].tok; return 0; /* команда не распознана */

Интерпретатор языка SMALL BASIC не поддерживает редактор текстов, поэтому вы должны создавать программы на языке BASIC, используя стандартный текстовый редактор.

Каждая программа считывается и выполняется с помощью интерпретатора. Функция, которая загружает программу, называется load_program().

/* Загрузка программы */

load_program(p, fname)

char *p;

char *fname;

FILE *fp; int i=0; if(!(fp=fopen(fname, "rb"))) return 0;

i = 0;

do

*p = getc(fp); p++; i++;

 while(!feof(fp) && i<PROG_SIZE);

*(p-2) = '\0'; /* Символ конца загружаемой программы */ fclose(fp);

return 1;



Содержание раздела