program Sem_Example;
{
Данная программа осуществляет семантический анализ текста на ФЯ.
Исходными данными для анализа является план семантических действий (ПСД) в двоичной форме, формируемый системой Грамматика для корректных в синтаксическом отношении текстов.
Результат семантического анализа - файл с перечнем номеров и параметров семантических процедур, содержащихся в ПСД.
Имена и расширения имен исходного и порождаемого файлов задаются константами. }
uses Dos, TPCrt, GBase3;
const
SemFileName = 'sem_exam'; { имя файла, содержащего описание на ФЯ}
SernFileExt = 'smb'; { расширение имени файла, содержащего план }
{семантических действий}
ResFileExt = 'res'; { расширение имени формируемого файла }
var
Sem: SemPlanPointer; { переменная - план семантических действий }
sw: SemWordT; { очередная одна строка ПСД (запись файла)}
gr: word; { код результата чтения очередной строки ПСД }
tf: text; { файл, в который записывается результат семантического, анализа }
i: word; { рабочая переменная, используемая при создании файла }
procedure SemAction(sw: SemWordT); { процедура интерпретации строки ПСД}
|
|
{ интерпретация состоит в записи в файл, определяемый глобальной переменной tf, номера и параметра семантического действия }
begin
WriteLn(tf); WriteLn(tf,' Сем. действие:', sw.sa); with sw do begin
WriteLn(tf,' Позиция в тексте (строка,столбец):', swp.ln+1,',', swp.sh+1); case swt of
Snoth: WriteLn(tf,' Параметр отсутствует'); Ssw: WriteLn(tf,' Ключевое слово:', swsw); Sss: WriteLn(tf,' Разделитель:', swss); Sname: WriteLn(tf,' Имя:', swn); Snumb: WriteLn(tf,' Целое число:', sww); Sreal: WriteLn(tf,' Вещественное число:', swr); Seof: WriteLn(tf,' Конец файла');
else WriteLn(tf, 'не обрабатываемый тип семантического слова') end; end; end;
begin
{ оформление экран } ClrScr; Gotoxy(1,3);
WriteLnC Семантический анализ предложения "', SemFileName,'" (по плану "',
SemFileName, '.', SemFileExt,'").');
{ открытие файл с ПСД }
New(Sem, Init);
if not Sem^.SFOpen(SemFileName+'.'+SemFileExt) then begin
WriteLn(' Ошибки при открытии файла семантических данных.');
exit; end;
{ создание файла, в который будет записан результат семантического анализа } Assign(tf, SemFileName+'.'+ResFileExt); {$I-} Rewrite (tf); {$I+} i:= lOResult; if i <> 0 then begin
WriteLn(' Ошибки при создании файла результатов семантических действий.');
exit; end;
{ цикл чтения строки ПСД и ее интерпретации } { выход из цикла по ошибке или при достижении конца файла } while Sem^.GetWord(gr.sw) and (sw.swt<>Seof) do SemAction(sw); { анализ причины завершения цикла } if (gr<>0) then begin { причина 1: GetWord=false }
case gr of
0: { все нормально};
1: WriteLn(' Файл семантических данных не открыт.'); 2: WriteLn(' Ошибки при получении семантического слова.'); 3: WriteLn(' Чтение файла после исчерпания данных.'); 4: WriteLn(' Повторное сообщение об ошибке.');
end; end else if sw.swt=Seof then begin { причина 2: считаны все записи ПСД }
{ закрытие файла результата }
WriteLn(tf);:
WriteLn(tf,' Конец файла'); Close(tf);
WriteLn(' Семантический анализ благополучно завершен.');
WriteLn(' Сформирован файл "',SemFileName,'.',ResFileExt,'" - интерпретация плана
сем. действий.'); end
(закрытие файла с ПСД } Sem^.SFReset(1); Dispose(Sem, Done); end.