If s='' Then
Goto New;
LineS:{íîâàÿ ñòðîêà}
GotoXY(1,10);Write(s+' Äëèíà àíàëèç.ñòðîêè ',Length(s),' '+#13#10,'y=',y,' âñåãî ñòðîê ',Cline);
Blank;
If not (s[i]='<') Then
Begin
Error(1);
End
Else
inc(i);
If not notTerminal(term) Then
Error(4);
Begin{åñòü íåòåðìèíàë}
If not (s[i]='>') Then
Error(2);
Else{çàïèñûâàåì íåòåðìèíàë}
NotT.Name:='<'+term+'>';
If Search(NotTerminalL,NotT)>0 Then
Begin{ìíîãîîïðåäåëåííûé}
Error(9);
End;
If Search(Trm_NotTrm,NotT)=0 Then
Complete(Trm_NotTrm,NotT);{â îáùèé ñïèñîê òåìèíàëîâ&íåòåðìèíàëîâ}
inc(CTrmNotTrm);
Complete(NotTerminalL,NotT);{ëåâ. ÷àñòü}
inc(CTerm);
If not (Copy(s,i,2)=':=') Then
Error(3);
Begin{åñòü :=}
inc(i,2);
notTerminalOrTerminal:{ïîñëå := îáÿçàòåëüíûé òåðìèíàë èëè íåòåðìèíàë}
If s[i]='<' Then{íåòåðìèíàë}
If notTerminal(term) Then
If s[i]='>' Then{çàïèñûâàåì íåòåðìèíàë}
Complete(NotTerminalS,NotT);
Goto OrS;{ìîæåò áûòü çíàê ÈËÈ}
Error(2);{íåò >}
Error(4);{íåò íåòåðìèíàëà, íî < åñòü}
Else{òåðìèíàë}
If Terminal(term) Then{çàïèñûâàåì òåðìèíàë}
NotT.Name:=term;
Goto OrS;
Error(8);{íåò íåòåðìèíàëà èëè òåðìèíàëà}
OrS: If i>Len Then Goto Gluk;{îáõîäèì ãëþê}
If s[i]='|' Then{çíàê ÈËÈ}
Goto notTerminalOrTerminal
Else{çíàêà ÈËÈ íåò}
If i>Len Then{êîíåö ñòðîêè ?}
Gluk: If y<CLine Then{äîøëè äî êîíöà ñòðîêè}
{ñëåäóþù. ñòð}
inc(y);
posStr(y,s);
If s='' Then Goto EndS;
i:=1;
Goto LineS;
Else{êîíåö ôàéëà}
Goto EndS
Else Goto notTerminalOrTerminal;{çíàêà ÈËÈ íåò}
EndS:
{ïðîâåðêà íåòåðìèíàëîâ}
tmp:=NotTerminalL^.Next;{ïðîïóñêàåì ïåðâûé}
exist:=True;
y:=2;
While (tmp<>Nil) and Exist Do
NotT:=tmp^;
Exist:=Search(NotTerminalS,NotT)>0;
tmp:=tmp^.Next;
dec(y);
While (i<=y) Do
Begin{ïîçèöèàíèðóåì íà íóæíóþ ñòðîêó}
{â s ñòðîêà ñ îøèáêîé}
If not Exist Then{íåèñïîëüçóåìûé íåòåðìèíàë}
Error(7);
{----------------}
tmp:=NotTerminalS;
Exist:=Search(NotTerminalL,NotT)>0;
If not Exist Then{íåîïðåäåëåííûé íåòåðìèíàë}
y:=0;
Ex:=False;
While not Ex Do
PosStr(y,s);{â s ñòðîêà ñ îøèáêîé}
i:=Pos(NotT.name,s);
Ex:=i>0;
Error(6);
Window(5,21,59,25);
TextColor(15);
TextBackGround(1);
WriteLN(Errors[0]);
readkey;
Procedure SearchLR;
Function SearchInBlock(n:Byte;l:NotTerm;inf:List):Byte;
Var j:Byte;
Ex:Boolean;
If l<>Nil Then
j:=1;
While (l<>Nil) and (n<>j) Do
If l^.Name=#0 Then inc(j);
l:=l^.Next;
While (l<>nil) and (l^.Name<>inf.Name) and Not Ex Do
inc(j);
If l^.Name=#0 Then Ex:=True;
l:=l^.next;
If (l=Nil) or Ex Then SearchInBlock:=0
Else SearchInBlock:=j;
Procedure InsListInBlock(n:Byte; l:NotTerm;x,d:List);
Var q:NotTerm;
j:Byte;
If l=Nil Then WriteLN('Âíèìàíèå! Âíóòðåííÿÿ îøèáêà 03')
While (l<>Nil) and (l^.Name<>x.Name) Do
new(q);
q^.Name:=d.Name;
q^.Next:=l^.Next;
l^.Next:=q;
Procedure Add_(ListLR:NotTerm);
Var tmp,p:NotTerm;
tmp2:NotTerm;
tmpName:Str10;
y,j:Byte;
inf:List;
inf2:List;
y:=1;
tmp:=ListLR;{ñïèñîê ñ ðàçäåëèòåëÿìè}
p:=tmp;
Repeat
{èùåì íåòåðìèíàë (â ëåâûõ èëè ïðàâûõ)}
tmp:=p;
tmp2:=NotTerminalL;
While (tmp<>Nil) and (Pos('<',tmp^.Name)<>1) Do
If tmp^.Name=#0 Then inc(y);
If tmp=Nil Then p:=Nil
Else If tmp^.Next<>Nil Then
p:=tmp^.Next{ñîõðàíÿåì ïîçèöèþ óêàçàòåëü íà ñëåäóþùèé}
Else p:=Nil;
tmpName:=tmp^.Name;
{èùåì tmpName â ïðàâûõ èëè ëåâûõ}
If tmp<>Nil Then Seek(tmpName,ListLR,tmp);
{tmp óêàçûâàåò íà ýëåìåíò ñ êîòîðîãî íóæíî íà÷àòü äîáàâëÿòü}
inf2.Name:=tmpName;
While (tmp<>Nil) and (tmp^.Name<>#0) Do
inf.Name:=tmp^.Name;{!!! íóæíî ïðîâåðèòü íà ïîâòîðÿþùèåñÿ !!!}
If SearchInBlock(y,ListLR,inf)=0 Then
InsListInBlock(y,ListLR,inf2,inf);
Until p=Nil;
Var tmp:List;
term:String;
Label More,Next;
{ïðåäïîëàãàåì ÷òî ãðàììàòèêà íå ñîäåðæèò îøèáîê}
{àíàëèç ãðàììàòèêè áåç îòñëåæèâàíèÿ îøèáîê}
PosStr(y,s);
i:=Pos('=',S)+1;{i ñòàâèì ïîñëå :=}
More:Blank;
If s[i]='<' Then
Terminal(term);
tmp.Name:='<'+term+'>';
If (SearchInBlock(y,LTN,tmp)=0) and (term>'') Then
Complete(LTN,tmp);{äîáàâëÿåì ëåâûé}
tmp.Name:=term;
If (i-1)=Len Then òîëüêî îäèí òåðìèíàë
Complete(RTN,tmp);
If i>Len Then Goto Next;{ïîñëåäíèé â ñòðîêå áûë òåðìèíàë}
While (i<Len) and (S[i+1]<>'|') Do inc(i);{äî êîíöà ïðàâèëà}
If s[i]='>' Then {ïîñëåäíèé â ïðàâèëå íåòåðìèíàë}
Ñòðàíèöû: 1, 2, 3, 4, 5