Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите кто знает немного теорию компиляторов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Рустам
Нужно составить программу для вычисления типа грамматики (тип 0, тип 1 тип 2 тип 3)
вводим грамматику (vn vt p s) vn - нетерминальные символы, vt терминальные символы p - правило вывода s- начальный символ
и программа должна вывести тип

возможно кто то уже делал подобную задачу если не трудно пришлите код! заранее благодарен
amega
я такой задачи еще не делал но я те кажу чтоб ты время пока зря не тратил
Цитата
если не трудно пришлите код!

тебе коготовый код под ключик нихто не даст, покажи сначала чтоты сумел зделать и где у тебя проблемы возникли
Рустам
вот 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
Пример, какие вводишь исходные данные, можешь привести?

Цитата
здесь прога вроде полностью написана но не рабочая она
Естественно, нерабочая. Кто ж тебе разрешил называть процедуру зарезервированным словом Type? Она у тебя даже не компилируемая, не то что нерабочая...
Рустам
Ну в первой программе(я написал её позже второй) там уже меньше ошибок чем во второй (я её писал первой)..
ну например ввожу грамматику ...

Нетерминалы A,B,C,S например
ввожу терминалы q,w,e,+
ввожу правило вывода S->AB,S->C,AB->qwe,C->+
ввожу первый символ S

это вроде как пример грамматики типа 2 следовательно должен вывести "2"

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.