Пример программной реализации семантического анализатора

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.


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



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