Changeset 43


Ignore:
Timestamp:
Aug 5, 2010, 4:17:18 PM (14 years ago)
Author:
george
Message:

End parsing process on reaching data end.

Location:
branches/DelphiToC
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/DelphiToC/Analyze/UPascalParser.pas

    r42 r43  
    1010
    1111type
     12  EEndOfData = class(Exception);
     13
    1214  TPascalParser = class;
    1315
     
    2426  TParserExpression = class
    2527    class function Parse(Parser: TPascalParser; SourceCode: TExpression): TExpression;
     28  end;
     29
     30  { TParserUsedModuleList }
     31
     32  TParserUsedModuleList = class
     33    class procedure Parse(Parser: TPascalParser; SourceCode: TUsedModuleList);
    2634  end;
    2735
     
    108116  SRedefineIdentifier = 'Identificator "%s" redefinition.';
    109117  STypeNotDefined = 'Type "%s" not defined.';
     118  SEndOfDataReached = 'Parser reached to end of input data.';
     119
    110120
    111121{ TPascalParser }
     
    122132  if NextCode <> Code then begin
    123133    ErrorMessage(SExpectedButFound, [Code, NextCode]);
     134
     135    // Recovery: try to find nearest same code
     136    while NextCode <> Code do
     137      ReadCode;
    124138  end;
    125139  ReadCode;
     
    210224  with SourceCodeText do
    211225  while Result = '' do begin
    212     while IsWhiteSpace(Text[I]) do Inc(I);
     226    while IsWhiteSpace(Text[I]) and (I < Length(Text)) do Inc(I);
     227    if I = Length(Text) then
     228      raise EEndOfData.Create(SEndOfDataReached);
    213229    J := I;
    214     if Copy(Text, J, 1) = '//' then begin
     230    if Copy(Text, J, 2) = '//' then begin
     231      // Line comment
    215232      while (Text[I] <> #13) and (Text[I] <> #10) do Inc(I);
    216233      Result := '';
    217234    end else
    218235    if Copy(Text, J, 1) = '{' then begin
     236      // Block comment 1
    219237      while (Text[I] <> '}') do Inc(I);
    220238      Result := '';
    221239    end else
    222     if Copy(Text, J, 1) = '(*' then begin
     240    if Copy(Text, J, 2) = '(*' then begin
     241      // Block comment 2
    223242      while not((Text[I] = '*') and (Text[I + 1] = ')')) do Inc(I);
    224243      Result := '';
    225244    end else
    226245    if Text[J] = '''' then begin
     246      // String constant
    227247      I := J + 1;
    228248      while not ((Text[I] = '''') and (Text[I + 1] <> '''')) do Inc(I);
    229249      Inc(I);
    230       Result := Copy(Text, J, I - J );
     250      Result := Copy(Text, J, I - J);
    231251    end else
    232252    if (Text[J] in SpecChar) then begin
     253      // Special char token
    233254      if (Text[J + 1] in SpecChar) then begin
    234255        for II := 0 to High(DoubleSpecChar) do
     
    245266      end;
    246267    end else begin
    247       while IsAlphanumeric(Text[I]) do Inc(I);
    248       Result := LowerCase(Copy(Text, J, I - J));
     268      if IsAlphabetic(Text[I]) then begin
     269        // Identifier
     270        while IsAlphanumeric(Text[I]) do Inc(I);
     271        Result := Copy(Text, J, I - J);
     272      end else begin
     273        while not IsWhiteSpace(Text[I]) do Inc(I);
     274        Result := Copy(Text, J, I - J);
     275      end;
    249276    end;
    250277    J := I;
     
    472499    end;
    473500  end;
    474 
    475 (*    begin
    476       Expect('if');
    477       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    478         Instruction := inConditionalJump;
    479         ExpressionTree := ParseCommonBlockExpression(CommonBlock);
    480         Negative := True;
    481       end;
    482       First := Operations[Operations.Count - 1];
    483       Expect('then');
    484       ParseCommonBlockOperation(CommonBlock);
    485       if NextCode = 'else' then begin
    486         with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    487           Instruction := inJump;
    488         end;
    489         Second := Operations[Operations.Count - 1];
    490         First.GotoAddress := Operations.Count;
    491         Expect('else');
    492         ParseCommonBlockOperation(CommonBlock);
    493         Second.GotoAddress := Operations.Count;
    494       end else First.GotoAddress := Operations.Count;
    495     end
    496     else if NextCode = 'repeat' then begin
    497       Expect('repeat');
    498       StartIndex := Operations.Count;
    499       ParseCommonBlockOperation(CommonBlock);
    500       Expect('until');
    501       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    502         Instruction := inConditionalJump;
    503         ExpressionTree := ParseCommonBlockExpression(CommonBlock);
    504         GotoAddress := StartIndex;
    505       end;
    506     end
    507     else if NextCode = 'while' then begin
    508       Expect('while');
    509       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    510         Instruction := inConditionalJump;
    511         ExpressionTree := ParseCommonBlockExpression(CommonBlock);
    512       end;
    513       First := Operations[Operations.Count - 1];
    514       StartIndex := Operations.Count - 1;
    515       Expect('do');
    516       ParseCommonBlockOperation(CommonBlock);
    517       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    518         Instruction := inJump;
    519         GotoAddress := StartIndex;
    520       end;
    521       First.GotoAddress := Operations.Count;
    522     end
    523     else if NextCode = 'for' then begin
    524       Expect('for');
    525       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    526         Instruction := inExpressionEvaluation;
    527         ExpressionTree := ParseCommonBlockExpression(CommonBlock);
    528         if (ExpressionTree.NodeType <> ntOperator) and
    529           (ExpressionTree.OperatorName <> ':=') then ErrorMessage('Expected assigment in for loop');
    530         if TExpression(TExpression(ExpressionTree).SubItems[0]).NodeType <> ntVariable then
    531           ErrorMessage('Index in FOR loop have to be variable');
    532         LoopVaraible := TExpression(TExpression(ExpressionTree).SubItems[0]).Variable;
    533       end;
    534       Expect('to');
    535       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    536         Instruction := inExpressionEvaluation;
    537         ExpressionTree := TExpression.Create;
    538         with ExpressionTree do begin
    539           NodeType := ntOperator;
    540           OperatorName := '=';
    541           SubItems[0] := TExpression.Create;
    542           with TExpression(SubItems[0]) do begin
    543             NodeType := ntVariable;
    544             Variable := LoopVaraible;
    545           end;
    546           SubItems[1] := ParseCommonBlockExpression(CommonBlock);
    547         end;
    548         Negative := True;
    549       end;
    550       First := Operations[Operations.Count - 1];
    551       StartIndex := Operations.Count - 1;
    552       Expect('do');
    553       ParseCommonBlockOperation(CommonBlock);
    554       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    555         Instruction := inExpressionEvaluation;
    556         ExpressionTree := TExpression.Create;
    557         with ExpressionTree do begin
    558           NodeType := ntOperator;
    559           OperatorName := ':=';
    560           SubItems[0] := TExpression.Create;
    561           with TExpression(SubItems[0]) do begin
    562             NodeType := ntVariable;
    563             Variable := LoopVaraible;
    564           end;
    565           SubItems[1] := TExpression.Create;
    566           with TExpression(SubItems[1]) do begin
    567             NodeType := ntOperator;
    568             OperatorName := '+';
    569             SubItems[0] := TExpression.Create;
    570             with TExpression(SubItems[0]) do begin
    571               NodeType := ntVariable;
    572               Variable := LoopVaraible;
    573             end;
    574             SubItems[1] := TExpression.Create;
    575             with TExpression(SubItems[1]) do begin
    576               NodeType := ntConstant;
    577               //SetLength(Value, 1);
    578               //Value[0] := 1;
    579               Value := 1;
    580             end;
    581           end;
    582         end;
    583       end;
    584       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    585         Instruction := inJump;
    586         GotoAddress := StartIndex;
    587       end;
    588       First.GotoAddress := Operations.Count;
    589     end
    590     else begin
    591       with TOperation(Operations[Operations.Add(TOperation.Create)]) do begin
    592         Instruction := inExpressionEvaluation;
    593         ExpressionTree := ParseCommonBlockExpression(CommonBlock);
    594       end;
    595     end;
    596   *)
    597501end;
    598502
     
    623527
    624528    // Uses section
    625     if NextCode = 'uses' then begin
    626       Identifier := ReadCode;
    627       while NextCode = ',' do begin
    628         Identifier := ReadCode;
    629 
    630       end;
    631     end;
     529    if NextCode = 'uses' then
     530      TParserUsedModuleList.Parse(Parser, UsedModules);
     531
    632532    TParserCommonBlock.Parse(Parser, SourceCode, '.');
    633533  end;
     
    912812end;
    913813
     814{ TParserUsedModuleList }
     815
     816class procedure TParserUsedModuleList.Parse(Parser: TPascalParser;
     817  SourceCode: TUsedModuleList);
     818var
     819  NewUsedModule: TUsedModule;
     820begin
     821  with Parser do begin
     822    Expect('uses');
     823    with TUsedModule(SourceCode.Items[SourceCode.Add(TUsedModule.Create)]) do begin
     824      Name := ReadCode;
     825    end;
     826    while NextCode = ',' do begin
     827      Expect(',');
     828      with TUsedModule(SourceCode.Items[SourceCode.Add(TUsedModule.Create)]) do begin
     829        Name := ReadCode;
     830      end;
     831    end;
     832    Expect(';');
     833  end;
     834end;
     835
    914836end.
  • branches/DelphiToC/DelphiToC.lpi

    r42 r43  
    4040        <Filename Value="DelphiToC.lpr"/>
    4141        <IsPartOfProject Value="True"/>
     42        <IsVisibleTab Value="True"/>
    4243        <EditorIndex Value="11"/>
    4344        <WindowIndex Value="0"/>
    44         <TopLine Value="3"/>
    45         <CursorPos X="39" Y="12"/>
    46         <UsageCount Value="64"/>
     45        <TopLine Value="4"/>
     46        <CursorPos X="27" Y="16"/>
     47        <UsageCount Value="66"/>
    4748        <Loaded Value="True"/>
    4849      </Unit0>
     
    5859        <TopLine Value="69"/>
    5960        <CursorPos X="1" Y="91"/>
    60         <UsageCount Value="64"/>
     61        <UsageCount Value="66"/>
    6162        <Loaded Value="True"/>
    6263        <LoadedDesigner Value="True"/>
     
    6970        <TopLine Value="1"/>
    7071        <CursorPos X="1" Y="1"/>
    71         <UsageCount Value="64"/>
     72        <UsageCount Value="66"/>
    7273      </Unit2>
    7374      <Unit3>
     
    7778        <EditorIndex Value="5"/>
    7879        <WindowIndex Value="0"/>
    79         <TopLine Value="264"/>
    80         <CursorPos X="59" Y="277"/>
    81         <UsageCount Value="64"/>
     80        <TopLine Value="15"/>
     81        <CursorPos X="19" Y="34"/>
     82        <UsageCount Value="66"/>
    8283        <Loaded Value="True"/>
    8384      </Unit3>
     
    8889        <EditorIndex Value="10"/>
    8990        <WindowIndex Value="0"/>
    90         <TopLine Value="38"/>
    91         <CursorPos X="38" Y="13"/>
    92         <UsageCount Value="64"/>
     91        <TopLine Value="25"/>
     92        <CursorPos X="21" Y="38"/>
     93        <UsageCount Value="66"/>
    9394        <Loaded Value="True"/>
    9495      </Unit4>
     
    101102        <TopLine Value="1"/>
    102103        <CursorPos X="9" Y="12"/>
    103         <UsageCount Value="64"/>
     104        <UsageCount Value="66"/>
    104105        <Loaded Value="True"/>
    105106      </Unit5>
     
    112113        <TopLine Value="1"/>
    113114        <CursorPos X="1" Y="1"/>
    114         <UsageCount Value="64"/>
     115        <UsageCount Value="66"/>
    115116        <Loaded Value="True"/>
    116117      </Unit6>
     
    119120        <IsPartOfProject Value="True"/>
    120121        <UnitName Value="UCSource"/>
    121         <IsVisibleTab Value="True"/>
    122122        <EditorIndex Value="9"/>
    123123        <WindowIndex Value="0"/>
    124         <TopLine Value="156"/>
    125         <CursorPos X="67" Y="164"/>
    126         <UsageCount Value="64"/>
     124        <TopLine Value="75"/>
     125        <CursorPos X="63" Y="89"/>
     126        <UsageCount Value="66"/>
    127127        <Loaded Value="True"/>
    128128      </Unit7>
     
    133133        <EditorIndex Value="0"/>
    134134        <WindowIndex Value="0"/>
    135         <TopLine Value="148"/>
    136         <CursorPos X="25" Y="153"/>
    137         <UsageCount Value="64"/>
     135        <TopLine Value="136"/>
     136        <CursorPos X="1" Y="149"/>
     137        <UsageCount Value="66"/>
    138138        <Loaded Value="True"/>
    139139      </Unit8>
     
    153153        <TopLine Value="68"/>
    154154        <CursorPos X="14" Y="90"/>
    155         <UsageCount Value="32"/>
     155        <UsageCount Value="33"/>
    156156        <Loaded Value="True"/>
    157157      </Unit10>
     
    170170        <TopLine Value="61"/>
    171171        <CursorPos X="7" Y="68"/>
    172         <UsageCount Value="15"/>
     172        <UsageCount Value="16"/>
    173173        <Loaded Value="True"/>
    174174      </Unit12>
     
    179179        <TopLine Value="139"/>
    180180        <CursorPos X="16" Y="146"/>
    181         <UsageCount Value="15"/>
     181        <UsageCount Value="16"/>
    182182        <Loaded Value="True"/>
    183183      </Unit13>
     
    194194        <TopLine Value="834"/>
    195195        <CursorPos X="11" Y="847"/>
    196         <UsageCount Value="10"/>
     196        <UsageCount Value="9"/>
    197197      </Unit15>
    198198      <Unit16>
     
    211211        <TopLine Value="112"/>
    212212        <CursorPos X="1" Y="128"/>
    213         <UsageCount Value="26"/>
     213        <UsageCount Value="28"/>
    214214        <Loaded Value="True"/>
    215215      </Unit17>
     
    225225    <JumpHistory Count="30" HistoryIndex="29">
    226226      <Position1>
    227         <Filename Value="Produce\UCSource.pas"/>
    228         <Caret Line="23" Column="48" TopLine="9"/>
     227        <Filename Value="Analyze\UPascalParser.pas"/>
     228        <Caret Line="234" Column="1" TopLine="213"/>
    229229      </Position1>
    230230      <Position2>
    231         <Filename Value="Produce\UCSource.pas"/>
    232         <Caret Line="26" Column="1" TopLine="10"/>
     231        <Filename Value="Analyze\UPascalParser.pas"/>
     232        <Caret Line="238" Column="1" TopLine="217"/>
    233233      </Position2>
    234234      <Position3>
    235         <Filename Value="Produce\UCSource.pas"/>
    236         <Caret Line="27" Column="59" TopLine="11"/>
     235        <Filename Value="Analyze\UPascalParser.pas"/>
     236        <Caret Line="242" Column="1" TopLine="221"/>
    237237      </Position3>
    238238      <Position4>
    239         <Filename Value="Produce\UCSource.pas"/>
    240         <Caret Line="28" Column="66" TopLine="11"/>
     239        <Filename Value="Analyze\UPascalParser.pas"/>
     240        <Caret Line="248" Column="1" TopLine="235"/>
    241241      </Position4>
    242242      <Position5>
    243         <Filename Value="Produce\UCSource.pas"/>
    244         <Caret Line="136" Column="3" TopLine="127"/>
     243        <Filename Value="Analyze\UPascalParser.pas"/>
     244        <Caret Line="264" Column="1" TopLine="251"/>
    245245      </Position5>
    246246      <Position6>
    247         <Filename Value="Produce\UCSource.pas"/>
    248         <Caret Line="85" Column="14" TopLine="76"/>
     247        <Filename Value="Analyze\UPascalParser.pas"/>
     248        <Caret Line="266" Column="1" TopLine="251"/>
    249249      </Position6>
    250250      <Position7>
    251         <Filename Value="Produce\UCSource.pas"/>
    252         <Caret Line="91" Column="38" TopLine="78"/>
     251        <Filename Value="Analyze\UPascalParser.pas"/>
     252        <Caret Line="225" Column="1" TopLine="212"/>
    253253      </Position7>
    254254      <Position8>
    255         <Filename Value="Produce\UCSource.pas"/>
    256         <Caret Line="92" Column="39" TopLine="79"/>
     255        <Filename Value="Analyze\UPascalParser.pas"/>
     256        <Caret Line="227" Column="1" TopLine="212"/>
    257257      </Position8>
    258258      <Position9>
    259         <Filename Value="Produce\UCSource.pas"/>
    260         <Caret Line="83" Column="53" TopLine="78"/>
     259        <Filename Value="Analyze\UPascalParser.pas"/>
     260        <Caret Line="229" Column="1" TopLine="212"/>
    261261      </Position9>
    262262      <Position10>
    263         <Filename Value="UPascalSource.pas"/>
    264         <Caret Line="61" Column="26" TopLine="48"/>
     263        <Filename Value="Analyze\UPascalParser.pas"/>
     264        <Caret Line="230" Column="1" TopLine="212"/>
    265265      </Position10>
    266266      <Position11>
    267         <Filename Value="UPascalSource.pas"/>
    268         <Caret Line="64" Column="28" TopLine="52"/>
     267        <Filename Value="Analyze\UPascalParser.pas"/>
     268        <Caret Line="234" Column="1" TopLine="213"/>
    269269      </Position11>
    270270      <Position12>
    271         <Filename Value="UPascalSource.pas"/>
    272         <Caret Line="23" Column="11" TopLine="10"/>
     271        <Filename Value="Analyze\UPascalParser.pas"/>
     272        <Caret Line="238" Column="1" TopLine="217"/>
    273273      </Position12>
    274274      <Position13>
    275         <Filename Value="UPascalSource.pas"/>
    276         <Caret Line="376" Column="17" TopLine="373"/>
     275        <Filename Value="Analyze\UPascalParser.pas"/>
     276        <Caret Line="242" Column="1" TopLine="221"/>
    277277      </Position13>
    278278      <Position14>
    279         <Filename Value="Produce\UCSource.pas"/>
    280         <Caret Line="83" Column="53" TopLine="78"/>
     279        <Filename Value="Analyze\UPascalParser.pas"/>
     280        <Caret Line="248" Column="1" TopLine="235"/>
    281281      </Position14>
    282282      <Position15>
    283         <Filename Value="Produce\UCSource.pas"/>
    284         <Caret Line="150" Column="1" TopLine="134"/>
     283        <Filename Value="Analyze\UPascalParser.pas"/>
     284        <Caret Line="263" Column="18" TopLine="251"/>
    285285      </Position15>
    286286      <Position16>
    287         <Filename Value="Produce\UCSource.pas"/>
    288         <Caret Line="147" Column="36" TopLine="134"/>
     287        <Filename Value="Analyze\UPascalParser.pas"/>
     288        <Caret Line="149" Column="3" TopLine="147"/>
    289289      </Position16>
    290290      <Position17>
    291         <Filename Value="Produce\UCSource.pas"/>
    292         <Caret Line="18" Column="38" TopLine="15"/>
     291        <Filename Value="Analyze\UPascalParser.pas"/>
     292        <Caret Line="266" Column="1" TopLine="253"/>
    293293      </Position17>
    294294      <Position18>
    295295        <Filename Value="Analyze\UPascalParser.pas"/>
    296         <Caret Line="7" Column="34" TopLine="1"/>
     296        <Caret Line="225" Column="1" TopLine="212"/>
    297297      </Position18>
    298298      <Position19>
    299299        <Filename Value="Analyze\UPascalParser.pas"/>
    300         <Caret Line="53" Column="21" TopLine="40"/>
     300        <Caret Line="227" Column="1" TopLine="212"/>
    301301      </Position19>
    302302      <Position20>
    303303        <Filename Value="Analyze\UPascalParser.pas"/>
    304         <Caret Line="54" Column="74" TopLine="40"/>
     304        <Caret Line="229" Column="1" TopLine="212"/>
    305305      </Position20>
    306306      <Position21>
    307307        <Filename Value="Analyze\UPascalParser.pas"/>
    308         <Caret Line="61" Column="21" TopLine="40"/>
     308        <Caret Line="230" Column="1" TopLine="212"/>
    309309      </Position21>
    310310      <Position22>
    311311        <Filename Value="Analyze\UPascalParser.pas"/>
    312         <Caret Line="62" Column="74" TopLine="40"/>
     312        <Caret Line="234" Column="1" TopLine="213"/>
    313313      </Position22>
    314314      <Position23>
    315315        <Filename Value="Analyze\UPascalParser.pas"/>
    316         <Caret Line="69" Column="21" TopLine="56"/>
     316        <Caret Line="238" Column="1" TopLine="217"/>
    317317      </Position23>
    318318      <Position24>
    319319        <Filename Value="Analyze\UPascalParser.pas"/>
    320         <Caret Line="70" Column="74" TopLine="56"/>
     320        <Caret Line="242" Column="1" TopLine="221"/>
    321321      </Position24>
    322322      <Position25>
    323323        <Filename Value="Analyze\UPascalParser.pas"/>
    324         <Caret Line="73" Column="17" TopLine="56"/>
     324        <Caret Line="248" Column="1" TopLine="235"/>
    325325      </Position25>
    326326      <Position26>
    327327        <Filename Value="Analyze\UPascalParser.pas"/>
    328         <Caret Line="74" Column="70" TopLine="56"/>
     328        <Caret Line="149" Column="1" TopLine="136"/>
    329329      </Position26>
    330330      <Position27>
    331331        <Filename Value="Analyze\UPascalParser.pas"/>
    332         <Caret Line="88" Column="31" TopLine="75"/>
     332        <Caret Line="150" Column="1" TopLine="136"/>
    333333      </Position27>
    334334      <Position28>
    335335        <Filename Value="Analyze\UPascalParser.pas"/>
    336         <Caret Line="89" Column="16" TopLine="75"/>
     336        <Caret Line="250" Column="36" TopLine="228"/>
    337337      </Position28>
    338338      <Position29>
    339         <Filename Value="Analyze\UPascalParser.pas"/>
    340         <Caret Line="307" Column="22" TopLine="294"/>
     339        <Filename Value="DelphiToC.lpr"/>
     340        <Caret Line="12" Column="39" TopLine="3"/>
    341341      </Position29>
    342342      <Position30>
    343         <Filename Value="Analyze\UPascalParser.pas"/>
    344         <Caret Line="153" Column="25" TopLine="148"/>
     343        <Filename Value="DelphiToC.lpr"/>
     344        <Caret Line="16" Column="38" TopLine="4"/>
    345345      </Position30>
    346346    </JumpHistory>
     
    383383  </CompilerOptions>
    384384  <Debugging>
     385    <BreakPoints Count="1">
     386      <Item1>
     387        <Source Value="Analyze\UPascalParser.pas"/>
     388        <Line Value="456"/>
     389      </Item1>
     390    </BreakPoints>
    385391    <Exceptions Count="3">
    386392      <Item1>
  • branches/DelphiToC/Example.pas

    r42 r43  
    11program Test;
     2
     3uses System, Crt;
    24
    35procedure Pokus(A: Byte);
     
    2628  end;
    2729  while A < 1 do A := A + 1;
     30 
     31 
     32  {
     33  Block comment 2
     34  }
     35  WriteLn;
    2836end.
  • branches/DelphiToC/Produce/UCSource.pas

    r42 r43  
    1818    function TranslateOperator(Name: string): string;
    1919    procedure Emit(Text: string);
     20    procedure GenerateUses(UsedModules: TUsedModuleList);
     21    procedure GenerateModule(Module: TModule);
    2022    procedure GenerateCommonBlock(CommonBlock: TCommonBlock;
    2123      LabelPrefix: string);
     
    8082end;
    8183
     84procedure TCProducer.GenerateUses(UsedModules: TUsedModuleList);
     85var
     86  I: Integer;
     87begin
     88  for I := 0 to UsedModules.Count - 1 do
     89    Emit('#include "' + TUsedModule(UsedModules[I]).Name + '.h"');
     90  Emit('');
     91end;
     92
     93procedure TCProducer.GenerateModule(Module: TModule);
     94begin
     95  GenerateUses(Module.UsedModules);
     96  GenerateCommonBlock(Module, '');
     97end;
     98
    8299procedure TCProducer.Produce;
    83100begin
     
    94111  with ProgramBlock do
    95112  for I := 0 to Modules.Count - 1 do
    96     GenerateCommonBlock(TModule(Modules[I]), '');
     113    GenerateModule(TModule(Modules[I]));
    97114end;
    98115
  • branches/DelphiToC/UPascalCompiler.pas

    r40 r43  
    3333begin
    3434  Parser.CodePosition := 1;
    35   TParserProgram.Parse(Parser, ProgramCode);
     35  try
     36    TParserProgram.Parse(Parser, ProgramCode);
     37  except
     38    on EEndOfData do ;
     39  end;
    3640  Producer.Produce;
    3741end;
  • branches/DelphiToC/UPascalSource.pas

    r42 r43  
    3232  TVariable = class;
    3333  TConstant = class;
     34  TModule = class;
    3435
    3536  TDevice = class
     
    252253  end;
    253254
     255  TUsedModule = class
     256    Name: string;
     257    Module: TModule;
     258  end;
     259
     260  TUsedModuleList = class(TObjectList)
     261  end;
     262
    254263  TModule = class(TCommonBlock)
    255264  public
    256265    ModuleType: TModuleType;
    257     UsedModules: TObjectList; // TObjectList<TModule>
     266    UsedModules: TUsedModuleList;
    258267    constructor Create; override;
    259268    procedure Clear;
     
    349358begin
    350359  inherited;
    351   UsedModules := TObjectList.Create;
     360  UsedModules := TUsedModuleList.Create;
    352361end;
    353362
Note: See TracChangeset for help on using the changeset viewer.