Ignore:
Timestamp:
Nov 10, 2009, 8:19:41 AM (15 years ago)
Author:
george
Message:
  • Upraveno: Lepší zpracování parametrů procedůr.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/Void/UCompilator.pas

    r13 r14  
    1010type
    1111  TOnErrorEvent = procedure (Text: string; var Terminate: Boolean; Position: TPoint) of object;
    12 
    13   { TCompilator }
    1412
    1513  TCompilator = class
     
    135133  Command: TProcedure;
    136134  Variable: TVariable;
     135  SourceVariable: TVariable;
    137136  VariableName: string;
    138137  Value: string;
     138  P: Integer;
    139139begin
    140140  Parser.ParseNextToken;
     
    151151            Name := CommandName;
    152152            Parser.ParseNextToken;
    153             if (Parser.TokenType = ttSymbol) and (Parser.TokenValue = '(') then begin
    154               Parser.ParseNextToken;
    155               if (Parser.TokenType <> ttString) then DoError('Expected string');
    156               Parameters.Add(Parser.TokenValue);
    157               Parser.ParseNextToken;
    158               if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue = ')') then
    159                 DoError('Expected )');
     153            if Command.Parameters.Count > 0 then begin
     154              if (Parser.TokenType = ttSymbol) and (Parser.TokenValue = '(') then begin
     155                Parser.ParseNextToken;
     156                for P := 0 to Command.Parameters.Count - 1 do begin
     157                  if (Parser.TokenType = ttString) then
     158                  with TVariableValue(Parameters[Parameters.Add(TVariableValue.Create)]) do begin
     159                    ValueType := vtString;
     160                    StringConstant := Parser.TokenValue;
     161                  end else
     162                  if (Parser.TokenType = ttIdentifier) then
     163                  with TVariableValue(Parameters[Parameters.Add(TVariableValue.Create)]) do begin
     164                    ValueType := vtVariable;
     165                    SourceVariable := FindVariableByName(Parser.TokenValue);
     166                    if Assigned(SourceVariable) then begin
     167                      VariableDef := SourceVariable;
     168                    end else DoError('Unknown identifier ' + Parser.TokenValue);
     169                  end else DoError('Unknown parameter ' + Parser.TokenValue);
     170                  if P <> Command.Parameters.Count - 1 then begin
     171                    Parser.ParseNextToken;
     172                    if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue = ',') then
     173                      DoError('Expected ,');
     174                  end;
     175                  Parser.ParseNextToken;
     176                end;
     177                if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue = ')') then
     178                  DoError('Expected )');
     179              end else DoError('Expected (');
    160180            end;
    161181          end;
     
    173193            Value := Parser.TokenValue;
    174194            if Parser.TokenType = ttIdentifier then begin
    175               Variable := FindVariableByName(CommandName);
    176               if Assigned(Variable) then
    177               with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    178                 Name := 'Assignment';
    179                 Parameters.Add(CommandName);
    180                 Parameters.Add(Value);
    181               end else DoError('Undefined variable ' + CommandName);
     195              SourceVariable := FindVariableByName(Value);
     196              if not Assigned(SourceVariable) then DoError('Undefined source variable ' + Value)
     197              else begin
     198                Variable := FindVariableByName(CommandName);
     199                if Assigned(Variable) then
     200                with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
     201                  Name := 'Assignment';
     202                  with TVariableValue(Parameters[Parameters.Add(TVariableValue.Create)]) do begin
     203                    ValueType := vtVariable;
     204                    Variable := Variable;
     205                  end;
     206                  with TVariableValue(Parameters[Parameters.Add(TVariableValue.Create)]) do begin
     207                    ValueType := vtVariable;
     208                    VariableDef := SourceVariable;
     209                  end;
     210                end;
     211              end;
    182212            end else if Parser.TokenType = ttString then begin
    183213              with TCommand(Commands[Commands.Add(TCommand.Create)]) do begin
    184214                Name := 'Assignment';
    185                 Parameters.Add(CommandName);
    186                 Parameters.Add(Value);
     215                with TVariableValue(Parameters[Parameters.Add(TVariableValue.Create)]) do begin
     216                  ValueType := vtVariable;
     217                  VariableDef := Variable;
     218                end;
     219                with TVariableValue(Parameters[Parameters.Add(TVariableValue.Create)]) do begin
     220                  ValueType := vtString;
     221                  StringConstant := Parser.TokenValue;
     222                end;
    187223              end;
    188224            end else DoError('Expected variable or string')
Note: See TracChangeset for help on using the changeset viewer.