Ignore:
Timestamp:
Feb 6, 2017, 12:11:54 AM (8 years ago)
Author:
chronos
Message:
  • Modified: Better parsing of expression and commands.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/interpreter/Execute3.pas

    r98 r99  
    55uses
    66  Source3;
     7
     8type
     9  TVariableValue = record
     10    BaseType: TBaseType;
     11    case Integer of
     12      0: (ValueChar: Char);
     13      1: (ValueInteger: Integer);
     14      2: (ValueString: ShortString);
     15      3: (ValueBoolean: Boolean);
     16  end;
     17  PVariableValue = ^TVariableValue;
     18
     19  TVariableValues = record
     20    Items: array of TVariableValue;
     21  end;
     22
     23  { TExecutionContext }
     24
     25  TExecutionContext = record
     26    VariableValues: TVariableValues;
     27    procedure LoadFromVariables(Variables: PVariables);
     28  end;
     29  PExecutionContext = ^TExecutionContext;
     30
     31  { TExecutionContexts }
     32
     33  TExecutionContexts = record
     34    Items: array of TExecutionContext;
     35    function Last: PExecutionContext;
     36    procedure Add;
     37    procedure RemoveLast;
     38  end;
     39
     40var
     41  ExecutionContexts: TExecutionContexts;
    742
    843procedure ExecuteProgram(ProgramCode: PProgramCode);
     
    4378  I: Integer;
    4479begin
     80  ExecutionContexts.Add;
     81  ExecutionContexts.Last^.LoadFromVariables(@Execution^.Func^.Variables);
    4582{  Execution^.Func^.Variables.Add(VariableCreate('Result', Execution^.Func^.ReturnType));
    4683  for I := 0 to Length(Execution^.Func^.Parameters.Items) - 1 do begin
     
    5390}
    5491  ExecuteBeginEnd(@Execution^.Func^.BeginEnd);
     92  ExecutionContexts.RemoveLast;
    5593end;
    5694
    5795procedure ExecuteAssignment(Assignment: PAssignment);
     96var
     97  DestVariable: PVariableValue;
    5898begin
    59   case Assignment^.Destination^.DataType^.BaseType of
    60     btBoolean: Assignment^.Destination.ValueBoolean := ExecuteExpressionBoolean(@Assignment^.Source);
     99  DestVariable := @ExecutionContexts.Last^.VariableValues.Items[Assignment^.Destination^.Index];
     100  case DestVariable^.BaseType of
     101    btBoolean: DestVariable^.ValueBoolean := ExecuteExpressionBoolean(@Assignment^.Source);
    61102    //btChar: Assignment^.Destination.ValueBoolean := ExecuteExpressionChar(@Assignment^.Source);
    62103    //btString: Assignment^.Destination.ValueBoolean := ExecuteExpressionString(@Assignment^.Source);
     
    78119procedure ExecuteProgram(ProgramCode: PProgramCode);
    79120begin
     121  SetLength(ExecutionContexts.Items, 1);
     122  ExecutionContexts.Last^.LoadFromVariables(@ProgramCode^.Variables);
    80123  ExecuteBeginEnd(@ProgramCode^.BeginEnd);
     124end;
     125
     126{ TExecutionContext }
     127
     128procedure TExecutionContext.LoadFromVariables(Variables: PVariables);
     129var
     130  I: Integer;
     131begin
     132  SetLength(VariableValues.Items, Length(Variables.Items));
     133  for I := 0 to Length(Variables.Items) - 1 do begin
     134    VariableValues.Items[I].BaseType := Variables.Items[I].DataType.BaseType;
     135  end;
     136end;
     137
     138{ TExecutionContexts }
     139
     140function TExecutionContexts.Last: PExecutionContext;
     141begin
     142  Result := @ExecutionContexts.Items[Length(ExecutionContexts.Items) - 1];
     143end;
     144
     145procedure TExecutionContexts.Add;
     146begin
     147  SetLength(Items, Length(Items) + 1);
     148end;
     149
     150procedure TExecutionContexts.RemoveLast;
     151begin
     152  SetLength(Items, Length(Items) - 1);
    81153end;
    82154
Note: See TracChangeset for help on using the changeset viewer.