Скачиваний:
23
Добавлен:
02.05.2014
Размер:
29 Кб
Скачать
unit Part2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls, ComCtrls;

type
  TForm2 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Button1: TButton;
    Memo1: TMemo;
    TabSheet2: TTabSheet;
    StringGrid1: TStringGrid;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    TabSheet3: TTabSheet;
    Label3: TLabel;
    TreeView1: TTreeView;
    Button3: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Mymemo(Sender: TObject);
  private
    { Private declarations }
  public
  F:TextFile
    { Public declarations }
  end;
const
{Описание матрицы предшествования}
     PredMatrix:array [1..26,1..26] of char=
(      {pr  end. ;  if then els enf beg end  do wle  a  :=  or  and not  <   >   =   (   )   -   +   *   /   !}
{prog} (' ','=','<','<',' ',' ',' ','<',' ','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{end.} (' ',' ','>',' ',' ',' ','>',' ','>',' ',' ','>',' ',' ',' ',' ',' ',' ',' ',' ','>',' ',' ',' ',' ','>'),
{;}    (' ','>','>','<',' ',' ',' ','<','>','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{if}   (' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ','<',' ','<','<','<','<','<','<','<',' ','<','<','<','<',' '),
{then} (' ',' ',' ','<',' ','=','=','<',' ','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{else} (' ',' ',' ','<',' ',' ','=','<',' ','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{endif}(' ','>','>',' ',' ','>','>',' ','>','<','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{begin}(' ',' ','<','<',' ',' ',' ','<','=','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{end}  (' ','>','>',' ',' ','>','>',' ','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{do}   (' ',' ',' ','<',' ',' ',' ','<',' ','<','=','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{while}(' ','>','>',' ',' ',' ','>',' ','>',' ',' ','<',' ',' ',' ',' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' '),
{a}    (' ','>','>',' ','>','>','>',' ','>','>','>',' ','=','>','>','>','>','>','>',' ','>','>','>','>','>',' '),
{:=}   (' ','>','>',' ',' ','>','>',' ','>','>',' ','<',' ',' ',' ',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{or}   (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ','<',' ','>','<','<','<','<','<','<','>','<','<','<','<',' '),
{and}  (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ','<',' ','>','<','<','<','<','<','<','>','<','<','<','<',' '),
{not}  (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ','<',' ','>','<','<','<','<','<','<','>','<','<','<','<',' '),
{<}    (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ','<',' ','>','<',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{>}    (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ','<',' ','>','<',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{=}    (' ',' ',' ',' ','>',' ',' ',' ',' ',' ',' ','<',' ','>','<',' ',' ',' ',' ','<','>','<','<','<','<',' '),
{(}    (' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<',' ','<','<','<','<','<','<','<','=','<','<','<','<',' '),
{)}    (' ','>','>',' ','>','>','>',' ','>','>','>',' ',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{-}    (' ','>','>',' ','>','>','>',' ','>','>','>','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{+}    (' ','>','>',' ','>','>','>',' ','>','>','>','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{*}    (' ','>','>',' ','>','>','>',' ','>','>','>','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{/}    (' ','>','>',' ','>','>','>',' ','>','>','>','<',' ','>','>',' ','>','>','>',' ','>','>','>','>','>',' '),
{!}    ('<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '));
{Описание правил грамматики}
          grammar:array [1..27] of string=
          ('programEend.','E','E;E','E;','ifBthenEelseEendif','ifBthenEendif','beginEend','doEwhile(B)','E','a:=E',
          'BorB','B','BandB','B','notB','B','E<E','E>E','E=E','(B)','E-E','E+E','E*E','E/E','E','(E)','a');
          term:array [1..26] of string=
          ('program','end.',';','if','then','else','endif','begin','end','do','while','a',':=','or','and','not','<','>','=','(',')','-','+','*','/','!');
          notterm:array [1..27] of char=
          ('E','E','E','E','E','E','E','E','E','E','B','B','B','B','B','B',
          'B','B','B','B','E','E','E','E','E','E','E');
          CanonO:array [1..27,1..7] of string=
          (('program','E','end.','','','',''),
          ('E','','','','','',''),
          ('E',';','E','','','',''),
          ('E',';','','','','',''),
          ('if','B','then','E','else','E','endif'),
          ('if','B','then','E','endif','',''),
          ('begin','E','end','','','',''),
          ('do','E','while','(','B',')',''),
          ('E','','','','','',''),
          ('a',':=','E','','','',''),
          ('B','or','B','','','',''),
          ('B','','','','','',''),
          ('B','and','B','','','',''),
          ('B','','','','','',''),
          ('not','B','','','','',''),
          ('B','','','','','',''),
          ('E','<','E','','','',''),
          ('E','>','E','','','',''),
          ('E','=','E','','','',''),
          ('(','B',')','','','',''),
          ('E','-','E','','','',''),
          ('E','+','E','','','',''),
          ('E','*','E','','','',''),
          ('E','/','E','','','',''),
          ('E','','','','','',''),
          ('(','E',')','','','',''),
          ('a','','','','','',''));
var
  Form2: TForm2;

implementation
 function IndMatrix(SymS:String):integer;
 var i:integer;
begin
indMatrix:=0;
if term[1]=SymS then IndMatrix:=1;
for i:=1 to 26 do
if term[i]=SymS then IndMatrix:=i;
end;
function inArray(myS:String;A:Array of string;N:integer):boolean;
var i:integer;
begin
inArray:=False;
if MyS='program' then inArray:=true;
for i:=1 to N do
if myS=A[i] then begin inArray:=true end;
end;

function NomRul(myS:String):integer;
var i:integer;
begin
NomRul:=0;
if (myS=grammar[1])then NomRul:=1;
for i:=1 to 27 do
if grammar[i]=myS then NomRul:=i;
end;
function findnt(myS:String):string;
begin
findnt:='';
findnt:=notterm[nomRul(myS)]
end;
{$R *.DFM}

{**************************ЗАГРУЗКА ФАЙЛА*******************}
procedure TForm2.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
                       begin
                        Memo1.Lines.LoadFromFile(OpenDialog1.FileName)
                       end
                       else
                       begin
                       ShowMessage('Вы отказались открыть файл');
                       Exit
                       end;
assignFile(F,OpenDialog1.Filename);
reset(F)
end;
{***************ЛЕКСИЧЕСКИЙ АНАЛИЗАТОР*******************************}
procedure TForm2.Button2Click(Sender: TObject);
Type
    TAutoState = ( AUTO_H, AUTO_A, AUTO_B, AUTO_C, AUTO_D, AUTO_F,
    AUTO_E,AUTO_G, AUTO_I, AUTO_J,AUTO_K, AUTO_L,AUTO_M,
    AUTO_N,AUTO_O, AUTO_P, AUTO_Q, AUTO_R, AUTO_T, AUTO_U, AUTO_V, AUTO_W,
    AUTO_X, AUTO_Y,AUTO_Z,AUTO_AA,AUTO_AB,AUTO_AC,AUTO_AD,AUTO_AE,AUTO_AI,
    AUTO_AH,AUTO_SRAVN,AUTO_WHILE, AUTO_DO,AUTO_IDENT, AUTO_PR,AUTO_BEGIN,
    AUTO_END1,AUTO_END2, AUTO_IF, AUTO_THEN,AUTO_ELSE, AUTO_PROGRAM,AUTO_ENDIF,
    AUTO_CONST, AUTO_COMMENT,AUTO_ARIPH, AUTO_DOP,AUTO_ER, AUTO_S,AUTO_AND,
    AUTO_OR,AUTO_NOT);
label MYGRaph;
var
   s,S1,S2:String;
   i,Address,K,str:integer;
   iState:TAutoState;
begin
iState:=AUTO_H;
S1:='';
Address:=1;
With StringGrid1 do
begin
cells[0,0]:='№';
cells[1,0]:='Значение';
cells[2,0]:='Тип лексемы';
end;
str:=0;
While not EOF(F) do
begin
readln(F,S);
str:=Str+1;
S:=S+' ';
for i:=1 to Length(S) do
         begin
         K:=0;
MYGRaph: case iState of
         AUTO_H:
                case S[i] of
                 ';','(',')': begin S1:=S1+S[i];K:=-1;S2:='Разделительный символ';iState:=AUTO_S end;
                 ':': begin S1:=S1+S[i];iState:=AUTO_AC end;
                 '>','<','=':begin S1:=S1+S[i];S2:='Сравнение';iState:=AUTO_SRAVN end;
                 '+','-':begin S1:=S1+S[i];S2:='Арифметическая операция';iState:=AUTO_ARIPH end;
                 '*','/':begin S1:=s1+S[i];S2:='Дополнительная операция';iState:=AUTO_DOP end;
                 'i','I':begin S1:=S1+S[i];iState:=AUTO_A end;
                 't','T':begin S1:=S1+S[i];iState:=AUTO_B end;
                 'e','E':begin S1:=S1+S[i];iState:=AUTO_E end;
                 'b','B':begin S1:=S1+S[i];iState:=AUTO_AH end;
                 'd','D':begin S1:=S1+S[i];iState:=AUTO_AD end;
                 'p','P':begin S1:=S1+S[i];iState:=AUTO_M end;
                 'w','W':begin S1:=S1+S[i];iState:=AUTO_T end;
                 'a','A':begin S1:=S1+S[i];iState:=AUTO_X end;
                 'o','O':begin S1:=S1+S[i];iState:=AUTO_Z end;
                 'n','N':begin S1:=S1+S[i];iState:=AUTO_AA end;
                 '{':begin S1:=S1+S[i];iState:=AUTO_COMMENT end;
                 'c','f'..'h','j'..'m','r','s','u','v','x'..'z','C','F'..'H','J'..'M','R','S','U','V','X'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                 '0':begin S1:=S1+S[i];iState:=AUTO_AE end;
                 '1'..'9':begin S1:=S1+S[i];S2:='Константа';iState:=AUTO_CONST end;
                 ' ':iState:=AUTO_H;
                else iState:=AUTO_ER;
                end;
         AUTO_A:
                case S[i] of
                'F','f':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_IF end;
                'a'..'e','g'..'z','0'..'9','A'..'E','G'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_B:
                case S[i] of
                'h','H':begin S1:=S1+S[i];iState:=AUTO_C end;
                'a'..'g','i'..'z','0'..'9','A'..'G','I'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;

         AUTO_C:
                case S[i] of
                'e','E':begin S1:=S1+S[i];iState:=AUTO_D end;
                'a'..'d','f'..'z','0'..'9','A'..'D','F'..'Z': begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_D:
                case S[i] of
                'n','N':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_THEN end;
                'a'..'m','o'..'z','0'..'9','A'..'M','O'..'Z': begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_E:
                case S[i] of
                'l','L':begin S1:=S1+S[i];iState:=AUTO_F end;
                'n','N':begin S1:=S1+S[i];iState:=AUTO_L end;
                'a'..'k','m','o'..'z','0'..'9','A'..'K','M','O'..'Z': begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_F:
                case S[i] of
                's','S':begin S1:=S1+S[i];iState:=AUTO_G end;
                'a'..'r','t'..'z','0'..'9','A'..'R','T'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_G:
                case S[i] of
                'e','E':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_ELSE end;
                'a'..'d','f'..'z','0'..'9','A'..'D','F'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_AH:
                case S[i] of
                'e','E':begin S1:=S1+S[i];iState:=AUTO_I end;
                'a'..'d','f'..'z','0'..'9','A'..'D','F'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_I:
                case S[i] of
                'g','G':begin S1:=S1+S[i];iState:=AUTO_J end;
                'a'..'f','h'..'z','0'..'9','A'..'F','H'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_J:
                case S[i] of
                'i','I':begin S1:=S1+S[i];iState:=AUTO_K end;
                'a'..'h','j'..'z','0'..'9','A'..'H','J'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_K:
                case S[i] of
                'n','N':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_BEGIN end;
                'a'..'m','o'..'z','0'..'9','A'..'M','O'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_L:
                case S[i] of
                'd','D':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_END1 end;
                'a'..'c','e'..'z','0'..'9','A'..'C','E'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_M:
                case S[i] of
                'r','R':begin S1:=S1+S[i];iState:=AUTO_N end;
                'a'..'q','s'..'z','0'..'9','A'..'Q','S'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_N:
                case S[i] of
                'o','O':begin S1:=S1+S[i];iState:=AUTO_O end;
                'a'..'n','p'..'z','0'..'9','A'..'N','P'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_O:
                case S[i] of
                'g','G':begin S1:=S1+S[i];iState:=AUTO_P end;
                'a'..'f','h'..'z','0'..'9','A'..'F','H'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_P:
                case S[i] of
                'r','R':begin S1:=S1+S[i];iState:=AUTO_Q end;
                'a'..'q','s'..'z','0'..'9','A'..'Q','S'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_Q:
                case S[i] of
                'a','A':begin S1:=S1+S[i];iState:=AUTO_R end;
                'b'..'z','0'..'9','B'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_R:
                case S[i] of
                'm','M':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_PROGRAM end;
                'a'..'l','n'..'z','0'..'9','A'..'L','N'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_T:
                case S[i] of
                'h','H':begin S1:=S1+S[i];iState:=AUTO_U end;
                'a'..'g','i'..'z','0'..'9','A'..'G','I'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_U:
                case S[i] of
                'i','I':begin S1:=S1+S[i];iState:=AUTO_V end;
                'a'..'h','j'..'z','0'..'9','A'..'H','J'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_V:
                case S[i] of
                'l','L':begin S1:=S1+S[i];iState:=AUTO_W end;
                'a'..'k','m'..'z','0'..'9','A'..'K','M'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_W:
                case S[i] of
                'e','E':begin S1:=S1+S[i];S2:='Условный оператор';iState:=AUTO_WHILE end;
                'a'..'d','f'..'z','0'..'9','A'..'D','F'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_X:
                case S[i] of
                'n','N':begin S1:=S1+S[i];iState:=AUTO_Y end;
                'a'..'m','o'..'z','0'..'9','A'..'M','O'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_Y:
                case S[i] of
                'd','D':begin S1:=S1+S[i];s2:='Логическая операция';iState:=AUTO_AND end;
                'a'..'c','e'..'z','0'..'9','A'..'C','E'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_Z:
                case S[i] of
                'r','R':begin S1:=S1+S[i];S2:='Логическая операция';iState:=AUTO_OR end;
                'a'..'q','s'..'z','0'..'9','A'..'Q','S'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_AA:
                case S[i] of
                'o','O':begin S1:=S1+S[i];iState:=AUTO_AB end;
                'a'..'n','p'..'z','0'..'9','A'..'N','P'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_AB:
                case S[i] of
                't','T':begin S1:=S1+S[i];S2:='Логическая операция';iState:=AUTO_NOT end;
                'a'..'s','u'..'z','0'..'9','A'..'S','U'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_AC:
                case S[i] of
                '=':begin S1:=S1+S[i];S2:='Присваивание'; iState:=AUTO_PR end
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_AD:
                case S[i] of
                'o','O':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_DO end;
                'a'..'n','p'..'z','0'..'9','A'..'N','P'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_AE:
                 case S[i] of
                 'a'..'f','A'..'F','1'..'9':begin S1:=S1+S[i];S2:='Константа';iState:=AUTO_CONST end;
                 else iState:=AUTO_ER;
                 END;
         AUTO_AI:
                case S[i] of
                'f','F':begin S1:=S1+S[i];S2:='Служебное слово';iState:=AUTO_ENDIF end;
                'a'..'e','g'..'z','0'..'9','A'..'E','G'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                else begin S2:='Идентификатор';iState:=AUTO_S end
                end;
         AUTO_PR:iState:=AUTO_S;{}
         AUTO_SRAVN:iState:=AUTO_S;{}
         AUTO_ARIPH:iState:=AUTO_S;{}
         AUTO_DOP:iState:=AUTO_S;{}
         AUTO_WHILE:
                  case S[i] of
                  'a'..'z','A'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_DO:
                 case S[i] of
                 'a'..'z','0'..'9','A'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end;
                 ' ':iState:=AUTO_S;{}
                 else iState:=AUTO_S;
                 end;
         AUTO_BEGIN:
                  case S[i] of
                  'a'..'z','A'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_IF:
                  case S[i] of
                  'a'..'z','A'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_THEN:
                  case S[i] of
                  'a'..'z','A'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_ELSE:
                  case S[i] of
                  'a'..'z','A'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_PROGRAM:
                  case S[i] of
                  'a'..'z','A'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_ENDIF:
                  case S[i] of
                  'a'..'z','A'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_END1:
                  case S[i] of
                  '.':begin S1:=S1+S[i];S2:='Конец программы';iState:=AUTO_END2 end;
                  'i','I':begin S1:=S1+S[i];iState:=AUTO_AI end;
                  'a'..'h','j'..'z','A'..'H','J'..'Z','0'..'9':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                  else iState:=AUTO_S; {}
                  end;
         AUTO_END2:
                  case S[i] of
                  ' ':iState:=AUTO_S
                  else iState:=AUTO_ER; {}
                  end;
         AUTO_IDENT:
                    case S[i] of
                    'a'..'z','0'..'9','A'..'Z':begin S1:=S1+S[i];S2:='Идентификатор';iState:=AUTO_IDENT end
                    else iState:=AUTO_S;{}
                    end;
         AUTO_CONST:
                   case S[i] of
                   '0'..'9','A'..'F','a'..'f':begin S1:=S1+S[i];S2:='Константа';iState:=AUTO_CONST end;
                   'H','h':begin iState:=AUTO_S;K:=-1 end;
                   'g','i'..'z','G','I'..'Z','(':iState:=AUTO_ER;
                   else iState:=AUTO_S
                   end;
         AUTO_COMMENT:
                      case S[i] of
                      '}':begin S1:=S1+S[i];iState:=AUTO_S end;
                      else begin S1:=S1+S[i];K:=-1;S2:='Комментарий';IState:=AUTO_COMMENT end;
                      end;
         AUTO_ER:begin ShowMessage('Ошибка! В строке номер '+InttoStr(str)+' позиция '+InttoStr(i));Exit end;
         end;
         if iState=AUTO_S then begin
                      StringGrid1.Cells[0,Address]:=InttoStr(Address);
                      StringGrid1.Cells[1,Address]:=S1;
                      StringGrid1.Cells[2,Address]:=S2;
                      Address:=Address+1;
                      S1:='';
                      iState:=AUTO_H;
                      K:=K+1;
                      if K=1 then goto MYGRaph;

                                end;

         end
end;
CloseFile(F)
end;

{*******************СИНТАКСИЧЕСКИЙ АНАЛИЗАТОР*************************}
procedure TForm2.Button3Click(Sender: TObject);
label Myend,zap;

var inputString,SymbStack:TStringList;{входная строка и стэк соответственно}
    NRow,i,j,verh,k,vetv,n,m:integer;
    gamma,MyinS,syms,tek,cep:String;
    Mycase:char;
    CepofV:array [1..100]of integer;
begin
{формируем входную строку}
inputString:=TStringList.Create;
inputString.Sorted:=False;
Nrow:=1;
with StringGrid1 do
begin
while cells[0,NRow]<>'' do
      begin
      if ((cells[2,NRow]='Константа')or(cells[2,NRow]='Идентификатор')) then
                                                inputString.Add('a')
                                                else
                                                if cells[2,NRow]<>'Комментарий' then
                                                inputString.Add(cells[1,Nrow]);

      NRow:=Nrow+1
      end;
end;
for i:=0 to inputString.Count-1 do MyinS:=MyinS+InputString[i];
Edit1.Text:=MyinS;
if inputString.Count=0 then
                       begin
                       ShowMessage('Таблица лексем или исходный файл не загружены');
                       exit
                       end;
inputString.Add('!');
{Объявляем стэк}
SymbStack:=TStringList.Create;
SymbStack.Sorted:=False;
SymbStack.Add('!');
i:=0;
k:=0;
cep:='';
while i<=inputString.Count-1 do
begin
verh:=SymbStack.Count-1;
syms:=SymbStack[verh];
while (not(inArray(SymbStack[verh],term,26))) do verh:=verh-1;
if (SymbStack[verh]='!') and (inputString[i]='!') then goto MyEnd;
Mycase:=PredMatrix[IndMatrix(SymbStack[verh]),IndMatrix(inputString[i])];
{ShowMessage(SymbStack[verh]+'  '+InputString[i]+'  '+InttoStr(IndMatrix(SymbStack[verh]))+'   '+InttoStr(IndMatrix(inputString[i]))+'  '+MyCase);}
if ((mycase='<')or(mycase='='))then
begin {сдвиг}
             SymbStack.Add(inputString[i]);
             i:=i+1;
end
else
if (mycase='>')
then
begin {свертка}
         gamma:='';
         tek:='';
         for j:=SymbStack.Count-1 downto 0 do
         if not(inArray(SymbStack[j],term,26)) then
                                               begin
                                               gamma:=SymbStack[j]+gamma;
                                               SymbStack.Delete(j)
                                               end
                                               else
                                               if (inArray(SymbStack[j],term,26))and(tek='') then
                                                                                             begin
                                                                                             tek:=SymbStack[j];
                                                                                             gamma:=SymbStack[j]+gamma;
                                                                                             SymbStack.Delete(j)
                                                                                             end
                                               else
                                               if predMatrix[Indmatrix(SymbStack[j]),IndMatrix(tek)]='=' then
                                                                                                         begin
                                                                                                         tek:=SymbStack[j];
                                                                                                         gamma:=SymbStack[j]+gamma;
                                                                                                         SymbStack.Delete(j)
                                                                                                         end
                                               else break;



         if findnt(gamma)<>''
         then
         begin
         SymbStack.Add(findnt(gamma));
         k:=k+1;
         CepofV[k]:=NomRul(gamma);
         {ShowMessage('Цепочка '+gamma+' заменяется на '+findnt(gamma)+' по правилу '+inttostr(Nomrul(gamma)));}
         cep:=inttostr(CepofV[k])+' '+cep;
         end
                                      else
                                      begin {ошибка}
                                      ShowMessage('Ошибка');
                                      exit
                                      end;
         end;
if mycase=' ' then
begin {ошибка}
         ShowMessage('Ошибка на пробел');
        exit;
end;
end;
Myend:Edit2.Text:=cep;
{вывод дерева}
n:=k;
with TreeView1 do
begin
Items.Add(Nil,'E');
vetv:=0;
for k:=n downto 1 do begin
                 m:=Items.Count;
                 if k<n then
                 for i:=m-1 downto 0 do
                 if Items[i].Text=notterm[CepofV[k]] then
                 if Items[i].HasChildren=False then
                 begin
                 vetv:=i;
                 goto zap
                 end;
zap:                 for i:=1 to 7 do
                 if CanonO[CepofV[k],i]<>'' then
                 Items.AddChild(Items[vetv],CanonO[CepofV[k],i])
                  end;
FullExpand
end;
end;

procedure TForm2.Mymemo(Sender: TObject);
begin
Memo1.Lines.Clear
end;

end.
Соседние файлы в папке СПО
  • #
    02.05.20149 Кб23Part1.dcu
  • #
    02.05.20146 Кб23Part1.dfm
  • #
    02.05.201417 Кб23Part1.pas
  • #
    02.05.201425 Кб23Part2.dcu
  • #
    02.05.20142 Кб23Part2.dfm
  • #
    02.05.201429 Кб23Part2.pas
  • #
    02.05.2014323 б24Project1.cfg
  • #
    02.05.2014922 б23Project1.dof
  • #
    02.05.2014188 б23Project1.dpr
  • #
    02.05.20141 Кб24Project1.dsk
  • #
    02.05.2014876 б23Project1.res