Нужно составить программу для вычисления типа грамматики (тип 0, тип 1 тип 2 тип 3) вводим грамматику (vn vt p s) vn - нетерминальные символы, vt терминальные символы p - правило вывода s- начальный символ и программа должна вывести тип
возможно кто то уже делал подобную задачу если не трудно пришлите код! заранее благодарен
amega
29.03.2009 17:35
я такой задачи еще не делал но я те кажу чтоб ты время пока зря не тратил
Цитата
если не трудно пришлите код!
тебе коготовый код под ключик нихто не даст, покажи сначала чтоты сумел зделать и где у тебя проблемы возникли
Рустам
29.03.2009 17:40
вот 2 наброска есть
uses crt;
var
vt,vn,p,s,z,x: string;
i,j,f,o: integer;
procedure typ1 (p: string,g:integer)
begin
o:=1;
for j:=o to length(p) dobeginif p[j] in [','] then
z:=copy(p,o,j);
o:=j+1;
for i:=1to length(z) doif z in ['A'..'Z','a'..'z','0'..'9'] then
inc(y);
if z in ['-'] then
f:=i+2;
for i:=f to length(z) doif z in ['A'..'Z','a'..'z','0'..'9'] then
inc(t);
if y<=t then g:=1;
else g:=0;
z:='';
t:=0;
y:=0;
end;
end;
procedure typ2(p: string, var g: integer );
begin
o:=1;
for j:=o to length(p) dobeginif p[j] in [','] then
z:=copy(p,o,j);
o:=j+1;
for i:=1to length(z) dofor y:=1to length(vn) doif z[i]=vn(y) then
t:=i+2;
for i:=t to length(z) dofor y:=1to length(vn) do
g:=2else g:=1;
end;
end;
procedure typ3(p: string; var g: integer);
beginbegin
clrscr;
write('VT'); readln(vt);
write('Vn'); readln(vn);
write('p'); readln(p);
write('s'); readln(s);
for i:=
typ1(p,g);
if g=1then typ2(p,g);
if g=2then typ3(p,g);
я знаю тут сама прога не закончена основной упор на процедуры...для двух типов сделал ..их не проверял.. над третьим пока думаю
uses crt;
type
gramm=record
VN: string;
VT: string;
P: string;
S: char;
end;
var
a: array [1..4] of gramm;
z,x: string;
i,j,t,y,f,g,c: integer;
proceduretype(z: string; var g:integer);
beginfor j:=1to length(z) dobeginif z[j] in ['a'..'z' , 'A'..'Z' , '0'..'9'] then
inc(t);
if z[j] in ['-','>'] then
f:=g+2;
end;
for j:=f to length(z) dobeginif z[j] in ['a'..'z' , 'A'..'Z' , '0'..'9'] then
inc(y);
end;
if y>=t thenbegin
g:=1;
if g:=1thenbeginfor j:=1to length(z) dofor c:=1to length(a[i].vn)
if z[j]=a[i].vn[c] then
g:=2else g:=1;
if z[j] in ['-','>'] then
f:=g+2;
end;
for j:=f to length(z) dobeginfor c:=1to length(a[i].vt)
if z[j]=a[i].vt[c] then
g:=2else g:=1;
end;
for j:=f to length(z) dobeginfor c:=1to length(a[i].vn)
if z[j]=a[i].vn[c] then
g:=2else g:=1;
end;
if g:=2thenif t>y then g:=0;
z:='';
y:=0;
t:=0;
end;
begin
clrscr;
for i:=1to1dobeginwith a[i] dobegin
writeln('BBeDuTE VN');
readln(VN);
writeln('BBeDuTE VT');
readln(VT);
writeln('BBeDuTE P 4epe3 "->" u "," ');
readln(P);
writeln('BBeDuTE S');
readln(S);
writeln;
end;
end;
writeln;
x:=a[i].p;
for i:=1to1dofor j:=1to length(a[i].p) dobeginif a[i].p[j] in ['a'..'z' , 'A'..'Z' , '0'..'9' , '-' , '>'] then
z[j]:= a[i].p[j];
if a[i].p[j] in [',','.'] thentype(z,g);
delete(a[i].p,1,j)
end;
writeln(g);
readkey;
end.
здесь прога вроде полностью написана но не рабочая она..и всё в одной процедуре но она нечитабельна...
volvo
30.03.2009 0:54
Пример, какие вводишь исходные данные, можешь привести?
Цитата
здесь прога вроде полностью написана но не рабочая она
Естественно, нерабочая. Кто ж тебе разрешил называть процедуру зарезервированным словом Type? Она у тебя даже не компилируемая, не то что нерабочая...
Рустам
30.03.2009 1:01
Ну в первой программе(я написал её позже второй) там уже меньше ошибок чем во второй (я её писал первой).. ну например ввожу грамматику ...
Нетерминалы A,B,C,S например ввожу терминалы q,w,e,+ ввожу правило вывода S->AB,S->C,AB->qwe,C->+ ввожу первый символ S
это вроде как пример грамматики типа 2 следовательно должен вывести "2"
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.