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

       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

           Begin

             inc(i);

             Goto More;

           End;

       End

     Else{ïîñëåäíèé â ïðàâèëå òåðìèíàë}

       Begin

         While (i>1) and not((s[i]=' ') or (s[i]='|') or (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);{äîáàâëÿåì ïðàâûé}

         If s[i]='|' Then

           Begin

             inc(i);

             Goto More;

           End;

       End;

     If i<Len Then{ïðîøëè íå âñþ ñòðîêó}

       Goto More;

next:inc(y);

     tmp.Name:=#0;{ïîñëå êàæäîé ñòðîêè ñòàâèì ðàçäåëèòåëü}

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

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

   Until y>CLine;

{ïîñëå öèêëà ïîëó÷èëè "ïðåäâàðèòåëüíûå" ëåâûå è ïðàâûå, èõ åùå íàäî äîïîëíèòü}

For y:=1 To 10 Do

  Begin

   Add_(LTn);

   Add_(RTn);

  End;

{ïîëó÷èëè ëåâûå è ïðàâûå, ðàçäåëåííûå #0}

End;

Procedure Matrix;

Procedure Precede;

Label More,Next;

Var mi,mj:Byte;

    tmp:List;

    p:NotTerm;

    term,term2:String;

    Ex:Boolean;

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+'>';

         term2:=tmp.Name;

         Blank;

         inc(i);

         mi:=Search(Trm_notTrm,tmp);

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

           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


Ñòðàíèöû: 1, 2, 3, 4, 5



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