Смекни!
smekni.com

Построение функции предшествования по заданной КС-грамматике (стр. 4 из 4)

Begin

tmp.Name:=term;

mj:=Search(Trm_notTrm,tmp);

Ex:=matrixprecede[mi,mj]=0;

If not Ex Then

matrixprecede[mi,mj]:=4

Else

matrixprecede[mi,mj]:=3;

p:=RTN;

Seek(term2,RTN,p);

While (p<>Nil) and (p^.Name<>#0) Do

Begin

tmp.Name:=p^.Name;

mi:=Search(Trm_notTrm,tmp);

Ex:=matrixprecede[mi,mj]=0;

If not Ex Then

matrixprecede[mi,mj]:=4

Else

matrixprecede[mi,mj]:=2;

p:=p^.Next;

End;

End

Else

If i>Len Then Goto Next

Else

If s[i]='|' Then

Begin

inc(i);

Goto More;

End;

Blank;

If s[i]='|' Then

Begin

inc(i);

Goto More;

End;

If i<=Len Then{не дошли до конца правила}

Begin

i:=i-Length(term);

While s[i]=' ' Do dec(i);

Goto More;

End;

End

Else

Begin

Terminal(term);

tmp.Name:=term;

mi:=Search(Trm_notTrm,tmp);

Blank;

If i>Len Then{последний в правиле терминал}

Goto Next;

If s[i]='<' Then{за терминалом следует нетерминал}

Begin

inc(i);

Terminal(term);

tmp.Name:='<'+term+'>';

mj:=Search(Trm_notTrm,tmp);

{записываем в матрицу =}

Ex:=matrixprecede[mi,mj]=0;

If not Ex Then

matrixprecede[mi,mj]:=4

Else

matrixprecede[mi,mj]:=3;

p:=LTN;

Seek(tmp.Name,LTN,p);

While (p<>Nil) and (p^.Name<>#0) Do

Begin

tmp.Name:=p^.Name;

mj:=Search(Trm_notTrm,tmp);

Ex:=matrixprecede[mi,mj]=0;

If not Ex Then

matrixprecede[mi,mj]:=4

Else

matrixprecede[mi,mj]:=1;

p:=p^.Next;

End;

Blank;

inc(i);

Blank;

If s[i]='|' Then

Begin

inc(i);

Goto More;

End;

If i<=Len Then{не дошли до конца правила}

Begin

i:=i-Length(term)-2;

Goto More;

End;

End

Else

If i<Len Then

Begin

If s[i]='|' Then

Begin

inc(i);

Goto More;

End;

{за терминалом терминал}

tmp.Name:=term;

mi:=Search(Trm_notTrm,tmp);

Terminal(term);

tmp.Name:=term;

mj:=Search(Trm_notTrm,tmp);

Ex:=matrixprecede[mi,mj]=0;

If not Ex Then

matrixprecede[mi,mj]:=4

Else

matrixprecede[mi,mj]:=3;

i:=i-Length(term);

End;

End;

If i<Len Then{прошли не всю строку}

Goto More;

next:inc(y);

Until y>CLine;

End;

Procedure WrtSymbol(i,j,c:Byte);

Begin

Case c of

1:Begin

OutTextXY(18+i*25,27+j*24-40,'<');

PutPixel(18+i*25+5,27+j*24+3-40,3);

End;

2:Begin

OutTextXY(18+i*25,27+j*24-40,'>');

PutPixel(18+i*25-1,27+j*24+3-40,3);

End;

3:Begin

OutTextXY(18+i*25,25+j*24+3-40,'=');

PutPixel(18+i*25+2,25+j*24+3-40,3);

End;

4:OutTextXY(18+i*25,25+j*24+3-40,'X');

End;

End;

Var sdig:String[2];

j:Byte;

x,y:Byte;

tmp:NotTerm;

tmp2:NotTerm;

Error:Boolean;

Pic:Pointer;

size:Word;

Begin

Message(30,15,15,7,'',False);

Zoom;

Message(30,15,15,7,'Матрица предшествования',False);

Tab(CTrmNotTrm+1,10,20);

WriteGr('ГРАММАТИКА',440,360,200);

For j:=1 To CLine Do

Begin

PosStr(j,s);

LineStr(s,400,375+j*13);

End;

TextColor(14);

TextBackGround(0);

Window(1,1,80,28);

x:=2;

y:=24;

GotoXY(50,2);

WriteLN('Левые Правые');

SetColor(14);

tmp:=Trm_NotTrm;

tmp2:=notTerminalL;

For i:=1 To CTrmNotTrm Do

Begin

Str(i,sdig);

OutTextXY(18+i*25,25,sdig);

OutTextXY(18,35+i*24,sdig);

inc(y);

If y=29 Then

Begin

inc(x,13);

y:=25;

End;

GotoXY(x,y);

TextColor(14);

Write(sdig,'. ');

TextColor(3);

Write(tmp^.Name);

GotoXY(43,2+i);

If tmp2<>Nil Then

Write(tmp2^.Name);

tmp2:=tmp2^.Next;

tmp:=tmp^.Next;

End;

tmp2:=LTN;

i:=3;

GotoXY(50,WhereY);

While tmp2<>Nil Do

Begin

If tmp2^.Name=#0 Then

Begin

GotoXY(50,WhereY);

inc(i);

End;

GotoXY(WhereX,i);

If tmp2^.Name<>#0 Then Write(tmp2^.Name);

tmp2:=tmp2^.Next;

End;

tmp2:=RTN;

i:=3;

GotoXY(70,WhereY);

While tmp2<>Nil Do

Begin

If tmp2^.Name=#0 Then

Begin

GotoXY(70,WhereY);

inc(i);

End;

GotoXY(WhereX,i);

If tmp2^.Name<>#0 Then Write(tmp2^.Name);

tmp2:=tmp2^.Next;

End;

Precede;

SetColor(3);

Error:=False;

For j:=1 To CTrmNotTrm Do{!!!}

For i:=1 To CTrmNotTrm Do{!!!}

Begin

If MatrixPrecede[j,i]=4 Then Error:=True;

WrtSymbol(i,j+2,MatrixPrecede[j,i]);

End;

If Error Then

Begin

TextColor(15);

TextBackGround(1);

Message(30,15,15,7,'Нажмите любую клавишу',True);

VerticalRetrace;

SaveWindow(GraphCooX(20),GraphCooY(12),GraphCooX(62)+1,GraphCooY(19),Pic,size);

TextBackGround(4);

TextColor(14);

OpenWindow(20,12,60,17,3,' Внимание ',True);

WriteLn('Матрица предшествования содержит ошибки');

Write(' Построение функции предшествования ');

Write(' невозможно');

Attention(363,243);

ReadKey;

LoadWindow(GraphCooX(20),GraphCooY(12),size,pic);

End;

End;

{основная программа}

Begin

Init;

InitText;

If InputText Then

Begin

Check;

SearchLR;

Matrix;

ClearBuf;

ReadKey;

End;

GraphWriteOff;

CloseGraph;

End.

6. Список использованных источников

1. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. – М.: Мир, 1975.

2. Шамашов М.А. Основные структуры данных и алгоритмы компиляции. – Самара: Университет Наяновой, 1999.

3. Шамашов М.А. Теория формальных языков. Грамматики и автоматы. – Самара: Университет Наяновой, 1996.

4. Интернет сайт. - WWW.CodeNet.ru