Changeset 7 for branches/Void/UCompilator.pas
- Timestamp:
- Nov 9, 2009, 9:21:28 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/Void/UCompilator.pas
r6 r7 6 6 7 7 uses 8 Classes, SysUtils ;8 Classes, SysUtils, UOutputGenerator, UModel; 9 9 10 10 type 11 11 TOnErrorEvent = procedure (Text: string; var Terminate: Boolean; Position: TPoint) of object; 12 12 13 TVariable = class14 Name: string;15 VarType: string;16 end;17 18 TCommand = class19 Text: string;20 end;21 22 13 TCompilator = class 23 14 private 24 15 FOnError: TOnErrorEvent; 25 Variables: TList;26 Commands: TList;27 16 ParsePosition: TPoint; 28 17 procedure DoError(Text: string); 29 function FindVariableByName(AName: string): TVariable;30 18 public 19 Model: TModel; 31 20 SourceCode: TStringList; 32 Output: TStringList;21 Generator: TOutputGenerator; 33 22 procedure Compile; 34 procedure Clear;35 23 procedure ProcessLine(Line: string); 36 24 constructor Create; … … 53 41 end; 54 42 55 function TCompilator.FindVariableByName(AName: string): TVariable;56 var57 I: Integer;58 begin59 I := 0;60 while (I < Variables.Count) and (TVariable(Variables[I]).Name <> AName) do61 Inc(I);62 if I < Variables.Count then Result := Variables[I] else Result := nil;63 end;64 65 43 procedure TCompilator.Compile; 66 44 var 67 45 I: Integer; 68 46 begin 69 Clear;47 Model.Clear; 70 48 71 49 // Process source lines … … 75 53 end; 76 54 77 // Prepare output 78 Output.Clear; 79 Output.Add('program Test;'); 80 Output.Add('{$APPTYPE CONSOLE}'); 81 82 // var section 83 if Variables.Count > 0 then Output.Add('var'); 84 for I := 0 to Variables.Count - 1 do 85 with TVariable(Variables[I]) do 86 Output.Add(' ' + Name + ': ' + VarType + ';'); 87 88 // Code block 89 Output.Add('begin'); 90 for I := 0 to Commands.Count - 1 do 91 with TCommand(Commands[I]) do 92 Output.Add(Text); 93 Output.Add('end.'); 94 end; 95 96 procedure TCompilator.Clear; 97 var 98 I: Integer; 99 begin 100 for I := 0 to Variables.Count - 1 do 101 TVariable(Variables[I]).Destroy; 102 Variables.Clear; 103 for I := 0 to Commands.Count - 1 do 104 TCommand(Commands[I]).Destroy; 105 Commands.Clear; 106 Output.Clear; 55 Generator.Generate(Model); 107 56 end; 108 57 … … 113 62 VariableName: string; 114 63 begin 64 with Model do begin 115 65 Command := Parse(Line); 116 66 if Command = 'Write' then … … 141 91 Text := 'Exit;'; 142 92 end else DoError('Unknown command ' + Command); 93 94 end; 143 95 end; 144 96 … … 146 98 begin 147 99 SourceCode := TStringList.Create; 148 Output := TStringList.Create; 149 Variables := TList.Create; 150 Commands := TList.Create; 100 Model := TModel.Create; 151 101 end; 152 102 … … 155 105 I: Integer; 156 106 begin 157 Output.Destroy;158 for I := 0 to Variables.Count - 1 do159 TVariable(Variables[I]).Destroy;160 Variables.Destroy;161 for I := 0 to Commands.Count - 1 do162 TCommand(Commands[I]).Destroy;163 Commands.Destroy;164 107 SourceCode.Destroy; 108 Model.Destroy; 165 109 inherited Destroy; 166 110 end;
Note:
See TracChangeset
for help on using the changeset viewer.