Advertisement
Guest User

Untitled

a guest
Mar 12th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.35 KB | None | 0 0
  1. unit mainUnit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, LEXAN, lexlib;
  8.  
  9. const
  10.   stackMaxSize=300;
  11.   eol=0;
  12.  
  13. type
  14.   TfrmMain = class(TForm)
  15.     mmoIn: TMemo;
  16.     btnRun: TButton;
  17.     lbl: TLabel;
  18.     procedure btnRunClick(Sender: TObject);
  19.   private
  20.     { Private declarations }
  21.   public
  22.     { Public declarations }
  23.   end;
  24.  
  25.   Trule=record
  26.     ruleLeft: Integer;
  27.     ruleLength: Word;
  28.   end;
  29.  
  30.   _Action=(shift,reduce,accept,error_state);
  31.  
  32.   Taction=record
  33.     act: _Action;
  34.     state: Integer;
  35.   end;
  36.  
  37. const
  38.   rule: array[2..4] of Trule=((ruleLeft:_GOAL;     ruleLength:6),
  39.                               (ruleLeft:_SOME;     ruleLength:1),
  40.                               (ruleLeft:_SOME;     ruleLength:1));
  41.  
  42. var
  43.   frmMain: TfrmMain;
  44.   terminals: array[0..stackMaxSize] of Integer; cterminals: Integer=0; //терминалы
  45.   stack: array[0..stackMaxSize] of Integer; cstack: Integer=0;
  46.  
  47. procedure lexicalAnalysis;
  48. function action(state:Integer; terminal:Integer): Taction;
  49. function res(act: _Action; state: Integer): Taction;
  50. function gotoTbl(state:Integer; noterm:Integer): Integer;
  51. procedure LRanalyzer;
  52.  
  53. implementation
  54.  
  55. {$R *.dfm}
  56.  
  57. procedure lexicalAnalysis;
  58. var t,tmp:Integer;
  59. begin
  60.   yylineno := 0; yyclear;
  61.   yyline := frmMain.mmoIn.Lines.Text;
  62.   cterminals := 0;
  63.   repeat
  64.     t := yylex;
  65.     Inc(cterminals);
  66.     terminals[cterminals-1] := t;
  67.   until (t = eol);
  68.   for t := 0 to (cterminals div 2)-1 do //overwind
  69.   begin             //swap
  70.     tmp := terminals[t];
  71.     terminals[t] := terminals[cterminals-1-t];
  72.     terminals[cterminals-1-t] := tmp;
  73.   end;
  74.   Dec(cterminals);
  75. end;
  76.  
  77. function res(act: _Action; state: Integer): Taction;
  78. begin
  79.   Result.act := act;
  80.   Result.state := state;
  81. end;
  82.  
  83. function action(state:Integer; terminal:Integer): Taction;
  84. begin
  85.   Result := res(error_state,0);
  86.   case state of
  87.     0:  case terminal of
  88.           _update:    Result := res(shift,2);
  89.           _string:    Result := res(shift,3);
  90.           _num:       Result := res(shift,4);
  91.         end;
  92.     1:  case terminal of
  93.           eol:     Result := res(accept,0);
  94.         end;
  95.     2:  case terminal of
  96.           _id:     Result := res(shift,5);
  97.         end;
  98.     3:  case terminal of
  99.           eol:     Result := res(reduce,3);
  100.         end;
  101.     4:  case terminal of
  102.          eol:      Result := res(reduce,4);
  103.         end;
  104.     5:  case terminal of
  105.           _set:    Result := res(shift,6);
  106.         end;
  107.     6:  case terminal of
  108.           _id:     Result := res(shift,7);
  109.         end;
  110.     7:  case terminal of
  111.           ord('='):Result := res(shift,8);
  112.         end;
  113.     8:  case terminal of
  114.           _string:    Result := res(shift,3);
  115.           _num:       Result := res(shift,4);
  116.         end;
  117.     9:  case terminal of
  118.           eol:        Result := res(reduce,2)
  119.         end;
  120.   end {case state}
  121. end;
  122.  
  123. function gotoTbl(state:Integer; noterm:Integer): Integer;
  124. begin
  125.   case state of
  126.     0:  case noterm of
  127.           _GOAL:     Result := 1;
  128.         end;
  129.     8:  case noterm of
  130.           _SOME:     Result := 9;
  131.         end;
  132.   end;
  133. end;
  134.  
  135. procedure LRanalyzer;
  136. var yy: Integer;
  137.     act: Taction;
  138. begin
  139.   cstack := 1;
  140.   stack[0] := eol; // end of line
  141.   stack[1] := 0; //state S0
  142.   yy := terminals[cterminals];
  143.   repeat
  144.     act := action(stack[cstack], yy);
  145.     case act.act of
  146.       shift:       begin
  147.                      cstack := cstack + 2;
  148.                      stack[cstack-1] := yy;
  149.                      stack[cstack] := act.state;
  150.                      Dec(cterminals);
  151.                      yy := terminals[cterminals];
  152.                    end;
  153.       reduce:      begin
  154.                      cstack := cstack - rule[act.state].ruleLength*2 +2;
  155.                      stack[cstack-1] := rule[act.state].ruleLeft;
  156.                      stack[cstack] := gotoTbl(stack[cstack-2],stack[cstack-1]);
  157.                    end;
  158.       error_state: begin
  159.                      frmMain.lbl.Caption := 'Fail';
  160.                      Break;
  161.                    end;
  162.       accept:      begin
  163.                      frmMain.lbl.Caption := 'Luck';
  164.                      Break;
  165.                    end;
  166.     end;    
  167.   until 1=2;
  168. end;
  169.  
  170. procedure TfrmMain.btnRunClick(Sender: TObject);
  171. begin
  172.   lexicalAnalysis;
  173.   LRanalyzer;
  174. end;
  175.  
  176. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement