Нужно составить программу для вычисления типа грамматики (тип 0, тип 1 тип 2 тип 3) вводим грамматику (vn vt p s) vn - нетерминальные символы, vt терминальные символы p - правило вывода s- начальный символ и программа должна вывести тип
возможно кто то уже делал подобную задачу если не трудно пришлите код! заранее благодарен
amega
29.03.2009 13:35
я такой задачи еще не делал но я те кажу чтоб ты время пока зря не тратил
Цитата
если не трудно пришлите код!
тебе коготовый код под ключик нихто не даст, покажи сначала чтоты сумел зделать и где у тебя проблемы возникли
Рустам
29.03.2009 13: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) do begin
if p[j] in [','] then z:=copy(p,o,j); o:=j+1; for i:=1 to length(z) do if z in ['A'..'Z','a'..'z','0'..'9'] then inc(y); if z in ['-'] then f:=i+2; for i:=f to length(z) do if 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) do begin
if p[j] in [','] then z:=copy(p,o,j); o:=j+1; for i:=1 to length(z) do for y:=1 to length(vn) do if z[i]=vn(y) then t:=i+2; for i:=t to length(z) do for y:=1 to length(vn) do
g:=2 else g:=1; end; end;
procedure typ3(p: string; var g: integer); begin
begin clrscr; write('VT'); readln(vt); write('Vn'); readln(vn); write('p'); readln(p); write('s'); readln(s); for i:= typ1(p,g); if g=1 then typ2(p,g); if g=2 then 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;
procedure type(z: string; var g:integer);
begin
for j:=1 to length(z) do begin if 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) do begin if z[j] in ['a'..'z' , 'A'..'Z' , '0'..'9'] then inc(y); end;
if y>=t then begin g:=1; if g:=1 then begin for j:=1 to length(z) do for c:=1 to length(a[i].vn) if z[j]=a[i].vn[c] then g:=2 else g:=1; if z[j] in ['-','>'] then f:=g+2; end; for j:=f to length(z) do begin for c:=1 to length(a[i].vt) if z[j]=a[i].vt[c] then g:=2 else g:=1; end; for j:=f to length(z) do begin for c:=1 to length(a[i].vn) if z[j]=a[i].vn[c] then g:=2 else g:=1; end; if g:=2 then
if t>y then g:=0; z:=''; y:=0; t:=0;
end;
begin clrscr; for i:=1 to 1 do begin with a[i] do begin 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:=1 to 1 do
for j:=1 to length(a[i].p) do begin
if a[i].p[j] in ['a'..'z' , 'A'..'Z' , '0'..'9' , '-' , '>'] then z[j]:= a[i].p[j];
if a[i].p[j] in [',','.'] then type(z,g);
delete(a[i].p,1,j) end; writeln(g); readkey; end.
здесь прога вроде полностью написана но не рабочая она..и всё в одной процедуре но она нечитабельна...
volvo
29.03.2009 20:54
Пример, какие вводишь исходные данные, можешь привести?
Цитата
здесь прога вроде полностью написана но не рабочая она
Естественно, нерабочая. Кто ж тебе разрешил называть процедуру зарезервированным словом Type? Она у тебя даже не компилируемая, не то что нерабочая...
Рустам
29.03.2009 21:01
Ну в первой программе(я написал её позже второй) там уже меньше ошибок чем во второй (я её писал первой).. ну например ввожу грамматику ...
Нетерминалы A,B,C,S например ввожу терминалы q,w,e,+ ввожу правило вывода S->AB,S->C,AB->qwe,C->+ ввожу первый символ S
это вроде как пример грамматики типа 2 следовательно должен вывести "2"
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.