Changeset 14


Ignore:
Timestamp:
Nov 10, 2009, 8:19:41 AM (14 years ago)
Author:
george
Message:
  • Upraveno: Lepší zpracování parametrů procedůr.
Location:
branches/Void
Files:
4 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')
  • branches/Void/UModel.pas

    r13 r14  
    99
    1010type
     11  TValueType = (vtVariable, vtNumber, vtString, vtFloat, vtChar);
     12
    1113  TType = class
    1214    Name: string;
     
    1921  end;
    2022
     23  TVariableValue = class
     24    ValueType: TValueType;
     25    VariableDef: TVariable;
     26    StringConstant: string;
     27    NumberConstant: Integer;
     28    FloatConstant: Double;
     29    CharConstant: Char;
     30  end;
     31
    2132  TCommand = class
    2233    Name: string;
    23     Parameters: TStringList;
     34    Parameters: TList;
    2435    constructor Create;
    2536    destructor Destroy; override;
     
    3546  TProcedure = class
    3647    Name: string;
    37     Parameters: TStringList;
     48    Parameters: TList;
    3849    BeginEnd: TBeginEnd;
    3950    constructor Create;
    4051    destructor Destroy; override;
    4152  end;
    42 
    43   { TModule }
    4453
    4554  TModule = class
     
    119128constructor TCommand.Create;
    120129begin
    121   Parameters := TStringList.Create;
     130  Parameters := TList.Create;
    122131end;
    123132
    124133destructor TCommand.Destroy;
    125 begin
     134var
     135  I: Integer;
     136begin
     137  for I := 0 to Parameters.Count - 1 do
     138    TVariableValue(Parameters[I]).Destroy;
    126139  Parameters.Destroy;
    127140  inherited Destroy;
     
    131144begin
    132145  BeginEnd := TBeginEnd.Create;
    133   Parameters := TStringList.Create;
     146  Parameters := TList.Create;
    134147end;
    135148
    136149destructor TProcedure.Destroy;
    137 begin
     150var
     151  I: Integer;
     152begin
     153  for I := 0 to Parameters.Count - 1 do
     154    TVariableValue(Parameters[I]).Destroy;
    138155  Parameters.Destroy;
    139156  BeginEnd.Destroy;
     
    173190begin
    174191  I := 0;
    175   while (I < Variables.Count) and (TVariable(Variables[I]).Name <> AName) do
     192  while (I < Variables.Count) and (LowerCase(TVariable(Variables[I]).Name) <> LowerCase(AName)) do
    176193    Inc(I);
    177194  if I < Variables.Count then Result := Variables[I] else Result := nil;
     
    183200begin
    184201  I := 0;
    185   while (I < Procedures.Count) and (TProcedure(Procedures[I]).Name <> AName) do
     202  while (I < Procedures.Count) and (LowerCase(TProcedure(Procedures[I]).Name) <> LowerCase(AName)) do
    186203    Inc(I);
    187204  if I < Procedures.Count then Result := Procedures[I] else Result := nil;
     
    211228  with TProcedure(Procedures[Procedures.Add(TProcedure.Create)]) do begin
    212229    Name := 'WriteLn';
     230    with TVariable(Parameters[Parameters.Add(TVariable.Create)]) do begin
     231      Name := 'Text';
     232      VarType := FindTypeByName('String');
     233    end;
    213234  end;
    214235  with TProcedure(Procedures[Procedures.Add(TProcedure.Create)]) do begin
     
    236257begin
    237258  I := 0;
    238   while (I < Types.Count) and (TType(Types[I]).Name <> AName) do
     259  while (I < Types.Count) and (LowerCase(TType(Types[I]).Name) <> LowerCase(AName)) do
    239260    Inc(I);
    240261  if I < Types.Count then Result := Types[I] else Result := nil;
  • 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;
  • branches/Void/project1.lpi

    r13 r14  
    99      <Icon Value="0"/>
    1010      <UseXPManifest Value="True"/>
    11       <ActiveEditorIndexAtStart Value="4"/>
     11      <ActiveEditorIndexAtStart Value="3"/>
    1212    </General>
    1313    <VersionInfo>
     
    3333      </Item1>
    3434    </RequiredPackages>
    35     <Units Count="14">
     35    <Units Count="15">
    3636      <Unit0>
    3737        <Filename Value="project1.lpr"/>
     
    4141        <TopLine Value="1"/>
    4242        <EditorIndex Value="4"/>
    43         <UsageCount Value="40"/>
     43        <UsageCount Value="42"/>
    4444        <Loaded Value="True"/>
    4545      </Unit0>
     
    5353        <TopLine Value="28"/>
    5454        <EditorIndex Value="0"/>
    55         <UsageCount Value="40"/>
     55        <UsageCount Value="42"/>
    5656        <Loaded Value="True"/>
    5757      </Unit1>
     
    5959        <Filename Value="UCompilator.pas"/>
    6060        <UnitName Value="UCompilator"/>
    61         <CursorPos X="33" Y="91"/>
    62         <TopLine Value="82"/>
     61        <CursorPos X="53" Y="168"/>
     62        <TopLine Value="149"/>
    6363        <EditorIndex Value="1"/>
    64         <UsageCount Value="20"/>
     64        <UsageCount Value="21"/>
    6565        <Loaded Value="True"/>
    6666      </Unit2>
     
    6969        <IsPartOfProject Value="True"/>
    7070        <UnitName Value="UOutputGenerator"/>
    71         <CursorPos X="32" Y="151"/>
    72         <TopLine Value="143"/>
     71        <CursorPos X="7" Y="160"/>
     72        <TopLine Value="127"/>
    7373        <EditorIndex Value="3"/>
    74         <UsageCount Value="40"/>
     74        <UsageCount Value="42"/>
    7575        <Loaded Value="True"/>
    7676      </Unit3>
     
    8080        <CursorPos X="4" Y="1"/>
    8181        <TopLine Value="1"/>
    82         <UsageCount Value="40"/>
     82        <UsageCount Value="42"/>
    8383        <SyntaxHighlighter Value="None"/>
    8484      </Unit4>
     
    8787        <IsPartOfProject Value="True"/>
    8888        <UnitName Value="UModel"/>
    89         <CursorPos X="19" Y="18"/>
    90         <TopLine Value="1"/>
     89        <CursorPos X="27" Y="229"/>
     90        <TopLine Value="215"/>
    9191        <EditorIndex Value="6"/>
    92         <UsageCount Value="40"/>
     92        <UsageCount Value="42"/>
    9393        <Loaded Value="True"/>
    9494      </Unit5>
     
    125125        <TopLine Value="45"/>
    126126        <EditorIndex Value="2"/>
    127         <UsageCount Value="40"/>
     127        <UsageCount Value="42"/>
    128128        <Loaded Value="True"/>
    129129      </Unit10>
     
    145145        <UnitName Value="strutils"/>
    146146        <CursorPos X="1" Y="1"/>
    147         <TopLine Value="43"/>
     147        <TopLine Value="1"/>
    148148        <EditorIndex Value="5"/>
     149        <UsageCount Value="11"/>
     150        <Loaded Value="True"/>
     151      </Unit13>
     152      <Unit14>
     153        <Filename Value="..\..\..\..\..\Programy\Lazarus_0.9.29\fpc\2.3.1\source\rtl\objpas\sysutils\sysutilh.inc"/>
     154        <CursorPos X="4" Y="36"/>
     155        <TopLine Value="21"/>
    149156        <UsageCount Value="10"/>
    150         <Loaded Value="True"/>
    151       </Unit13>
     157      </Unit14>
    152158    </Units>
    153159    <JumpHistory Count="30" HistoryIndex="29">
    154160      <Position1>
    155161        <Filename Value="UCompilator.pas"/>
    156         <Caret Line="86" Column="1" TopLine="70"/>
     162        <Caret Line="148" Column="1" TopLine="133"/>
    157163      </Position1>
    158164      <Position2>
    159165        <Filename Value="UCompilator.pas"/>
    160         <Caret Line="87" Column="1" TopLine="71"/>
     166        <Caret Line="149" Column="1" TopLine="134"/>
    161167      </Position2>
    162168      <Position3>
    163169        <Filename Value="UCompilator.pas"/>
    164         <Caret Line="89" Column="1" TopLine="73"/>
     170        <Caret Line="183" Column="1" TopLine="168"/>
    165171      </Position3>
    166172      <Position4>
    167173        <Filename Value="UCompilator.pas"/>
    168         <Caret Line="90" Column="1" TopLine="74"/>
     174        <Caret Line="184" Column="1" TopLine="169"/>
    169175      </Position4>
    170176      <Position5>
    171177        <Filename Value="UCompilator.pas"/>
    172         <Caret Line="91" Column="1" TopLine="75"/>
     178        <Caret Line="185" Column="1" TopLine="170"/>
    173179      </Position5>
    174180      <Position6>
    175181        <Filename Value="UCompilator.pas"/>
    176         <Caret Line="92" Column="1" TopLine="76"/>
     182        <Caret Line="186" Column="1" TopLine="171"/>
    177183      </Position6>
    178184      <Position7>
    179185        <Filename Value="UCompilator.pas"/>
    180         <Caret Line="94" Column="1" TopLine="78"/>
     186        <Caret Line="187" Column="1" TopLine="172"/>
    181187      </Position7>
    182188      <Position8>
    183189        <Filename Value="UCompilator.pas"/>
    184         <Caret Line="95" Column="1" TopLine="79"/>
     190        <Caret Line="188" Column="1" TopLine="173"/>
    185191      </Position8>
    186192      <Position9>
    187193        <Filename Value="UCompilator.pas"/>
    188         <Caret Line="96" Column="1" TopLine="80"/>
     194        <Caret Line="190" Column="1" TopLine="175"/>
    189195      </Position9>
    190196      <Position10>
    191197        <Filename Value="UCompilator.pas"/>
    192         <Caret Line="98" Column="1" TopLine="82"/>
     198        <Caret Line="191" Column="1" TopLine="176"/>
    193199      </Position10>
    194200      <Position11>
    195201        <Filename Value="UCompilator.pas"/>
    196         <Caret Line="100" Column="1" TopLine="84"/>
     202        <Caret Line="192" Column="1" TopLine="177"/>
    197203      </Position11>
    198204      <Position12>
    199205        <Filename Value="UCompilator.pas"/>
    200         <Caret Line="101" Column="1" TopLine="85"/>
     206        <Caret Line="193" Column="1" TopLine="178"/>
    201207      </Position12>
    202208      <Position13>
    203209        <Filename Value="UCompilator.pas"/>
    204         <Caret Line="103" Column="1" TopLine="87"/>
     210        <Caret Line="194" Column="1" TopLine="179"/>
    205211      </Position13>
    206212      <Position14>
    207213        <Filename Value="UCompilator.pas"/>
    208         <Caret Line="107" Column="1" TopLine="91"/>
     214        <Caret Line="212" Column="1" TopLine="197"/>
    209215      </Position14>
    210216      <Position15>
    211217        <Filename Value="UCompilator.pas"/>
    212         <Caret Line="108" Column="1" TopLine="92"/>
     218        <Caret Line="213" Column="1" TopLine="198"/>
    213219      </Position15>
    214220      <Position16>
    215221        <Filename Value="UCompilator.pas"/>
    216         <Caret Line="110" Column="1" TopLine="94"/>
     222        <Caret Line="214" Column="1" TopLine="199"/>
    217223      </Position16>
    218224      <Position17>
    219225        <Filename Value="UCompilator.pas"/>
    220         <Caret Line="111" Column="1" TopLine="95"/>
     226        <Caret Line="215" Column="1" TopLine="200"/>
    221227      </Position17>
    222228      <Position18>
    223229        <Filename Value="UCompilator.pas"/>
    224         <Caret Line="112" Column="1" TopLine="96"/>
     230        <Caret Line="216" Column="22" TopLine="187"/>
    225231      </Position18>
    226232      <Position19>
    227         <Filename Value="UCompilator.pas"/>
    228         <Caret Line="113" Column="1" TopLine="97"/>
     233        <Filename Value="UOutputGenerator.pas"/>
     234        <Caret Line="116" Column="26" TopLine="100"/>
    229235      </Position19>
    230236      <Position20>
    231         <Filename Value="UCompilator.pas"/>
    232         <Caret Line="114" Column="1" TopLine="98"/>
     237        <Filename Value="UOutputGenerator.pas"/>
     238        <Caret Line="74" Column="44" TopLine="59"/>
    233239      </Position20>
    234240      <Position21>
    235         <Filename Value="UModel.pas"/>
    236         <Caret Line="54" Column="50" TopLine="40"/>
     241        <Filename Value="UOutputGenerator.pas"/>
     242        <Caret Line="114" Column="52" TopLine="99"/>
    237243      </Position21>
    238244      <Position22>
    239245        <Filename Value="UOutputGenerator.pas"/>
    240         <Caret Line="118" Column="12" TopLine="106"/>
     246        <Caret Line="150" Column="44" TopLine="135"/>
    241247      </Position22>
    242248      <Position23>
    243         <Filename Value="UOutputGenerator.pas"/>
    244         <Caret Line="82" Column="53" TopLine="61"/>
     249        <Filename Value="UCompilator.pas"/>
     250        <Caret Line="216" Column="22" TopLine="187"/>
    245251      </Position23>
    246252      <Position24>
    247         <Filename Value="UOutputGenerator.pas"/>
    248         <Caret Line="35" Column="48" TopLine="20"/>
     253        <Filename Value="UModel.pas"/>
     254        <Caret Line="230" Column="15" TopLine="211"/>
    249255      </Position24>
    250256      <Position25>
    251         <Filename Value="UOutputGenerator.pas"/>
    252         <Caret Line="122" Column="41" TopLine="109"/>
     257        <Filename Value="UModel.pas"/>
     258        <Caret Line="232" Column="22" TopLine="212"/>
    253259      </Position25>
    254260      <Position26>
    255         <Filename Value="UOutputGenerator.pas"/>
    256         <Caret Line="18" Column="20" TopLine="4"/>
     261        <Filename Value="UModel.pas"/>
     262        <Caret Line="192" Column="96" TopLine="187"/>
    257263      </Position26>
    258264      <Position27>
    259         <Filename Value="UOutputGenerator.pas"/>
    260         <Caret Line="45" Column="42" TopLine="43"/>
     265        <Filename Value="UModel.pas"/>
     266        <Caret Line="11" Column="16" TopLine="1"/>
    261267      </Position27>
    262268      <Position28>
    263         <Filename Value="UOutputGenerator.pas"/>
    264         <Caret Line="42" Column="28" TopLine="40"/>
     269        <Filename Value="UModel.pas"/>
     270        <Caret Line="46" Column="8" TopLine="19"/>
    265271      </Position28>
    266272      <Position29>
    267         <Filename Value="UOutputGenerator.pas"/>
    268         <Caret Line="8" Column="34" TopLine="1"/>
     273        <Filename Value="UModel.pas"/>
     274        <Caret Line="229" Column="27" TopLine="215"/>
    269275      </Position29>
    270276      <Position30>
    271         <Filename Value="project1.lpr"/>
    272         <Caret Line="16" Column="21" TopLine="1"/>
     277        <Filename Value="UCompilator.pas"/>
     278        <Caret Line="167" Column="107" TopLine="148"/>
    273279      </Position30>
    274280    </JumpHistory>
Note: See TracChangeset for help on using the changeset viewer.