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