Changeset 105 for branches/interpreter


Ignore:
Timestamp:
Feb 17, 2017, 11:19:22 PM (8 years ago)
Author:
chronos
Message:
  • Modified: More work on record functions.
Location:
branches/interpreter/interpreter4
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/interpreter/interpreter4/Parser.pas

    r104 r105  
    286286begin
    287287  OldPos := InputTextPos;
    288   Next := ReadNext;
    289   if FunctionContext = nil then
    290     Variable := MainProgram^.Variables.GetByName(Next)
    291     else Variable := FunctionContext^.Variables.GetByName(Next);
    292   if Variable <> nil then begin
    293     Result := True;
    294   end else begin
    295     Result := False;
    296     InputTextPos := OldPos;
    297   end;
     288  Variable := nil;
     289  repeat
     290    Next := ReadNext;
     291    if Assigned(Variable) and (Variable^.DataType^.BaseType = btRecord) then begin
     292//      if FunctionContext = nil then
     293//        Variable := MainProgram^.Variables.GetByName(Next)
     294//        else Variable := FunctionContext^.Variables.GetByName(Next);
     295    end else begin
     296      if FunctionContext = nil then
     297        Variable := MainProgram^.Variables.GetByName(Next)
     298        else begin
     299          Variable := FunctionContext^.Variables.GetByName(Next);
     300        end;
     301    end;
     302    if Variable <> nil then begin
     303      Result := True;
     304    end else begin
     305      Result := False;
     306      InputTextPos := OldPos;
     307    end;
     308    if CheckNext('.') then begin
     309      Expect('.');
     310      Continue;
     311    end else Break;
     312  until False;
    298313end;
    299314
     
    549564      I := 0;
    550565      while I < Length(Func^.Parameters.Items) do begin
    551         ParseGetValue(@Execution^.Parameters.Items[I]);
     566        if ParseGetValue(@Execution^.Parameters.Items[I]) then begin
     567        end else ShowError('Value exprected but found ' + ReadNext);
     568
    552569        if I < (Length(Func^.Parameters.Items) - 1) then Expect(',');
    553570        I := I + 1;
     
    711728  OldPos: Integer;
    712729  Value: string;
     730  I: Integer;
    713731begin
    714732  if CheckNext('var') then begin
     
    728746        if ParseType(VarType, False) then begin
    729747          Variables^.Add(VariableCreate(VarName, VarType));
     748          // Create subvariables for structured record type variable
     749          if VarType^.BaseType = btRecord then begin
     750            SetLength(Variables^.GetLast^.RecordVariables.Items, 0);
     751            I := 0;
     752            while (I < Length(VarType^.Fields^.Items)) do begin
     753              Variables^.GetLast^.RecordVariables^.Add(
     754                VariableCreate(VarType^.Fields^.Items[I].Name, @VarType^.Fields^.Items[I]));
     755              I := I + 1;
     756            end;
     757          end;
    730758        end else ShowError('Unknown variable type ' + ReadNext);
    731759        if CheckNext('=') then begin
     
    802830    Expect('function');
    803831    FunctionContext := Func;
    804     Func^.Name := ReadNext;
    805     Func^.Parameters.TypeList := @MainProgram^.Types;
     832    repeat
     833      Func^.Name := ReadNext;
     834      if CheckNext('.') then begin
     835        Expect('.');
     836        Func^.ParentRecord := Func^.Types.GetByName(Func^.Name);
     837        Continue;
     838      end else Break;
     839    until False;
     840    Func^.Parameters.TypeList := @Func^.Types;
    806841    ParseParams(@Func^.Parameters);
    807842    Expect(':');
    808843    ReturnType := ReadNext;
    809     DataType := MainProgram.Types.GetByName(ReturnType);
     844    DataType := Func^.Types.GetByName(ReturnType);
    810845    if DataType <> nil then Func^.ReturnType := DataType
    811846      else ShowError('Unknown type ' + ReturnType);
     
    826861    Expect('procedure');
    827862    FunctionContext := Func;
    828     Func^.Name := ReadNext;
    829     Func^.Parameters.TypeList := @MainProgram^.Types;
     863    repeat
     864      Func^.Name := ReadNext;
     865      if CheckNext('.') then begin
     866        Expect('.');
     867        Continue;
     868      end else Break;
     869    until False;
     870    Func^.Parameters.TypeList := @Func^.Types;
    830871    ParseParams(@Func^.Parameters);
    831872    Expect(';');
     
    11261167  Directive: TDirective;
    11271168  NewType: TType;
     1169  NewFunc: TFunction;
    11281170begin
    11291171  OldInputText := InputText;
     
    11621204
    11631205  Expect('implementation');
     1206
     1207  repeat
     1208    SetLength(NewFunc.Parameters.Items, 0);
     1209    SetLength(NewFunc.Variables.Items, 0);
     1210    NewFunc.Types.ParentList := @UnitItem^.Types;
     1211    if ParseFunction(@NewFunc) then begin
     1212      UnitItem.Functions.Add(NewFunc);
     1213    end else
     1214    if ParseProcedure(@NewFunc) then begin
     1215      UnitItem.Functions.Add(NewFunc);
     1216    end else Break;
     1217  until False;
    11641218
    11651219  Expect('end');
     
    12691323    SetLength(NewFunc.Parameters.Items, 0);
    12701324    SetLength(NewFunc.Variables.Items, 0);
     1325    NewFunc.Types.ParentList := @ProgramCode^.Types;
    12711326    if ParseFunction(@NewFunc) then begin
    12721327      ProgramCode.Functions.Add(NewFunc);
  • branches/interpreter/interpreter4/Source.pas

    r104 r105  
    1818  PEnumerationStates = ^TEnumerationStates;
    1919  PFunction = ^TFunction;
     20  PVariables = ^TVariables;
    2021
    2122  TOperator = (opNone, opAdd, opSubtract, opAnd, opOr, opNot, opEqual, opNotEqual);
     
    5859    DataType: PType;
    5960    Index: Integer;
     61    RecordVariables: PVariables;
    6062  end;
    6163
     
    6365
    6466  TVariables = record
     67    ParentList: PVariables;
    6568    Items: array of TVariable;
    6669    procedure Add(Variable: TVariable);
    6770    function GetByName(Name: string): PVariable;
    68   end;
    69   PVariables = ^TVariables;
     71    function GetLast: PVariable;
     72  end;
    7073
    7174  TConstant = record
     
    173176    BeginEnd: TBeginEnd;
    174177    Variables: TVariables;
     178    Types: TTypes;
     179    ParentRecord: PType;
    175180  end;
    176181
     
    210215    Constants: TConstants;
    211216    UsesSection: TUses;
     217    Functions: TFunctions;
    212218  end;
    213219  PUnit = ^TUnit;
     
    343349  while (I < Length(Items)) and (Items[I].Name <> Name) do I := I + 1;
    344350  if I < Length(Items) then Result := @Items[I]
    345     else Result := nil;
     351    else begin
     352      if ParentList <> nil then Result := ParentList^.GetByName(Name)
     353        else Result := nil;
     354    end;
     355end;
     356
     357function TVariables.GetLast: PVariable;
     358begin
     359  Result := @Items[Length(Items) - 1];
    346360end;
    347361
Note: See TracChangeset for help on using the changeset viewer.