114
C.4. Описание на модула UniLEX
друга. Ако няма разделители между няколко последователни символа от
символния клас C
1
, разпознава се максимално дългата дума. Например,
ако '+' и '++' са в таблицата за ключови думи от клас C и във входния
поток се срещне +++, то първото обръщение към TokenSearch разпознава
++, а второто разпознава  + (не една лексема  +++, нито три
последователни лексеми +);
Пример: Нека сме задали символите така: A..Z от клас A и A
1
, цифрите 0..9 от клас A
1
 и
клас E, '*', '+' и '-' от клас B и B
1
, интервал и табулация от клас D, ',' от клас C, ':'
и '=' от клас C и C
1
. При така дефинираните символи могат да се разпознават
следните лексеми:
*
думи от клас A: последователност от символите A..Z и 0..9, започваща със
символ от A..Z и завършващи със символ различен от A..Z, 0..9. Тези думи
са ни добре познати, като идентификатори в езика Pascal. Например
COUNTER, WORD, LIST1, A1, B52 и т.н. Ако за думите от клас A е дадена
и таблица с ключови думи, то тези от тях, които са дефинирани в таблицата
ще бъдат определени като ключови думи от клас A, а не като обикновени
думи;
*
думи от клас B: последователност от символите: * + -. Например: * + - **
++ -- *+ +- и т.н. Аналогично на думите от клас A, може да бъде зададена
таблица с ключови думи от клас B;
*
думи от клас C не могат да бъдат разпознати само въз основа на
определение на символите от съответен клас. За разпознаване е
необходима и таблица с възможните думи от клас C. Ако в тази таблица
са дефинирани ',' ':=' '==' '=', то става възможно да бъдат разпознати.
Например, ако входният поток е следния: ',,,:====', ще бъдат разпознати
три лексеми 'запетая', последвани от лексемите ':=' '==' '=' независимо
от това, че между тях няма интервал;
*
начало на специална последователност от клас E, ако бъде срещнат символ
от 0 до 9, непринадлежащ на дума от клас A;
*
всички интервали и табулации ще бъдат пропуснати, понеже са дефинирани
от клас D.
Нека входният поток е:
LIST1:==++A-B C D,,E1 123 C
Тогава при всяко извикване на TokenSearch ще бъдат разпознати последователно
следните лексеми ( в скоби са дадени имената им):
A-дума(LIST1) C-дума(:=) C-дума(=) B-дума(++) A-дума(A) B-дума(-)
A-дума(B) A-дума(C) A-дума(D) C-дума(,) C-дума(,) A-дума(E1) E-символ
(ако се обработи от друга процедура може да бъде разпознато цялото
 число 123) A-дума(C)
Правилата за разпознаване на лексемите, входният поток (буфера) и таблиците
за ключови думи се задават чрез параметър от тип структура. Полетата в тази структура
имат следното значение:
*
IdName: указател към променлива от тип string с максимална дължина не
по-малка от стойността, записана в полето IdSize. Стойността на IdName^
при активиране на TokenSearch е без значение. В този низ тя записва името
на разпознатата дума от клас A или B;
*
IdSize: максимален брой значещи символи в името на дума от клас A или
B. Ако думата е по-дълга, тя се анализира цялата, но в IdName^ се записват
само първите IdSize символи. Не се променя от TokenSearch;
<<  <  GO  >  >>

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