116
C.4. Описание на модула UniLEX
на седемдесетия елемент на масива означава, че буквата F (с десетичен
ASCII код 70) принадлежи на клас A и A
1
;
*
ClassAkw: указател към таблица за ключовите думи от клас A. Таблицата
съдържа в произволен ред всички ключови думи, всяка от тях предхождана
от един байт с броя на символите й. Край на таблицата е байт с нулево
съдържание. Например, ако таблицата трябва да съдържа ключовите думи
BEGIN, END, IF, THEN и ELSE, и е обявена като пакетиран масив от символи,
то на нея може да се присвои следната стойност #5'BEGIN' #3'END' #2'IF'
#4'THEN' #5'ELSE' #0;
*
ClassBkw: указател към таблица за ключовите думи от клас B. Форматът е
същия, както за ClassAkw^;
*
ClassCkw: указател към таблица за ключовите думи от клас C. Форматът
е същия, както за ClassAkw^;
За удобство се експортират константи, с които по-лесно се установяват
стойностите на флаговете и принадлежността към класовете. Тези константи са
следните:
*
Class_D =
$01;
{ клас D, разделители }
*
Class_C =
$02;
{ клас C (само от ключови думи) }
*
Class_E =
$04;
{ клас E обработван от програмиста }
*
Class_A =
$08;
{ клас A }
*
Class_B =
$10;
{ клас B }
*
Class_A1 =
$20;
{ клас A
1
 , продължение на клас A }
*
Class_B1 =
$40;
{ клас B
1
, продължение на клас B }
*
Class_C1 =
$80;
{ клас C
1
, продължение на клас C }
*
flag_EOB =
$01;
{ EndOfBuffer достигнат е края на буфера }
*
flag_CKC =
$02;
{ Case insensitive for Keywords (Cyr) }
*
flag_CKL =
$04;
{ Case insensitive for Keywords (Lat) }
*
flag_CCC =
$08;
{ Correct Case for identifiers (Cyr) }
*
flag_CCL =
$10;
{ Correct Case for identifiers (Lat) }
*
flag_LC =
$20;
{ Do case correction by LowCase }
*
flag_ASCII= 
$80;
{ use ASCII code only (#0..#127) }
Използването им ще покажем чрез следния пример. Нека да искаме да
дефинираме всички букви от латиницата от клас A и A
1
, буквите от кирилицата от клас
B и B
1
 и цифрите от клас E и B
1
. Тогава можем да зададем всеки от байтовете-дефиниции
за принадлежност на буквите от латиницата като Class_A + Class_A1, за буквите от
кирилицата като Class_B + Class_B1 и за цифрите като Class_E + Class_A1.
Освен основната функция за лексически анализ модула UniLEX експортира още
няколко процедури:
function GetInteger(const S; i: word; l: word; var E: word): LongInt;
Действие: Задачата на GetInteger е да превърне цяло число (по синтаксиса на UniPascal) от
символно представяне във вътрешно. По-просто казано прочита цяло число, но
не от текстов файл, а от зададена променлива от тип низ. Параметрите й са
следните: S е входен буфер със символното представяне на цяло число, i е
началният индекс в него, l е максималният брой символи, които трябва да се
анализират, започвайки от i-тия елемент. В параметъра-променлива E функцията
връща броя на цифрите които е анализирала. Функцията IOresult ще даде
стойност 0, ако числото е написано правилно (няма грешка) и стойност 144, ако
има грешка в числото. Не се счита за грешка, ако в буфера има вярно
представяне на число, последвано от някакъв друг символ. Например за 1234xyz
се връща 1234 и Е = 4. Грешка се индицира, ако няма символно представяне на
<<  <  GO  >  >>

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