Begin
While (i>1) and (s[i]<>'<') Do dec(i);
inc(i);
Blank;
Terminal(term);{ïîñëåäíèé íåòåðìèíàë}
tmp.Name:='<'+term+'>';
If (SearchInBlock(y,RTN,tmp)=0) and (term>'') Then
Complete(RTN,tmp);{äîáàâëÿåì ïðàâûé}
inc(i);{ïðîïóñê >}
If s[i]='|' Then
Goto More;
End;
End
Else{ïîñëåäíèé â ïðàâèëå òåðìèíàë}
While (i>1) and not((s[i]=' ') or (s[i]='|') or (s[i]='>')) Do dec(i);
Terminal(term);
tmp.Name:=term;
If i<Len Then{ïðîøëè íå âñþ ñòðîêó}
next:inc(y);
tmp.Name:=#0;{ïîñëå êàæäîé ñòðîêè ñòàâèì ðàçäåëèòåëü}
Complete(LTN,tmp);{äîáàâëÿåì ëåâûé}
Until y>CLine;
{ïîñëå öèêëà ïîëó÷èëè "ïðåäâàðèòåëüíûå" ëåâûå è ïðàâûå, èõ åùå íàäî äîïîëíèòü}
For y:=1 To 10 Do
Add_(LTn);
Add_(RTn);
{ïîëó÷èëè ëåâûå è ïðàâûå, ðàçäåëåííûå #0}
Procedure Matrix;
Procedure Precede;
Label More,Next;
Var mi,mj:Byte;
tmp:List;
p:NotTerm;
term,term2:String;
Ex:Boolean;
y:=1;
i:=1;
Repeat
PosStr(y,s);
i:=Pos('=',S)+1;{i ñòàâèì ïîñëå :=}
More:Blank;
If s[i]='<' Then
term2:=tmp.Name;
mi:=Search(Trm_notTrm,tmp);
If Terminal(term) Then{íåòåðìèíàë çà íèì òåðìèíàë}
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
tmp.Name:=p^.Name;
matrixprecede[mi,mj]:=2;
p:=p^.Next;
If i>Len Then Goto Next
If i<=Len Then{íå äîøëè äî êîíöà ïðàâèëà}
i:=i-Length(term);
While s[i]=' ' Do dec(i);
If i>Len Then{ïîñëåäíèé â ïðàâèëå òåðìèíàë}
Goto Next;
If s[i]='<' Then{çà òåðìèíàëîì ñëåäóåò íåòåðìèíàë}
{çàïèñûâàåì â ìàòðèöó =}
p:=LTN;
Seek(tmp.Name,LTN,p);
matrixprecede[mi,mj]:=1;
i:=i-Length(term)-2;
If i<Len Then
{çà òåðìèíàëîì òåðìèíàë}
Procedure WrtSymbol(i,j,c:Byte);
Case c of
1:Begin
OutTextXY(18+i*25,27+j*24-40,'<');
PutPixel(18+i*25+5,27+j*24+3-40,3);
2:Begin
OutTextXY(18+i*25,27+j*24-40,'>');
PutPixel(18+i*25-1,27+j*24+3-40,3);
3:Begin
OutTextXY(18+i*25,25+j*24+3-40,'=');
PutPixel(18+i*25+2,25+j*24+3-40,3);
4:OutTextXY(18+i*25,25+j*24+3-40,'X');
Var sdig:String[2];
j:Byte;
x,y:Byte;
tmp:NotTerm;
tmp2:NotTerm;
Error:Boolean;
Pic:Pointer;
size:Word;
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
PosStr(j,s);
LineStr(s,400,375+j*13);
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
Str(i,sdig);
OutTextXY(18+i*25,25,sdig);
OutTextXY(18,35+i*24,sdig);
inc(y);
If y=29 Then
inc(x,13);
y:=25;
GotoXY(x,y);
Write(sdig,'. ');
TextColor(3);
Write(tmp^.Name);
GotoXY(43,2+i);
If tmp2<>Nil Then
Write(tmp2^.Name);
tmp2:=tmp2^.Next;
tmp:=tmp^.Next;
tmp2:=LTN;
i:=3;
GotoXY(50,WhereY);
While tmp2<>Nil Do
If tmp2^.Name=#0 Then
GotoXY(WhereX,i);
If tmp2^.Name<>#0 Then Write(tmp2^.Name);
tmp2:=RTN;
GotoXY(70,WhereY);
Precede;
SetColor(3);
Error:=False;
For j:=1 To CTrmNotTrm Do{!!!}
For i:=1 To CTrmNotTrm Do{!!!}
If MatrixPrecede[j,i]=4 Then Error:=True;
WrtSymbol(i,j+2,MatrixPrecede[j,i]);
If Error Then
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);
OpenWindow(20,12,60,17,3,' Âíèìàíèå ',True);
WriteLn('Ìàòðèöà ïðåäøåñòâîâàíèÿ ñîäåðæèò îøèáêè');
Write(' Ïîñòðîåíèå ôóíêöèè ïðåäøåñòâîâàíèÿ ');
Write(' íåâîçìîæíî');
Attention(363,243);
ReadKey;
LoadWindow(GraphCooX(20),GraphCooY(12),size,pic);
{îñíîâíàÿ ïðîãðàììà}
Init;
InitText;
If InputText Then
Check;
SearchLR;
Matrix;
ClearBuf;
GraphWriteOff;
CloseGraph;
End.
1. Ãðèñ Ä. Êîíñòðóèðîâàíèå êîìïèëÿòîðîâ äëÿ öèôðîâûõ âû÷èñëèòåëüíûõ ìàøèí. – Ì.: Ìèð, 1975.
2. Øàìàøîâ Ì.À. Îñíîâíûå ñòðóêòóðû äàííûõ è àëãîðèòìû êîìïèëÿöèè. – Ñàìàðà: Óíèâåðñèòåò Íàÿíîâîé, 1999.
3. Øàìàøîâ Ì.À. Òåîðèÿ ôîðìàëüíûõ ÿçûêîâ. Ãðàììàòèêè è àâòîìàòû. – Ñàìàðà: Óíèâåðñèòåò Íàÿíîâîé, 1996.
4. Èíòåðíåò ñàéò. - WWW.CodeNet.ru
Ñòðàíèöû: 1, 2, 3, 4, 5