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/UOutputGenerator.pas

    r13 r14  
    2121  end;
    2222
     23  { TPascalGenerator }
     24
    2325  TPascalGenerator = class(TOutputGenerator)
     26  private
     27    function GenerateVariableValue(Value: TVariableValue): string;
     28  public
    2429    procedure Generate(Model: TModel); override;
    2530    procedure GenerateModule(Module: TModule);
    2631  end;
     32
     33  { TCGenerator }
    2734
    2835  TCGenerator = class(TOutputGenerator)
    2936  private
    3037    function ConvertType(Name: string): string;
     38    function GenerateVariableValue(Value: TVariableValue): string;
    3139  public
    3240    procedure Generate(Model: TModel); override;
     
    6068
    6169{ TPascalGenerator }
     70
     71function TPascalGenerator.GenerateVariableValue(Value: TVariableValue): string;
     72begin
     73  case Value.ValueType of
     74    vtVariable: if Assigned(Value.VariableDef) then Result := Value.VariableDef.Name
     75      else Result := '';
     76    vtFloat: Result := FloatToStr(Value.FloatConstant);
     77    vtNumber: Result := IntToStr(Value.NumberConstant);
     78    vtString: Result := '''' + Value.StringConstant + '''';
     79    vtChar: Result := '''' + Value.CharConstant + '''';
     80  end;
     81end;
    6282
    6383procedure TPascalGenerator.Generate(Model: TModel);
     
    92112    for I := 0 to BeginEnd.Commands.Count - 1 do
    93113      with TCommand(BeginEnd.Commands[I]) do begin
    94         if Name = 'Assignment' then Output.Add(Indent + Parameters[0] + ' := ' + Parameters[1] + ';')
     114        if Name = 'Assignment' then Output.Add(Indent +
     115          TVariableValue(Parameters[0]).VariableDef.Name + ' := ' +
     116          GenerateVariableValue(TVariableValue(Parameters[1])) + ';')
    95117        else begin
    96118        Row := Name;
     
    98120          ParameterText := '';
    99121          for P := 0 to Parameters.Count - 1 do
    100             ParameterText := ParameterText + '''' + Parameters[P] + ''', ';
     122            ParameterText := ParameterText + GenerateVariableValue(Parameters[P]) + ', ';
    101123          Row := Row + '(' + Copy(ParameterText, 1, Length(ParameterText) - 2) + ')';
    102124        end;
     
    124146end;
    125147
     148function TCGenerator.GenerateVariableValue(Value: TVariableValue): string;
     149begin
     150  case Value.ValueType of
     151    vtVariable: if Assigned(Value.VariableDef) then Result := Value.VariableDef.Name
     152      else Result := '';
     153    vtFloat: Result := FloatToStr(Value.FloatConstant);
     154    vtNumber: Result := IntToStr(Value.NumberConstant);
     155    vtString: Result := '"' + Value.StringConstant + '"';
     156    vtChar: Result := '''' + Value.CharConstant + '''';
     157  end;
     158end;
     159
    126160procedure TCGenerator.Generate(Model: TModel);
    127161begin
     
    145179    Inc(IndentCount);
    146180
    147     // variable section
     181    // Variable section
    148182    for I := 0 to Variables.Count - 1 do
    149183      with TVariable(Variables[I]) do
    150         Output.Add(Indent + '  ' + ConvertType(VarType.Name) + ' ' + Name + ';');
     184        Output.Add(Indent + ConvertType(VarType.Name) + ' ' + Name + ';');
    151185    if Variables.Count > 0 then Output.Add('');
    152186
     
    154188    for I := 0 to BeginEnd.Commands.Count - 1 do
    155189      with TCommand(BeginEnd.Commands[I]) do begin
    156         if Name = 'Assignment' then Output.Add(Indent + Parameters[0] + ' = ' + Parameters[1] + ';')
     190        if Name = 'Assignment' then Output.Add(Indent +
     191          TVariableValue(Parameters[0]).VariableDef.Name + ' = ' +
     192          GenerateVariableValue(TVariableValue(Parameters[1])) + ';')
    157193        else begin
    158194          if Name = 'WriteLn' then Row := 'printf'
     
    163199            ParameterText := '';
    164200            for P := 0 to Parameters.Count - 1 do
    165               ParameterText := ParameterText + '''' + Parameters[P] + ''', ';
     201              ParameterText := ParameterText + GenerateVariableValue(Parameters[P]) + ', ';
    166202            Row := Row + Copy(ParameterText, 1, Length(ParameterText) - 2);
    167203          end;
Note: See TracChangeset for help on using the changeset viewer.