Пример грамматики с вызовами семантических процедур

Программа::=

program <_Name_> (_0_);

[_ <_ Константы _> _] [_ <_ Переменные _> _] begin

{_ <_ Операция _> _} end. (_10_)**

Константы = const {_ <_Name_> (_1_) = <_Число_> (_2_); _} **

Число =?_ <_Numb_> _|_ <_Real_> _? **

Переменные = var {_ <_Name_>(_3_) {_,<_Name_>(_4_)_}: <_Стандартный_тип_>;_} **..
Стандартный_тип::=?_ word _|_ byte _|_ char _|_ real _?(_5_) **
Операция::= <_Name_> (_6_):= <_ Выражение_> (_ 9 _)**

Выражение::= <_Операнд_> {_ <_Знак_Операции _> <_Операнд_> _}; **

Операнд::=?_ <_Name_> _|_ <_Numb_> _|_ <_Real_> _? (_7_) **

Знак_Операции::=?_ + _|_-_|_ *_|_/_| (_8_)**


ПРИЛОЖЕНИЕ 2

ИНТЕРФЕЙС ПРОГРАММ СЕМАНТИЧЕСКОГО АНАЛИЗА С ПЛАНОМ СЕМАНТИЧЕСКИХ ДЕЙСТВИЙ

Для создания Turbo Pascal-программы, осуществляющей семан­тический анализ предложений на ФЯ, необходимо иметь в наличии и указать компилятору Turbo Pascal 7 модулей: GBase1.tpu, GBase2.tpu, GBase3.tpu, tpcrt.tpu, tpinline.tpu, tpmemchk.tpu, tpstring.tpu. Последние 4 из них принадлежат пакету Turbo Professional фирмы TurboPower, с исполь­зованием которого написан ряд функций системы "Грамматика". Мо­дуль, осуществляющий семантический анализ, должен импортировать Gbase3, который содержит:

• класс SemPointer, обеспечивающий работу с планом семан­тических действий,

тип SemWordT, определяющий структуру одной строки плана (записи файла).

Класс SemPointer SemUserT = object (...)

constructor Init;

function SFOpen(file_name: string): boolean;

function GetWord(var sr: word; var sw: SemWordT): boolean;

procedure SFWrite(sw: SemWordT);

function SFReset(t: word): boolean;

destructor Done;

end;

SemPointer=^SemUserT;

constructor Init;

Вызов конструктора Init необходим для корректной работы прочих процедур.

function SFOpen(file_name: string): boolean;

Функция SFOpen имеет единственный параметр - имя файла, со­держащего план семантических действий в двоичной форме. Функция возвращает значение True, если файл найден и инициированы все необ­ходимые данные. Значение False свидельствует о невозможности выпол­нения дальнейших действий с данным планом.

function GetWord(var sr: word; var sw: SemWordT): boolean;

Функция GetWord предназначена для получения следующей записи плана. Функция возвращает значение True в случае корректного по­лучения очередной записи. False - в противном случае. Через параметр sr передается код ошибки:

0: ошибок нет;

1: файл семантических данных не открыт;

2: ошибки при получении семантического слова;

3: чтение файла после исчерпания данных;

4: повторное сообщение об ошибке.

Procedure SFWrite(sw: SemWordT);

Процедура выводит на экран дисплея значение полей параметра sw.

Procedure SFReset(t: word): boolean;

Процедура, в зависимости от значения параметра t, удаляет файл с планом (t=1) или закрывает его (t=2). Обращение к ней обязательно по­сле завершения семантического анализа.

Destructor Done;

Процедура завершает цикл работ с планом и связанной с ним ди­намической переменной типа SemUserT.

Тип SemWordT Туре

SWType = (Snoth, Seof, Ssw, Sss, Sname, Snumb, Sreal); SemWordT = Record

sa: Word; { номер семантической процедуры }

swp: TextPosition; { позиция слова в анализируемом предложении }

Case swt: SWType of

Snoth: (); { ничего }

Seof: (); { конец файла }

Ssw: (swsw: string); { ключевое слово языка)

Sss: (swss: string); { разделитель языка}

Sname: (swn: string); { идентификатор }

Snumb: (sww: word); { число целое без знака }

Sreal: (swr: real) { число вещественное без знака }

end;

TextPosition = Record { позиция точки в тексте)

lp: word1; { файловая позиция начала строки }

sh: word; { смешение по строке к точке, т.е. файловая позиция точки есть (lp+sh)}

ln: word { номер данной строки, считая с 0 }

end;


ПРИЛОЖЕНИЕ 3


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: