Advertisement
Guest User

Auto

a guest
Oct 23rd, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.51 KB | None | 0 0
  1. unit UIfTree;
  2.  
  3. interface
  4.  
  5. uses System.Generics.Collections, UData, SysUtils;
  6.  
  7. type
  8.    TPNode = ^TTreeNode;
  9.    TTreeNode = record
  10.       ThenBranch: TPNode;
  11.       ElseBranch: TPNode;
  12.       Next: TPNode;
  13.    end;
  14.    TTreeMaker = class
  15.    type
  16.       TFunc = procedure of object;
  17.       TStateArr = array [0..6] of TFunc;
  18.    const
  19.       IF_STAT = 0;
  20.       AFTER_IF_STAT = 1;
  21.       BRACKET_STAT = 2;
  22.       ELSE_STAT = 3;
  23.       CASE_STAT = 4;
  24.       EXIT_STAT = 5;
  25.       SEARCHING_STAT = 6;
  26.       NO_BRAC_ELSE_STAT = -1;
  27.    
  28.    public
  29.       constructor Create(CodeBuffer: TTokenArr; Size: Integer);
  30.       destructor Free;
  31.    private
  32.       Buffer: TTokenArr;
  33.       State: Integer;
  34.       ArrIndex: Integer;
  35.       Size: Integer;
  36.       TempNode: TPNode;
  37.       StateStack: TStack<Integer>;
  38.       IfStack: TStack<TPNode>;
  39.       StateArr: TStateArr;
  40.       PHead: TPNode;
  41.       property Head: TPNode read PHead;
  42.       procedure SearchingForIf();
  43.       procedure FindIf();
  44.       procedure CaseStatement();
  45.       procedure AfterIf();
  46.       procedure ClosingBracket();
  47.       procedure AfterElse();
  48.       procedure IgnoreCondition;
  49. //      procedure Finish();
  50. //      const
  51. //         StateArr: array [0..3] of  TFunc = (SearchingForIf(), AfterIf(), ClosingBracket(), AfterElse());
  52.    end;
  53.  
  54. implementation
  55.  
  56. constructor TTreeMaker.Create(CodeBuffer: TTokenArr; Size: Integer);
  57. //var
  58. //  i: Integer;
  59. begin
  60.    Self.Buffer := CodeBuffer;
  61.    Self.Size := Size;
  62.    Self.State := SEARCHING_STAT;
  63.    Self.StateStack := TStack<Integer>.Create;
  64.    Self.IfStack := TStack<TPNode>.Create;
  65.    ArrIndex := 0;
  66.    New(TempNode);
  67.    TempNode^.Next := nil;
  68.    PHead := TempNode;
  69.    StateArr[IF_STAT] := FindIf;
  70.    StateArr[AFTER_IF_STAT] := AfterIf;
  71.    StateArr[BRACKET_STAT] := ClosingBracket;
  72.    StateArr[ELSE_STAT] := AfterElse;
  73.    StateArr[CASE_STAT] := CaseStatement;
  74. //   StateArr[EXIT_STAT] := Finish;
  75.    StateArr[SEARCHING_STAT] := SearchingForIf;
  76.    StateStack.Push(BRACKET_STAT);
  77.    StateArr[State];
  78. end;
  79.  
  80.  
  81. procedure TTreeMaker.IgnoreCondition;
  82. begin
  83.    while AnsiCompareStr(Buffer[ArrIndex], '{') <> 0 do
  84.    begin  
  85.       Inc(ArrIndex);
  86.    end;
  87. end;
  88.  
  89. function IsIfEquals(Arg: string): Boolean;
  90. begin
  91.    if (AnsiCompareStr(Arg, 'if') = 0) or (AnsiCompareStr(Arg, 'for') = 0) or
  92.       (AnsiCompareStr(Arg, 'while') = 0) then
  93.       Result := True
  94.     else
  95.       Result := False;
  96. end;
  97.  
  98. procedure TTreeMaker.SearchingForIf;
  99. begin
  100.    while ArrIndex < Size do
  101.    begin
  102.       if IsIfEquals(Buffer[ArrIndex]) then
  103.       begin
  104.          StateArr[IF_STAT];  
  105.       end;
  106.       Inc(ArrIndex);
  107.    end;
  108.    StateStack.Clear;
  109.    IfStack.Clear;
  110. end;
  111.  
  112. procedure TTreeMaker.FindIf;
  113. var
  114.    Temp: TPNode;
  115. //   TempState: Integer;
  116. begin
  117.    Inc(ArrIndex);
  118.    New(Temp);
  119.    Temp^.ThenBranch := nil;
  120.    Temp^.ElseBranch := nil;
  121.    Temp^.Next := nil;
  122.    IfStack.Push(Temp);
  123.    if StateStack.Count > 0 then
  124.       State := StateStack.Pop;
  125.    case State of
  126.       AFTER_IF_STAT: TempNode.ThenBranch := Temp;
  127.       ELSE_STAT: TempNode.ElseBranch := Temp;
  128.       BRACKET_STAT: TempNode.Next := Temp;
  129.    end;
  130.    TempNode := Temp;
  131.    State := AFTER_IF_STAT;
  132.    StateStack.Push(State);
  133.    if ArrIndex < Size then
  134.       StateArr[State];
  135. end;
  136.  
  137.  
  138. procedure TTreeMaker.AfterIf;
  139. var
  140.    StateNotFound: Boolean;
  141. begin
  142.    StateNotFound := True;
  143.    IgnoreCondition;
  144.    while StateNotFound and (ArrIndex < Size) do
  145.    begin
  146.       if AnsiCompareStr(Buffer[ArrIndex], '}') = 0 then
  147.       begin
  148.          State := BRACKET_STAT;
  149.          StateNotFound := False;
  150.       end
  151.       else
  152.          if IsIfEquals(Buffer[ArrIndex]) then
  153.          begin
  154.             State := IF_STAT;
  155.             StateNotFound := False;
  156.          end;
  157.       Inc(ArrIndex);
  158.    end;
  159.    if ArrIndex < Size then
  160.       StateArr[State];
  161. end;
  162.  
  163.  
  164. procedure TTreeMaker.ClosingBracket;
  165. var
  166.    Temp: Integer;
  167. begin
  168.    State := BRACKET_STAT;
  169.    StateStack.Pop;
  170.    if AnsiCompareStr(Buffer[ArrIndex + 1], 'else') = 0 then
  171.    begin
  172.       Inc(ArrIndex, 2);
  173.       if ArrIndex < Size then
  174.          StateArr[State];      
  175.    end
  176.    else
  177.    begin
  178.       TempNode := IfStack.Pop;
  179.       if StateStack.Count > 0 then
  180.          Temp := StateStack.Pop
  181.       else
  182.          Temp := State;
  183.       if Temp = NO_BRAC_ELSE_STAT then
  184.          TempNode := IfStack.Pop
  185.       else
  186.          StateStack.Push(Temp);
  187.       StateStack.Push(BRACKET_STAT);
  188.       Inc(ArrIndex);
  189.       if ArrIndex < Size then
  190.          StateArr[SEARCHING_STAT];
  191.    end;
  192. end;
  193.  
  194.  
  195. procedure TTreeMaker.AfterElse;
  196. var
  197.    StateNotFound: Boolean;
  198. begin
  199.    State := ELSE_STAT;
  200.    if StateStack.Count > 0 then
  201.       StateStack.Pop;
  202.    StateStack.Push(State);
  203.    StateNotFound := True;
  204.    if AnsiCompareStr(Buffer[ArrIndex], '{') = 0 then
  205.    begin
  206.       while StateNotFound and (ArrIndex < Size) do
  207.       begin
  208.          Inc(ArrIndex);
  209.          if AnsiCompareStr(Buffer[ArrIndex], '}') = 0 then
  210.          begin
  211.             State := BRACKET_STAT;
  212.          end
  213.          else
  214.             begin
  215.                State := SEARCHING_STAT;
  216.             end;
  217.       end;
  218.    end
  219.    else
  220.       if IsIfEquals(Buffer[ArrIndex]) then
  221.       begin
  222.          State := IF_STAT;  
  223.          StateStack.Push(NO_BRAC_ELSE_STAT);
  224.          Inc(ArrIndex);
  225.       end;
  226.    if ArrIndex < Size then
  227.       StateArr[State];
  228. end;
  229.  
  230. procedure TTreeMaker.CaseStatement;
  231. begin
  232.      
  233. end;
  234.  
  235. //procedure Finish();
  236. //begin
  237. //
  238. //end;
  239.  
  240.  
  241. destructor TTreeMaker.Free;
  242. begin
  243.    StateStack.Destroy;
  244.    IfStack.Destroy;
  245. end;
  246.  
  247.  
  248. end.
  249. //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement