Программа::=
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