Приложение C. Описание на стандартните модули
113
чрез подпрограма. Такава подпрограма работи като краен автомат, на чийто вход се
подава входния поток, а изхода е поредната разпозната лексема. В интерпретатора на
Y код е вграден такъв краен автомат, написан на асемблер и затова работещ значително
по-бързо, отколкото ако беше написан на UniPascal. Този краен автомат е оформен
като функция, наречена TokenSearch (търсене на лексема). Входните параметри задават
входния поток, който тя трябва да сканира, и правилата, по които се разпознават
лексемите.
function TokenSearch(var ls: LexStructure): token;
Описание:За TokenSearch входният поток се задава чрез буфер, който трябва да бъде
зареден с част от входния поток (например прочетен е един ред във входния
буфер). Символите във входния текст се делят на 8 основни класа (A, B, C, A
1
,
B
1
, C
1
, D, E), а думите - на три (A, B, C). Под дума в случая се разбира
последователност от символи без разделители.
*
клас A, B, C - от тези класове са символите, с които могат да започват
думите от съответните класове - A, B, C;
*
клас A
1
, B
1
, C
1
 - от тези класове са символите, които могат да се съдържат
(след първия символ) в думите от съответните класове - A, B, C;
*
клас D - от този клас са всички разделители, които се пропускат (обикновено
това са интервал и табулация);
*
клас E - от този клас са специални символи - начало на специална дума,
обработвана от програмиста отделно (обикновено това са числата - реални
и цели).
При активиране на TokenSearch първо се пропускат (прескачат) всички
разделители (символи от входния поток които са от клас D), ако има такива. След това
се анализира (разпознава) лексемата следваща разделителите. Резултатът от работата
на функцията е описан от изброимия тип TOKEN (лексема) и неговите константи
означават:
*
InvalidCh - първият символ (след пропуснатите разделители) в зададения
входен поток не е от нито един от възможните 8 класа или не е разпозната
никаква дума (символите са от клас C и C
1
, но няма ключова дума от този
клас в таблицата);
*
UserCh - първият символ (след пропуснатите разделители) в зададения
входен поток е от клас E (отделно обработвани от програмиста лексеми);
*
EndBuff - няма нито един символ във входния буфер, т.е. входния буфер е
празен или е достигнат неговия край, защото всички символи са били
разделители и са пропуснати.
*
IdentA - разпозната е дума от клас A (липсваща в таблицата от ключови
думи за клас A);
*
IdentB - разпозната е дума от клас B (липсваща в таблицата от ключови
думи за клас B);
*
Akeyword - разпозната е ключова дума от клас A (дума от клас A,
намираща се в таблицата от ключови думи за клас A);
*
Bkeyword - разпозната е ключова дума от клас B (дума от клас B, намираща
се в таблицата от ключови думи за клас B);
*
Ckeyword - разпозната е ключова дума от клас C (думите от клас C могат
да бъдат само ключови думи, в противен случай те не се разпознават
изобщо и се връща лексема InvalidCh). Например, ако е указано, че ':' и
'=' принадлежат на клас C и C
1
, но в таблицата фигурира само ':=', то
двата символа могат да се разпознават само в тази комбинация и в никоя
<<  <  GO  >  >>

Вернуться к началу сайта