Интерпретатор языка Small Basic
Разрабатываемый интерпретатор будет распознавать следующие ключевые слова языка программирования BASIC:
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;