Changeset 205
- Timestamp:
- Apr 20, 2020, 1:10:44 AM (5 years ago)
- Location:
- branches/interpreter2
- Files:
-
- 1 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/interpreter2
- Property svn:ignore
-
old new 4 4 interpreter.res 5 5 heaptrclog.trc 6 Generated
-
- Property svn:ignore
-
branches/interpreter2/Test.pas
r204 r205 21 21 22 22 // While-Do 23 WriteLn('WhileDo'); 23 24 I := 5; 24 25 while I <> 0 do begin … … 27 28 end; 28 29 30 // Repeat-Until 31 I := 5; 32 WriteLn('RepeatUntil'); 33 repeat 34 WriteLn(IntToStr(I)); 35 I := I - 1; 36 until I = 0; 37 29 38 // For-To-Do 39 WriteLn('ForToDo'); 30 40 for I := 0 to 5 do begin 31 41 WriteLn(IntToStr(I)); -
branches/interpreter2/UExecutor.pas
r203 r205 102 102 procedure ExecuteIfThenElse(Block: TExecutorBlock; IfThenElse: TIfThenElse); 103 103 procedure ExecuteWhileDo(Block: TExecutorBlock; WhileDo: TWhileDo); 104 procedure ExecuteRepeatUntil(Block: TExecutorBlock; RepeatUntil: TRepeatUntil); 104 105 procedure ExecuteForToDo(Block: TExecutorBlock; ForToDo: TForToDo); 105 106 procedure ExecuteBlock(ParentBlock: TExecutorBlock; Block: TBlock); … … 432 433 else if Command is TIfThenElse then ExecuteIfThenElse(Block, TIfThenElse(Command)) 433 434 else if Command is TWhileDo then ExecuteWhileDo(Block, TWhileDo(Command)) 435 else if Command is TRepeatUntil then ExecuteRepeatUntil(Block, TRepeatUntil(Command)) 434 436 else if Command is TForToDo then ExecuteForToDo(Block, TForToDo(Command)) 435 437 else raise Exception.Create('Unsupported command type'); … … 458 460 if not TValueBoolean(Value).Value then Break; 459 461 ExecuteCommand(Block, WhileDo.Command); 462 end else raise Exception.Create('Expected boolean value.'); 463 Value.Free; 464 end; 465 end; 466 467 procedure TExecutor.ExecuteRepeatUntil(Block: TExecutorBlock; 468 RepeatUntil: TRepeatUntil); 469 var 470 Value: TValue; 471 I: Integer; 472 begin 473 while True do begin 474 for I := 0 to RepeatUntil.Commands.Count - 1 do 475 ExecuteCommand(Block, TCommand(RepeatUntil.Commands[I])); 476 Value := ExecuteExpression(Block, RepeatUntil.Expression); 477 if Value is TValueBoolean then begin 478 if TValueBoolean(Value).Value then Break; 460 479 end else raise Exception.Create('Expected boolean value.'); 461 480 Value.Free; -
branches/interpreter2/UFormMain.pas
r204 r205 6 6 7 7 uses 8 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, 9 SynHighlighterPas, SynEdit, USource;8 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Menus, 9 ActnList, SynHighlighterPas, SynEdit, USource; 10 10 11 11 type … … 51 51 52 52 uses 53 UParser, UExecutor, UGenerator , UGeneratorPhp;53 UParser, UExecutor, UGeneratorPascal, UGeneratorPhp; 54 54 55 55 { TFormMain } … … 126 126 procedure TFormMain.ButtonGenerateClick(Sender: TObject); 127 127 var 128 Generator: TGenerator ;128 Generator: TGeneratorPascal; 129 129 begin 130 130 ButtonCompile.Click; 131 131 MemoOutput.Lines.Clear; 132 132 if Assigned(Prog) then begin 133 Generator := TGenerator .Create;133 Generator := TGeneratorPascal.Create; 134 134 Generator.Prog := Prog; 135 135 Generator.Generate; -
branches/interpreter2/UGenerator.pas
r204 r205 6 6 7 7 uses 8 Classes, SysUtils, strutils , USource;8 Classes, SysUtils, strutils; 9 9 10 10 type 11 12 { TGenerator }13 14 11 TGenerator = class 15 12 private 16 Indent: Integer; 13 FIndent: Integer; 14 procedure SetIndent(AValue: Integer); 15 public 16 Output: string; 17 17 procedure AddText(Text: string); 18 18 procedure AddTextLine(Text: string = ''); 19 procedure GenerateProgram(Block: TBlock; Prog:TProgram); 20 procedure GenerateBlock(ParentBlock: TBlock; Block: TBlock); 21 procedure GenerateBlockVar(ParentBlock: TBlock; Block: TBlock); 22 procedure GenerateBlockConst(ParentBlock: TBlock; Block: TBlock); 23 procedure GenerateBeginEnd(Block: TBlock; BeginEnd: TBeginEnd); 24 procedure GenerateCommand(Block: TBlock; Command: TCommand); 25 procedure GenerateIfThenElse(Block: TBlock; IfThenElse: TIfThenElse); 26 procedure GenerateWhileDo(Block: TBlock; WhileDo: TWhileDo); 27 procedure GenerateForToDo(Block: TBlock; ForToDo: TForToDo); 28 procedure GenerateFunctionCall(Block: TBlock; FunctionCall: TFunctionCall); 29 procedure GenerateAssignment(Block: TBlock; Assignment: TAssignment); 30 procedure GenerateExpression(Block: TBlock; Expression: TExpression); 31 procedure GenerateExpressionOperation(Block: TBlock; Expression: TExpressionOperation); 32 procedure GenerateExpressionOperand(Block: TBlock; Expression: TExpressionOperand); 33 procedure GenerateValue(Value: TValue); 34 public 35 Prog: TProgram; 36 Output: string; 37 procedure Generate; 19 property Indent: Integer read FIndent write SetIndent; 38 20 end; 21 39 22 40 23 implementation 41 24 42 { TGenerator } 43 44 procedure TGenerator.GenerateCommand(Block: TBlock; Command: TCommand); 25 procedure TGenerator.SetIndent(AValue: Integer); 45 26 begin 46 if Command is TBeginEnd then GenerateBeginEnd(Block, TBeginEnd(Command)) 47 else if Command is TFunctionCall then GenerateFunctionCall(Block, TFunctionCall(Command)) 48 else if Command is TAssignment then GenerateAssignment(Block, TAssignment(Command)) 49 else if Command is TIfThenElse then GenerateIfThenElse(Block, TIfThenElse(Command)) 50 else if Command is TWhileDo then GenerateWhileDo(Block, TWhileDo(Command)) 51 else if Command is TForToDo then GenerateForToDo(Block, TForToDo(Command)) 52 else raise Exception.Create('Unsupported command type'); 53 end; 54 55 procedure TGenerator.GenerateIfThenElse(Block: TBlock; IfThenElse: TIfThenElse); 56 begin 57 AddText('if '); 58 GenerateExpression(Block, IfThenElse.Expression); 59 AddText(' then '); 60 GenerateCommand(Block, IfThenElse.CommandThen); 61 if Assigned(IfThenElse.CommandElse) then begin 62 AddText(' else '); 63 GenerateCommand(Block, IfThenElse.CommandElse); 27 if FIndent = AValue then Exit; 28 if AValue > FIndent then begin 29 Output := Output + DupeString(' ', AValue - FIndent); 30 end else 31 if AValue < FIndent then begin 32 Output := Copy(Output, 1, Length(Output) - (FIndent - AValue) * 2); 64 33 end; 65 end; 66 67 procedure TGenerator.GenerateWhileDo(Block: TBlock; WhileDo: TWhileDo); 68 begin 69 AddText('while '); 70 GenerateExpression(Block, WhileDo.Expression); 71 AddText(' do '); 72 GenerateCommand(Block, WhileDo.Command); 73 end; 74 75 procedure TGenerator.GenerateForToDo(Block: TBlock; ForToDo: TForToDo); 76 begin 77 AddText('for '); 78 AddText(ForToDo.VariableRef.Name); 79 AddText(' := '); 80 GenerateExpression(Block, ForToDo.ExpressionFrom); 81 AddText(' to '); 82 GenerateExpression(Block, ForToDo.ExpressionTo); 83 AddText(' do '); 84 GenerateCommand(Block, ForToDo.Command); 85 end; 86 87 procedure TGenerator.GenerateFunctionCall(Block: TBlock; 88 FunctionCall: TFunctionCall); 89 var 90 I: Integer; 91 begin 92 AddText(FunctionCall.FunctionDef.Name); 93 if FunctionCall.Params.Count > 0 then begin 94 AddText('('); 95 for I := 0 to FunctionCall.Params.Count - 1 do 96 GenerateExpression(Block, TExpression(FunctionCall.Params[I])); 97 AddText(')'); 98 end; 99 end; 100 101 procedure TGenerator.GenerateAssignment(Block: TBlock; Assignment: TAssignment); 102 begin 103 AddText(Assignment.Variable.Name); 104 AddText(' := '); 105 GenerateExpression(Block, Assignment.Expression); 106 end; 107 108 procedure TGenerator.GenerateExpression(Block: TBlock; Expression: TExpression); 109 begin 110 if Expression is TExpressionOperation then 111 GenerateExpressionOperation(Block, TExpressionOperation(Expression)) 112 else 113 if Expression is TExpressionOperand then 114 GenerateExpressionOperand(Block, TExpressionOperand(Expression)) 115 else raise Exception.Create('Unknown expression class.'); 116 end; 117 118 procedure TGenerator.GenerateExpressionOperation(Block: TBlock; 119 Expression: TExpressionOperation); 120 var 121 I: Integer; 122 begin 123 for I := 0 to Expression.Items.Count - 1 do begin 124 if I > 0 then begin 125 AddText(' '); 126 if Expression.Operation = eoAdd then AddText('+') 127 else if Expression.Operation = eoSub then AddText('-') 128 else if Expression.Operation = eoEqual then AddText('=') 129 else if Expression.Operation = eoNotEqual then AddText('<>'); 130 AddText(' '); 131 end; 132 GenerateExpression(Block, TExpression(Expression.Items[I])); 133 end; 134 end; 135 136 procedure TGenerator.GenerateExpressionOperand(Block: TBlock; 137 Expression: TExpressionOperand); 138 begin 139 case Expression.OperandType of 140 otFunctionCall: GenerateFunctionCall(Block, Expression.FunctionCall); 141 otConstantDirect: GenerateValue(Expression.ConstantDirect.Value); 142 otConstantRef: AddText(Expression.ConstantRef.Name); 143 otVariableRef: AddText(Expression.VariableRef.Name); 144 else raise Exception.Create('Unsupported exception operand type.'); 145 end; 146 end; 147 148 procedure TGenerator.GenerateValue(Value: TValue); 149 begin 150 if Value is TValueBoolean then begin 151 if TValueBoolean(Value).Value then AddText('True') else AddText('False'); 152 end else if Value is TValueString then AddText('''' + StringReplace(TValueString(Value).Value, '''', '''''', [rfReplaceAll]) + '''') 153 else if Value is TValueInteger then AddText(IntToStr(TValueInteger(Value).Value)) 154 else raise Exception.Create('Unsupported value type.'); 34 FIndent := AValue; 155 35 end; 156 36 … … 165 45 end; 166 46 167 procedure TGenerator.GenerateProgram(Block: TBlock; Prog: TProgram);168 begin169 if Prog.Name <> '' then AddTextLine('program ' + Prog.Name + ';');170 GenerateBlock(Block, Prog.Block);171 AddTextLine('.');172 end;173 174 procedure TGenerator.GenerateBlock(ParentBlock: TBlock; Block: TBlock);175 begin176 GenerateBlockConst(ParentBlock, Block);177 GenerateBlockVar(ParentBlock, Block);178 GenerateBeginEnd(ParentBlock, Block.BeginEnd);179 end;180 181 procedure TGenerator.GenerateBlockVar(ParentBlock: TBlock; Block: TBlock);182 var183 I: Integer;184 Variable: TVariable;185 begin186 if Block.Variables.Count > 0 then begin187 AddText('var');188 Inc(Indent);189 AddTextLine;190 for I := 0 to Block.Variables.Count - 1 do begin191 Variable := TVariable(Block.Variables[I]);192 AddTextLine(Variable.Name + ': ' + Variable.TypeRef.Name + ';');193 end;194 Dec(Indent);195 AddTextLine;196 end;197 end;198 199 procedure TGenerator.GenerateBlockConst(ParentBlock: TBlock; Block: TBlock);200 var201 I: Integer;202 Constant: TConstant;203 begin204 if Block.Constants.Count > 0 then begin205 AddText('const');206 Inc(Indent);207 AddTextLine;208 for I := 0 to Block.Constants.Count - 1 do begin209 Constant := TConstant(Block.Constants[I]);210 AddText(Constant.Name + ': ' + Constant.TypeRef.Name + ' = ');211 GenerateValue(Constant.Value);212 AddTextLine(';');213 end;214 Dec(Indent);215 AddTextLine;216 end;217 end;218 219 procedure TGenerator.GenerateBeginEnd(Block: TBlock; BeginEnd: TBeginEnd);220 var221 I: Integer;222 begin223 AddText('begin');224 Inc(Indent);225 AddTextLine('');226 for I := 0 to BeginEnd.Commands.Count - 1 do begin227 GenerateCommand(Block, TCommand(BeginEnd.Commands[I]));228 AddText(';');229 if I < BeginEnd.Commands.Count - 1 then AddTextLine('');230 end;231 Dec(Indent);232 AddTextLine('');233 AddText('end');234 end;235 236 procedure TGenerator.Generate;237 begin238 Output := '';239 GenerateProgram(Prog.SystemBlock, Prog);240 end;241 242 47 end. 243 48 -
branches/interpreter2/UGeneratorPhp.pas
r204 r205 6 6 7 7 uses 8 Classes, SysUtils, strutils, USource ;8 Classes, SysUtils, strutils, USource, UGenerator; 9 9 10 10 type … … 12 12 { TGeneratorPhp } 13 13 14 TGeneratorPhp = class 14 TGeneratorPhp = class(TGenerator) 15 15 private 16 Indent: Integer;17 procedure AddText(Text: string);18 procedure AddTextLine(Text: string = '');19 16 procedure GenerateProgram(Block: TBlock; Prog:TProgram); 20 17 procedure GenerateBlock(ParentBlock: TBlock; Block: TBlock); 21 procedure GenerateBlockVar(ParentBlock: TBlock; Block: TBlock);22 18 procedure GenerateBlockConst(ParentBlock: TBlock; Block: TBlock); 23 19 procedure GenerateBlockFunctions(ParentBlock: TBlock; Block: TBlock); … … 26 22 procedure GenerateIfThenElse(Block: TBlock; IfThenElse: TIfThenElse); 27 23 procedure GenerateWhileDo(Block: TBlock; WhileDo: TWhileDo); 24 procedure GenerateRepeatUntil(Block: TBlock; RepeatUntil: TRepeatUntil); 28 25 procedure GenerateForToDo(Block: TBlock; ForToDo: TForToDo); 29 26 procedure GenerateFunctionCall(Block: TBlock; FunctionCall: TFunctionCall); … … 35 32 public 36 33 Prog: TProgram; 37 Output: string;38 34 procedure Generate; 39 35 end; … … 50 46 else if Command is TIfThenElse then GenerateIfThenElse(Block, TIfThenElse(Command)) 51 47 else if Command is TWhileDo then GenerateWhileDo(Block, TWhileDo(Command)) 48 else if Command is TRepeatUntil then GenerateRepeatUntil(Block, TRepeatUntil(Command)) 52 49 else if Command is TForToDo then GenerateForToDo(Block, TForToDo(Command)) 53 50 else raise Exception.Create('Unsupported command type'); … … 73 70 AddText(' ) '); 74 71 GenerateCommand(Block, WhileDo.Command); 72 end; 73 74 procedure TGeneratorPhp.GenerateRepeatUntil(Block: TBlock; 75 RepeatUntil: TRepeatUntil); 76 var 77 I: Integer; 78 begin 79 AddTextLine('while (true)'); 80 AddTextLine('{'); 81 Indent := Indent + 1; 82 for I := 0 to RepeatUntil.Commands.Count - 1 do begin 83 GenerateCommand(Block, TCommand(RepeatUntil.Commands[I])); 84 AddTextLine(';'); 85 end; 86 AddText('if ('); 87 GenerateExpression(Block, RepeatUntil.Expression); 88 AddTextLine(') break;'); 89 Indent := Indent - 1; 90 AddTextLine('}'); 75 91 end; 76 92 … … 128 144 for I := 0 to Expression.Items.Count - 1 do begin 129 145 if I > 0 then begin 130 AddText(' ');131 146 if Expression.Operation = eoAdd then begin 132 147 if Expression.TypeRef.Name = 'string' then AddText('.') 133 else AddText(' +');148 else AddText(' + '); 134 149 end 135 else if Expression.Operation = eoSub then AddText('-') 136 else if Expression.Operation = eoEqual then AddText('==') 137 else if Expression.Operation = eoNotEqual then AddText('!='); 138 AddText(' '); 150 else if Expression.Operation = eoSub then AddText(' - ') 151 else if Expression.Operation = eoEqual then AddText(' == ') 152 else if Expression.Operation = eoNotEqual then AddText(' != '); 139 153 end; 140 154 GenerateExpression(Block, TExpression(Expression.Items[I])); … … 163 177 end; 164 178 165 procedure TGeneratorPhp.AddText(Text: string);166 begin167 Output := Output + Text;168 end;169 170 procedure TGeneratorPhp.AddTextLine(Text: string);171 begin172 AddText(Text + LineEnding + DupeString(' ', Indent));173 end;174 175 179 procedure TGeneratorPhp.GenerateProgram(Block: TBlock; Prog: TProgram); 176 180 begin … … 185 189 begin 186 190 GenerateBlockConst(ParentBlock, Block); 187 //GenerateBlockVar(ParentBlock, Block);188 191 GenerateBlockFunctions(ParentBlock, Block); 189 192 if Block.BeginEnd.Commands.Count > 0 then 190 193 GenerateBeginEnd(ParentBlock, Block.BeginEnd); 191 end;192 193 procedure TGeneratorPhp.GenerateBlockVar(ParentBlock: TBlock; Block: TBlock);194 var195 I: Integer;196 Variable: TVariable;197 begin198 if Block.Variables.Count > 0 then begin199 AddText('var');200 Inc(Indent);201 AddTextLine;202 for I := 0 to Block.Variables.Count - 1 do begin203 Variable := TVariable(Block.Variables[I]);204 AddTextLine(Variable.Name + ': ' + Variable.TypeRef.Name + ';');205 end;206 Dec(Indent);207 AddTextLine;208 end;209 194 end; 210 195 … … 239 224 if FunctionDef.InternalName <> '' then begin 240 225 AddTextLine('{'); 226 Indent := Indent + 1; 241 227 if FunctionDef.InternalName = 'WriteLn' then AddTextLine('echo($Text."\n");') 242 228 else if FunctionDef.InternalName = 'Write' then AddTextLine('echo($Text);') 243 229 else if FunctionDef.InternalName = 'IntToStr' then AddTextLine('return $Value;') 244 230 else if FunctionDef.InternalName = 'StrToInt' then AddTextLine('return $Value;'); 245 Dec(Indent);231 Indent := Indent - 1; 246 232 AddTextLine('}'); 247 233 end else begin … … 257 243 I: Integer; 258 244 begin 259 AddText('{'); 260 Inc(Indent); 261 AddTextLine(''); 245 AddTextLine('{'); 246 Indent := Indent + 1; 262 247 for I := 0 to BeginEnd.Commands.Count - 1 do begin 263 248 GenerateCommand(Block, TCommand(BeginEnd.Commands[I])); 264 AddText(';'); 265 if I < BeginEnd.Commands.Count - 1 then AddTextLine(''); 266 end; 267 Dec(Indent); 268 AddTextLine(''); 249 AddTextLine(';'); 250 end; 251 Indent := Indent - 1; 269 252 AddText('}'); 270 253 end; -
branches/interpreter2/UParser.pas
r204 r205 32 32 function ParseIfThenElse(Block: TBlock; out IfThenElse: TIfThenElse): Boolean; 33 33 function ParseWhileDo(Block: TBlock; out WhileDo: TWhileDo): Boolean; 34 function ParseRepeatUntil(Block: TBlock; out RepeatUntil: TRepeatUntil): Boolean; 34 35 function ParseForToDo(Block: TBlock; out ForToDo: TForToDo): Boolean; 35 36 procedure TokenizerError(Pos: TPoint; Text: string); … … 55 56 begin 56 57 if Tokenizer.CheckNext('begin', tkKeyword) then begin 58 Tokenizer.Expect('begin', tkKeyword); 57 59 BeginEnd := TBeginEnd.Create; 58 60 Result := True; 59 Tokenizer.Expect('begin', tkKeyword);60 61 while not Tokenizer.CheckNext('end', tkKeyword) do begin 61 62 if ParseCommand(Block, Command) then begin … … 119 120 WhileDo: TWhileDo; 120 121 ForToDo: TForToDo; 122 RepeatUntil: TRepeatUntil; 121 123 begin 122 124 if ParseIfThenElse(Block, IfThenElse) then begin … … 139 141 Result := True; 140 142 Command := FunctionCall; 143 end else 144 if ParseRepeatUntil(Block, RepeatUntil) then begin 145 Result := True; 146 Command := RepeatUntil; 141 147 end else 142 148 if ParseAssignment(Block, Assignment) then begin … … 496 502 end; 497 503 504 function TParser.ParseRepeatUntil(Block: TBlock; out RepeatUntil: TRepeatUntil 505 ): Boolean; 506 var 507 Expression: TExpression; 508 Command: TCommand; 509 begin 510 Result := False; 511 if Tokenizer.CheckNext('repeat', tkKeyword) then begin 512 Tokenizer.Expect('repeat', tkKeyword); 513 RepeatUntil := TRepeatUntil.Create; 514 Result := True; 515 while not Tokenizer.CheckNext('until', tkKeyword) do begin 516 if ParseCommand(Block, Command) then begin 517 RepeatUntil.Commands.Add(Command); 518 Tokenizer.Expect(';', tkSpecialSymbol); 519 end else begin 520 Error('Unexpected token ' + Tokenizer.GetNext.Text); 521 Result := False; 522 Break; 523 end; 524 end; 525 Tokenizer.Expect('until', tkKeyword); 526 if ParseExpression(Block, Expression) then begin 527 RepeatUntil.Expression.Free; 528 RepeatUntil.Expression := Expression; 529 end else Error('Expected expression'); 530 end else Result := False; 531 end; 532 498 533 function TParser.ParseForToDo(Block: TBlock; out ForToDo: TForToDo): Boolean; 499 534 var -
branches/interpreter2/USource.pas
r204 r205 117 117 end; 118 118 119 TCommands = class(TObjectList) 120 end; 121 119 122 { TFunctionCall } 120 123 … … 129 132 130 133 TBeginEnd = class(TCommand) 131 Commands: T ObjectList;134 Commands: TCommands; 132 135 procedure Clear; 133 136 constructor Create; … … 197 200 Expression: TExpression; 198 201 Command: TCommand; 202 constructor Create; 203 destructor Destroy; override; 204 end; 205 206 { TRepeatUntil } 207 208 TRepeatUntil = class(TCommand) 209 Expression: TExpression; 210 Commands: TCommands; 199 211 constructor Create; 200 212 destructor Destroy; override; … … 243 255 implementation 244 256 257 { TRepeatUntil } 258 259 constructor TRepeatUntil.Create; 260 begin 261 Expression := TExpression.Create; 262 Commands := TCommands.Create; 263 end; 264 265 destructor TRepeatUntil.Destroy; 266 begin 267 Expression.Free; 268 Commands.Free; 269 inherited Destroy; 270 end; 271 245 272 { TValueBoolean } 246 273 … … 579 606 constructor TBeginEnd.Create; 580 607 begin 581 Commands := T ObjectList.Create;608 Commands := TCommands.Create; 582 609 end; 583 610 -
branches/interpreter2/UTokenizer.pas
r202 r205 149 149 (Text = 'var') or (Text = 'const') or (Text = 'if') or (Text = 'then') or 150 150 (Text = 'else') or (Text = 'while') or (Text = 'do') or (Text = 'for') or 151 (Text = 'to') ;151 (Text = 'to') or (Text = 'repeat') or (Text = 'until'); 152 152 end; 153 153 -
branches/interpreter2/interpreter.lpi
r204 r205 71 71 </Item2> 72 72 </RequiredPackages> 73 <Units Count=" 9">73 <Units Count="10"> 74 74 <Unit0> 75 75 <Filename Value="interpreter.lpr"/> … … 104 104 </Unit6> 105 105 <Unit7> 106 <Filename Value="UGenerator .pas"/>106 <Filename Value="UGeneratorPascal.pas"/> 107 107 <IsPartOfProject Value="True"/> 108 108 </Unit7> … … 111 111 <IsPartOfProject Value="True"/> 112 112 </Unit8> 113 <Unit9> 114 <Filename Value="UGenerator.pas"/> 115 <IsPartOfProject Value="True"/> 116 </Unit9> 113 117 </Units> 114 118 </ProjectOptions> -
branches/interpreter2/interpreter.lpr
r204 r205 9 9 Interfaces, SysUtils, // this includes the LCL widgetset 10 10 Forms, UFormMain, UParser, UTokenizer, USource, UExecutor, UInterpreter, 11 UGenerator , UGeneratorPhp11 UGeneratorPascal, UGeneratorPhp, UGenerator 12 12 { you can add units after this }; 13 13
Note:
See TracChangeset
for help on using the changeset viewer.