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



         

Лексемы - часть 3


extern char *prog;  /* Содержит анализируемое выражение */

/* Получить лексему */

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')  /* crtl */

++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); /* преобразование во внутренний

формат */

if(!tok) token_type = VARIABLE;

else token_type = COMMAND; /* это команда */

return token_type;

 

Посмотрите внимательно на get_token(). Многие программисты любят помещать пробелы перед выражениями для улучшения удобочитаемости и наглядности своей программы. Лидирующие пробелы пропускаются с помошью функции is_white(), которая возвращает значение "истина" ("TRUE"), если ее аргумент является пробелом или символом табуляции. Псле пропуска пробелов, сканер, реализуемый с помощью программы prog, указывает на каждое число, переменную, команду, символ "возврат каретки" или ноль, если достигнут конец выражения (программы). Если очередным анализируемым символом является символ "возврат каретки" (\r), то возвращается значение "конец строки программы" ("EOL"). Если




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