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



         

Синтаксический анализатор выражений - часть 3


return 0;

return variables[toupper(*token)-'^'];

/* выдать сообщение об ошибке */

void serror(error)

int error;

static char *e[]=

"Синтаксическая ошибка",

"Непарные круглые скобки",

"Это не выражениеt",

"Предполагается символ равенства",

"Не переменная",

"Таблица меток переполнена",

"Дублирование меток",

"Неопределенная метка",

"Необходим оператор THEN",

"Необходим оператор TO",

"Уровень вложенности цикла FOR слишком велик",

"NEXT не соответствует FOR",

"Уровень вложенности GOSUB слишком велик",

"RETURN не соответствует GOSUB"

;

printf("&4%s\n",e[error]);

longjmp(e_buf, 1); /* возврат в точку сохранения */

/* Чтение лексемы. */

get_token()

register char *temp;

token_type=0; tok=0;

temp=token;

if(*prog=='\0')  /* Конец файла */

*token=0;

tok = FINISHED;

return(token_type=DELIMITER);

while(iswhite(*prog)) ++prog; /* пропуск пробелов */

if(*prog=='\r')  /* коней строки программы */

++prog; ++prog;

tok = EOL; *token='\r';

token[1]='\n'; token[2]=0;

return (token_type = DELIMITER);

if(strchr("+-^/%=;(),><", *prog)) /* разделитель */

*temp=*prog;

prog++; /* переход на следующую позицию */

temp++;

*temp=0;

return (token_type=DELIMITER);

if(*prog=='"')  /* строка кавычек */

prog++;

while(*prog != '"' && *prog!='\r') *temp++=*prog++;

if(*prog=='\r') serror(1);

prog++;*temp=0;

return(token_type=QUOTE);

if(isdigit(*prog))  /* число */

while(!isdelim(*prog)) *temp++=*prog++;

*temp = '\0';

return(token_type = NUMBER);

if(isalpha(*prog))  /* переменная или команда */

while(!isdelim(*prog)) *temp++=*prog++;

token_type=STRING;

*temp = '\0';

/* просматривается, если строка - переменная или команда */

if (token_type==STRING)

tok=look_up(token); /* Преобразование во внутренний формат */




Содержание  Назад  Вперед