close

Вход

Забыли?

вход по аккаунту

?

7 (4)

код для вставкиСкачать
Лабораторная работа №7
Анализ секции объявления
Задание: создать программу, которая осуществляет выполнение алгоритма рекурсивного спуска для следующей грамматики:
L→Tl L^'
L^' →^' or^' Tl L^' |ε
Tl→Fl Tl^'
Tl^' →^' and^' Fl Tl^' |ε
Fl^'→I|L|[EzE]
z→>|<|=|≤|≥|<>
Алгоритм построения процедур.
Для построения процедур просматривается правая часть правила для каждого нетерминала.
Если встречается нетерминальный символ, то вызывается процедура для этого символа. Если она завершается без ошибки, то в исходном тексте фраза для этого терма закрыта, и все семантические действия тоже выполнены.
Если встречается терминальный символ, он сравнивается с очередным символом входной строки. Если они совпадают, этот символ просто закрывается. Указатель смещается на один шаг вправо. Если не совпадают, то это синтаксическая ошибка и трансляция прекращается.
Если встречается метасимвол:
Если встречается итерация {, то организуется цикл while, в который помещается все, что заключено в {}. Условием входа в цикл является то, что очередной символ не принадлежит множеству Follow для этого нетерминала.
Если встречается альтернатива ( | ), то организуется оператор if , определяется вхождения очередного символа входной строки множества first для той или иной альтернативы
Текст программы:
program SPO_8;
var buf,sl:string;
t:char;
ub,z,tag,n,i,count:integer;
f:text;
tab_k,tab_i,tab_r,tab_l:array [1..256] of string;
fail, bofl:boolean;
procedure err(a:integer);
begin
case a of
0: writeln('error: неверное число скобок');
1: writeln('error: ожидались символы ''*'',''/'',''+'',''-'',''('' или ''#'' [',ub-length(sl),']');
2: writeln('error: ожидался идентификатор или число [',ub-1,']');
3: writeln('error: неожиданный символ [',ub-1,']');
4: writeln('error: ожидался оператор присваивания [',ub-length(sl),']');
5: writeln('error: нельзя присваивать не в начале строки');
6: writeln('error:ожидалось логическое выражение [',ub-length(sl),']');
7: writeln('error: ожидалось ''do'' [',ub-length(sl),']');
end;
end;
fail:=true;
close(f);
halt;
end;
procedure scan(var t:char; var n:integer);
procedure next_ub;
begin
if (ub<length(buf)) then
begin ub:=ub+1;end
else begin readln(f,buf);ub:=1;end;
if (buf[ub]='(') then count:=count+1
else if (buf[ub]=')') then count:=count-1;
end;
function ks(var c:char):boolean;
var i:integer;
begin
ks:=false;
if (c='k') then
begin
for i:=1 to 10 do
if (sl=tab_k[i]) then
begin ks:=true;tag:=i;end;
end;
if (c='i') then
begin
for i:=1 to z do
if (sl=tab_i[i]) then
begin ks:=true;tag:=i;end;
if (tag<>i) then tag:=z;
end;
if (c='r') then
begin
for i:=1 to 20 do
if (sl=tab_r[i]) then
begin ks:=true;tag:=i;end;
end;
if (c='l') then
begin
for i:=1 to 5 do
if (sl=tab_l[i]) then
begin ks:=true;tag:=i;end;
end;
end;
var x,c:char;
state:integer;
f0:text;
begin
sl:='';
state:=0;
repeat
case state of
0: begin
x:=buf[ub];
if (((x>='a')and(x<='z'))or((x>='A')and(x<='Z'))) then
begin sl:=sl+x;next_ub;state:=1;end
else if ((x>='0')and(x<='9')) then
begin sl:=sl+x;next_ub;state:=10;end
else begin sl:=sl+x;next_ub;state:=5;end;
end;
1: begin
x:=buf[ub];
if ((((x>='a')and(x<='z'))or((x>='A')and(x<='Z'))or((x>='0')and(x<='9')))and(ub<>1)) then begin sl:=sl+x; next_ub; end
else begin c:='k';
if ks(c) then state:=2
else begin c:='l';if ks(c) then state:=7 else begin c:='i';if ks(c) then state:=6 else state:=3;
end;
end;
end;
end;
10: begin
x:=buf[ub];
if ((x>='0')and(x<='9')) then begin sl:=sl+x; next_ub; end
else begin t:='c';n:=0;state:=4;end;
end;
2: begin
t:='k';n:=tag;state:=4;
end;
3: begin
t:='i';n:=tag;tab_i[z]:=sl;z:=z+1;state:=4;
end;
5: begin
c:='r';
if ks(c) then
begin t:='r';n:=tag;state:=4;end
else err(3);
end;
6: begin
t:='i';n:=tag;state:=4;
end;
7: begin
t:='l';n:=tag;state:=4;
end;
end;
until (state=4);
end;
procedure scan1(var t:char; var n:integer);
var x,c:char;
state,ib:integer;
f0:text;
procedure next_ib;
begin
if (ib<length(buf)) then
begin ib:=ib+1;end
else if not(eof(f)) then begin readln(f,buf);ib:=1;end;
end;
function ks(var c:char):boolean;
var i:integer;
begin
ks:=false;
if (c='k') then
begin for i:=1 to 10 do if (sl=tab_k[i]) then
begin ks:=true;tag:=i;end;
end;
if (c='i') then
begin
for i:=1 to z do
if (sl=tab_i[i]) then
begin ks:=true;tag:=i;end;
if (tag<>i) then tag:=z;
end;
if (c='r') then
begin
for i:=1 to 20 do
if (sl=tab_r[i]) then
begin ks:=true;tag:=i;end;
end;
if (c='l') then
begin
for i:=1 to 5 do
if (sl=tab_l[i]) then
begin ks:=true;tag:=i;end;
end;
end;
begin
ib:=ub;sl:='';state:=0;
repeat
case state of
0: begin
x:=buf[ib];
if (((x>='a')and(x<='z'))or((x>='A')and(x<='Z'))) then
begin sl:=sl+x;next_ib;state:=1;end
else if ((x>='0')and(x<='9')) then
begin sl:=sl+x;next_ib;state:=10;end
else
begin sl:=sl+x;next_ib;state:=5;end;
end;
1: begin
x:=buf[ib];
if ((((x>='a')and(x<='z'))or((x>='A')and(x<='Z'))or((x>='0')and(x<='9')))and(ib<>1)) then begin sl:=sl+x; next_ib; end
else
begin
c:='k';
if ks(c) then state:=2
else
begin c:='l';if ks(c) then state:=7
else
begin c:='i';if ks(c) then state:=6 else state:=3;
end;end;end;
end;
10: begin
x:=buf[ib];
if ((x>='0')and(x<='9')) then begin sl:=sl+x; next_ib; end
else
begin t:='c';n:=0;state:=4;end;
end;
2: begin
t:='k';n:=tag;state:=4;
end;
3: begin
t:='i';n:=tag;tab_i[z]:=sl;z:=z+1;state:=4;
end;
5: begin
c:='r';
if ks(c) then
begin t:='r';n:=tag;state:=4;end
else
begin writeln('Íåîæèäàííûé ñèìâîë [',ib,']');halt;end;
end;
6: begin
t:='i';n:=tag;state:=4;
end;
7: begin
t:='l';n:=tag;state:=4;
end;
end;
until (state=4);
end;
procedure ee; forward;
procedure oppr; forward;
procedure oppr;
begin
if not bofl then err(5);scan(T,n);scan(T,n);
if not ((T='r')and(n=9)) then err(4)
else begin ee;scan1(T,n);if not ((T='r')and(n=7)) then err(1);end;
end;
procedure ff;
begin
scan(T,n);
if (T='i') then
begin if not ((ub-length(sl))=1) then bofl:=false;scan1(T,n);
if ((T='r')and(n=8)) then oppr;end
else if (T='c') then begin end
else if (T='l') then begin end
else if ((T='r')and(n=5)) then
begin
ee;scan(T,n);if ((T='r')and(n=6)) then begin end
else if ((T='r')and(n=11)) then begin
ee;scan(T,n);if not ((T='r') and (n=12)) then err(0); end
else err(0);end else err(2);
end;
procedure tt;
begin
ff;
scan1(T,n);
while (not((T='r') and ((n=1) or (n=2) or (n=6) or (n=7) or (n=12)))) do
begin
scan(T,n);if ((T='r') and (n=3)) then ff else
if ((T='r') and (n=4)) then ff else
if ((T='r') and (n=10)) then ff else err(1);scan1(T,n);
end;
end;
procedure ee;
begin
tt;
While (not(((T='r') and (n=7))or((T='r') and (n=6)) or ((T='r')and(n=12)))) do
begin scan(T,n);if ((T='r') and (n=1)) then tt else
if ((T='r') and (n=2)) then tt else err(1);scan1(T,n);
end;
end;
procedure prepare;
begin
assign(f,'tab_r.txt');reset(f);i:=1;
repeat
readln(f,tab_r[i]);i:=i+1;
until eof(f);
close(f);assign(f,'tab_k.txt');reset(f);i:=1;
repeat
readln(f,tab_k[i]);i:=i+1;
until eof(f);
close(f);assign(f,'tab_l.txt');reset(f);i:=1;
repeat
readln(f,tab_l[i]);i:=i+1;
until eof(f);
close(f);assign(f,'text.txt');reset(f);readln(f,buf);ub:=1;z:=1;count:=0;
bofl:=true;
if (buf[ub]='(') then count:=count+1 else if (buf[ub]=')') then count:=count-1;
end;
begin
prepare;
ee;
if (buf[ub]='(') then count:=count+1 else if (buf[ub]=')') then count:=count-1;
if (count<>0) then err(0);
writeln(' Ñòðîêà ïðàâèëüíàÿ');
close(f);
assign(f,'tab_i.txt');
append(f);
for i:=1 to z-1 do
writeln(f,tab_i[i]);
close(f);
end.
Выполнение
Пример №1:
(((((c or b)))))# correct line
Пример №2:
(c>b)or(c<b)# correct line
Пример №3:
((c and b)or(c and b)# expected closing parenthesis...
Пример №4:
(c>=b)or(z<=b)# invalid character!
Пример №5:
(c>=b)or(c<=b) expected end of file....
Документ
Категория
Рефераты
Просмотров
16
Размер файла
31 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа