Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_otchet_chumak.doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
206.85 Кб
Скачать

Лабораторная работа №6 Лексический анализатор. Процедура, которая не смещает указатель входного потока

Текст программы:

var s,c:string;

k,kl,id,tab_i,tab_k:array [1..100] of string;

f,kluch:text;

st,i,x,n,o,j,d,d2,l,q,r,r2:integer;

procedure scan (c:string; var k:array [1..100] of string; i:integer);

begin if (((c[1]>='A') and (c[1]<='Z')) or ((c[1]>='a') and (c[1]<='z'))) then

begin

k[1]:=c[1];

i:=1;

x:=2;

st:=1;

end;

repeat

case st of

1: begin if (((c[x]>='A') and (c[x]<='Z')) or ((c[x]>='a') and (c[x]<='z')) or ((c[x]>='0') and (c[x]<='9'))) then

begin

k[i]:=k[i]+c[x];

inc(x);

end

else begin st:=2; x:=x+1; end;

end;

2: begin if (((c[x]>='A') and (c[x]<='Z')) or ((c[x]>='a') and (c[x]<='z'))) then

begin

i:=i+1;

k[i]:=c[x];

x:=x;

st:=1;

end

else x:=x+1;

end; end;

until length(c)=x;

end;

begin d:=1;

d2:=1;

assign(kluch,'Kluch.txt');

reset(kluch);

i:=0;

r:=0;

r2:=0;

repeat i:=i+1;

readln (kluch,c);

kl[i]:=c;

until eof(kluch);

o:=i;

close(kluch);

assign(f,'Text.txt');

reset(f);

repeat

readln(f,c);

scan (c,k,i);

n:=i;

for i:=1 to n do

begin l:=1;

for j:=1 to o do

if k[i]=kl[j] then l:=0;

if l=1 then begin for q:=1 to d do

if k[i]=tab_i[q] then l:=0;

if l=1 then begin r:=r+1; tab_i[r]:=k[i]; d:=d+1;end;

end;

end;

for i:=1 to n do

begin l:=0;

for j:=1 to o do

if k[i]=kl[j] then l:=1;

if l=1 then begin for q:=1 to d2 do

if k[i]=tab_k[q] then l:=0;

if l=1 then begin r2:=r2+1; tab_k[r2]:=k[i]; d2:=d2+1;end;

end;

end;

until eof(f);

close(f);

for i:=1 to r do

writeln (tab_i[i]);

writeln;

for i:=1 to r2 do

writeln (tab_k[i]);

end.

В результате компиляции программы получится следующий результат:

x x

yy

iinteger

f идентификаторы

rreal

y

cc

ff

v ar

begin

readln ключи

writeln

end

Лабораторная работа №7 Рекурсивный спуск

1) Цель работы: создать программу, которая осуществляет выполнение алгоритма рекурсивного спуска для следующей грамматики:

Алгоритм построения процедур.

Для построения процедур просматривается правая часть правила для каждого нетерминала.

  1. Если встречается нетерминальный символ, то вызывается процедура для этого символа. Если она завершается без ошибки, то в исходном тексте фраза для этого терма закрыта, и все семантические действия тоже выполнены.

  2. Если встречается терминальный символ, он сравнивается с очередным символом входной строки. Если они совпадают, этот символ просто закрывается. Указатель смещается на один шаг вправо. Если не совпадают, то это синтаксическая ошибка и трансляция прекращается.

  3. Если встречается метасимвол:

    1. Если встречается итерация {, то организуется цикл while, в который помещается все, что заключено в {}. Условием входа в цикл является то, что очередной символ не принадлежит множеству Follow для этого нетерминала.

    2. Если встречается альтернатива ( | ), то организуется оператор if или несколько вложенных операторов if. Число ветвей должно быть на единицу больше, чем альтернатив. Условие для входа в ветвь – принадлежность текущего символа множеству First для этой альтернативы, а последняя ветвь Else соответствует синтаксической ошибке.

Содержимое файла: I+(I*I-I)#

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]