IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Помогите кто знает немного теорию компиляторов, Программа для вычисления типа грамматики
Рустам
сообщение 29.03.2009 13:04
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской

Репутация: -  1  +


Нужно составить программу для вычисления типа грамматики (тип 0, тип 1 тип 2 тип 3)
вводим грамматику (vn vt p s) vn - нетерминальные символы, vt терминальные символы p - правило вывода s- начальный символ
и программа должна вывести тип

возможно кто то уже делал подобную задачу если не трудно пришлите код! заранее благодарен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 4)
amega
сообщение 29.03.2009 13:35
Сообщение #2


?
***

Группа: Пользователи
Сообщений: 283
Пол: Мужской

Репутация: -  4  +


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

тебе коготовый код под ключик нихто не даст, покажи сначала чтоты сумел зделать и где у тебя проблемы возникли
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Рустам
сообщение 29.03.2009 13:40
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской

Репутация: -  1  +


вот 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.



здесь прога вроде полностью написана но не рабочая она..и всё в одной процедуре но она нечитабельна...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.03.2009 20:54
Сообщение #4


Гость






Пример, какие вводишь исходные данные, можешь привести?

Цитата
здесь прога вроде полностью написана но не рабочая она
Естественно, нерабочая. Кто ж тебе разрешил называть процедуру зарезервированным словом Type? Она у тебя даже не компилируемая, не то что нерабочая...
 К началу страницы 
+ Ответить 
Рустам
сообщение 29.03.2009 21:01
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 40
Пол: Мужской

Репутация: -  1  +


Ну в первой программе(я написал её позже второй) там уже меньше ошибок чем во второй (я её писал первой)..
ну например ввожу грамматику ...

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

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 13:54
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"