Ðåôåðàòû. Ïîñòðîåíèå ôóíêöèè ïðåäøåñòâîâàíèÿ ïî çàäàííîé ÊÑ-ãðàììàòèêå

  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);

      Goto New;

    End

  Else

    Begin

      inc(i);

      Blank;

      If not notTerminal(term) Then

        Begin

          Error(4);

          Goto New;

        End

      Else

        Begin{åñòü íåòåðìèíàë}

          Blank;

          If not (s[i]='>') Then

            Begin

              Error(2);

              Goto New;

            End

          Else{çàïèñûâàåì íåòåðìèíàë}

            Begin

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

              If Search(NotTerminalL,NotT)>0 Then

                Begin{ìíîãîîïðåäåëåííûé}

                  Error(9);

                  Goto New;

                End;

              If Search(Trm_NotTrm,NotT)=0 Then

                Begin

                  Complete(Trm_NotTrm,NotT);{â îáùèé ñïèñîê òåìèíàëîâ&íåòåðìèíàëîâ}

                  inc(CTrmNotTrm);

                End;

              Complete(NotTerminalL,NotT);{ëåâ. ÷àñòü}

              inc(CTerm);

              inc(i);

              Blank;

              If not (Copy(s,i,2)=':=') Then

                Begin

                  Error(3);

                  Goto New;

                End

              Else

                Begin{åñòü :=}

                  inc(i,2);

notTerminalOrTerminal:{ïîñëå := îáÿçàòåëüíûé òåðìèíàë èëè íåòåðìèíàë}

                  Blank;

                  If s[i]='<' Then{íåòåðìèíàë}

                    Begin

                      inc(i);

                      Blank;

                      If notTerminal(term) Then

                        Begin{åñòü íåòåðìèíàë}

                          Blank;

                          If s[i]='>' Then{çàïèñûâàåì íåòåðìèíàë}

                            Begin

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

                              Complete(NotTerminalS,NotT);

                              If Search(Trm_NotTrm,NotT)=0 Then

                              Begin

                                Complete(Trm_NotTrm,NotT);{â îáùèé ñïèñîê òåìèíàëîâ&íåòåðìèíàëîâ}

                                inc(CTrmNotTrm);

                              End;

                              inc(i);

                              Blank;

                              Goto OrS;{ìîæåò áûòü çíàê ÈËÈ}

                            End

                          Else

                            Begin

                              Error(2);{íåò >}

                              Goto New;

                            End

                        End

                      Else

                        Begin

                          Error(4);{íåò íåòåðìèíàëà, íî < åñòü}

                          Goto New;

                        End

                     End

                  Else{òåðìèíàë}

                    If Terminal(term) Then{çàïèñûâàåì òåðìèíàë}

                      Begin

                        NotT.Name:=term;

                        If Search(Trm_NotTrm,NotT)=0 Then

                        Begin

                          Complete(Trm_NotTrm,NotT);{â îáùèé ñïèñîê òåìèíàëîâ&íåòåðìèíàëîâ}

                          inc(CTrmNotTrm);

                        End;

                        Blank;

                        Goto OrS;

                      End

                    Else

                      Begin

                        Error(8);{íåò íåòåðìèíàëà èëè òåðìèíàëà}

                        Goto New;

                      End;

OrS:             If i>Len Then Goto Gluk;{îáõîäèì ãëþê}

                 If s[i]='|' Then{çíàê ÈËÈ}

                    Begin

                      inc(i);

                      Goto notTerminalOrTerminal

                     End

                 Else{çíàêà ÈËÈ íåò}

                    Begin

                      Blank;

                      If i>Len Then{êîíåö ñòðîêè ?}

Gluk:                   If y<CLine Then{äîøëè äî êîíöà ñòðîêè}

                           Begin

                             {ñëåäóþù. ñòð}

                             inc(y);

                             posStr(y,s);

                             If s='' Then Goto EndS;

                             i:=1;

                             Goto LineS;

                           End

                        Else{êîíåö ôàéëà}

                          Goto EndS

                      Else Goto notTerminalOrTerminal;{çíàêà ÈËÈ íåò}

                    End;

                End;

            End;

        End;

    End;

EndS:

{ïðîâåðêà íåòåðìèíàëîâ}

tmp:=NotTerminalL^.Next;{ïðîïóñêàåì ïåðâûé}

exist:=True;

y:=2;

While (tmp<>Nil) and Exist Do

  Begin

    NotT:=tmp^;

    Exist:=Search(NotTerminalS,NotT)>0;

    tmp:=tmp^.Next;

    inc(y);

  End;

dec(y);

i:=1;

While  (i<=y) Do

  Begin{ïîçèöèàíèðóåì íà íóæíóþ ñòðîêó}

    {â s ñòðîêà ñ îøèáêîé}

    posStr(y,s);

    inc(i);

  End;

If not Exist Then{íåèñïîëüçóåìûé íåòåðìèíàë}

  Begin

    i:=1;

    Error(7);

    Goto New;

  End;

{----------------}

tmp:=NotTerminalS;

exist:=True;

While (tmp<>Nil) and Exist Do

  Begin

    NotT:=tmp^;

    Exist:=Search(NotTerminalL,NotT)>0;

    tmp:=tmp^.Next;

  End;

If not Exist Then{íåîïðåäåëåííûé íåòåðìèíàë}

  Begin

    i:=1;

    y:=0;

    Ex:=False;

    While not Ex Do

      Begin{ïîçèöèàíèðóåì íà íóæíóþ ñòðîêó}

        inc(y);

        PosStr(y,s);{â s ñòðîêà ñ îøèáêîé}

        i:=Pos(NotT.name,s);

        Ex:=i>0;

      End;

    Error(6);

    Goto New;

  End;

Window(5,21,59,25);

TextColor(15);

TextBackGround(1);

WriteLN(Errors[0]);

readkey;

End;

Procedure SearchLR;

Function SearchInBlock(n:Byte;l:NotTerm;inf:List):Byte;

Var j:Byte;

    Ex:Boolean;

Begin

  If l<>Nil Then

    Begin

      j:=1;

      While (l<>Nil) and (n<>j) Do

        Begin

          If l^.Name=#0 Then inc(j);

          l:=l^.Next;

        End;

      Ex:=False;

      While (l<>nil) and (l^.Name<>inf.Name) and Not Ex Do

        Begin

          inc(j);

          If l^.Name=#0 Then Ex:=True;

          l:=l^.next;

        End;

    End;

  If (l=Nil) or Ex Then SearchInBlock:=0

  Else SearchInBlock:=j;

End;

Procedure InsListInBlock(n:Byte; l:NotTerm;x,d:List);

Var q:NotTerm;

    j:Byte;

Begin

  If l=Nil Then WriteLN('Âíèìàíèå! Âíóòðåííÿÿ îøèáêà 03')

  Else

    Begin

      j:=1;

      While (l<>Nil) and (n<>j) Do

        Begin

          If l^.Name=#0 Then inc(j);

          l:=l^.Next;

        End;

      While (l<>Nil) and (l^.Name<>x.Name) Do

        l:=l^.Next;

      If l<>Nil Then

        Begin

          new(q);

          q^.Name:=d.Name;

          q^.Next:=l^.Next;

          l^.Next:=q;

        End;

     End;

End;

Procedure Add_(ListLR:NotTerm);

Var tmp,p:NotTerm;

    tmp2:NotTerm;

    tmpName:Str10;

    y,j:Byte;

    inf:List;

    inf2:List;

Begin

  y:=1;

  tmp:=ListLR;{ñïèñîê ñ ðàçäåëèòåëÿìè}

  p:=tmp;

Repeat

  {èùåì íåòåðìèíàë (â ëåâûõ èëè ïðàâûõ)}

  tmp:=p;

  tmp2:=NotTerminalL;

  While (tmp<>Nil) and (Pos('<',tmp^.Name)<>1) Do

    Begin

      If tmp^.Name=#0 Then inc(y);

      tmp:=tmp^.Next;

    End;

  If tmp=Nil Then p:=Nil

  Else If tmp^.Next<>Nil Then

    p:=tmp^.Next{ñîõðàíÿåì ïîçèöèþ óêàçàòåëü íà ñëåäóþùèé}

  Else p:=Nil;

  tmpName:=tmp^.Name;

  i:=1;

  {èùåì tmpName â ïðàâûõ èëè ëåâûõ}

  If tmp<>Nil Then Seek(tmpName,ListLR,tmp);

  {tmp óêàçûâàåò íà ýëåìåíò ñ êîòîðîãî íóæíî íà÷àòü äîáàâëÿòü}

  inf2.Name:=tmpName;

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

    Begin

      inf.Name:=tmp^.Name;{!!! íóæíî ïðîâåðèòü íà ïîâòîðÿþùèåñÿ !!!}

      If SearchInBlock(y,ListLR,inf)=0 Then

        InsListInBlock(y,ListLR,inf2,inf);

      tmp:=tmp^.Next;

    End;

Until p=Nil;

End;

Var tmp:List;

    term:String;

Label More,Next;

Begin

   {ïðåäïîëàãàåì ÷òî ãðàììàòèêà íå ñîäåðæèò îøèáîê}

   {àíàëèç ãðàììàòèêè áåç îòñëåæèâàíèÿ îøèáîê}

   y:=1;

   i:=1;

   Repeat

     PosStr(y,s);

     Blank;

     i:=Pos('=',S)+1;{i ñòàâèì ïîñëå :=}

More:Blank;

     If s[i]='<' Then

       Begin

         inc(i);

         Blank;

         Terminal(term);

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

         If (SearchInBlock(y,LTN,tmp)=0) and (term>'') Then

         Complete(LTN,tmp);{äîáàâëÿåì ëåâûé}

         Blank;

         inc(i);

       End

     Else

       Begin

         Terminal(term);

         tmp.Name:=term;

         If (SearchInBlock(y,LTN,tmp)=0) and (term>'') Then

         Complete(LTN,tmp);{äîáàâëÿåì ëåâûé}

         If (i-1)=Len Then òîëüêî îäèí òåðìèíàë

            Complete(RTN,tmp);

       End;

     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



2012 © Âñå ïðàâà çàùèùåíû
Ïðè èñïîëüçîâàíèè ìàòåðèàëîâ àêòèâíàÿ ññûëêà íà èñòî÷íèê îáÿçàòåëüíà.