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

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

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

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


Новичок
*

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

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


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

возможно кто то уже делал подобную задачу если не трудно пришлите код! заранее благодарен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


?
***

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

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


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

тебе коготовый код под ключик нихто не даст, покажи сначала чтоты сумел зделать и где у тебя проблемы возникли
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

Цитата
здесь прога вроде полностью написана но не рабочая она
Естественно, нерабочая. Кто ж тебе разрешил называть процедуру зарезервированным словом Type? Она у тебя даже не компилируемая, не то что нерабочая...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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

 





- Текстовая версия 19.04.2024 6:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name