Changeset 54 for branches/DelphiToC


Ignore:
Timestamp:
Aug 10, 2010, 11:54:18 AM (14 years ago)
Author:
george
Message:

Added support for multiple source files and compilations for multiple modules in Project.pas

Location:
branches/DelphiToC
Files:
4 added
2 deleted
12 edited

Legend:

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

    r53 r54  
    5454    procedure ParseUnit(SourceCode: TModule);
    5555    procedure ParseProgram(SourceCode: TModule);
    56     procedure ParseAll(SourceCode: TProgram);
    5756    procedure ParseCommonBlock(SourceCode: TCommonBlock; EndSymbol: char = ';');
    5857    function ParseCommand(SourceCode: TCommonBlock): TCommand;
     
    651650      ModuleType := mdProgram;
    652651      Expect(';');
    653     end
    654     else
    655       Name := '';
     652    end else Name := '';
    656653
    657654    // Uses section
     
    664661
    665662procedure TPascalParser.ParseUnit(SourceCode: TModule);
     663var
     664  NewModule: TModule;
    666665begin
    667666  Expect('unit');
    668   with TModule(ProgramCode.Modules[0]) do
     667  with Sourcecode do
    669668  begin
    670669    Name := ReadCode;
     
    677676
    678677{ TParserProgram }
    679 
    680 procedure TPascalParser.ParseAll(SourceCode: TProgram);
    681 var
    682   I: integer;
    683 begin
    684   with SourceCode do
    685   begin
    686     for I := 0 to Modules.Count - 1 do
    687       ParseModule(TModule(Modules[I]));
    688   end;
    689 end;
    690678
    691679{ TParserCommonBlock }
  • branches/DelphiToC/Forms/UMainForm.lfm

    r53 r54  
    11object MainForm: TMainForm
    2   Left = 141
    3   Height = 498
    4   Top = 105
    5   Width = 881
     2  Left = 148
     3  Height = 494
     4  Top = 103
     5  Width = 884
    66  Caption = 'Transpascal '
    7   ClientHeight = 498
    8   ClientWidth = 881
     7  ClientHeight = 494
     8  ClientWidth = 884
    99  Font.Height = -11
    1010  Font.Name = 'Tahoma'
     
    1616  LCLVersion = '0.9.29'
    1717  object ButtonCompile: TButton
    18     Left = 801
     18    Left = 736
    1919    Height = 22
    20     Top = 401
    21     Width = 75
     20    Top = 397
     21    Width = 144
    2222    Anchors = [akRight, akBottom]
    2323    Caption = 'Kompilovat'
     
    2929  end
    3030  inline SynEdit1: TSynEdit
    31     Left = 8
    32     Height = 388
    33     Top = 8
    34     Width = 488
     31    Left = 248
     32    Height = 384
     33    Top = 6
     34    Width = 392
    3535    Anchors = [akTop, akLeft, akBottom]
    3636    Font.Height = -13
     
    723723  end
    724724  object ComboBox1: TComboBox
    725     Left = 504
     725    Left = 735
    726726    Height = 21
    727     Top = 8
    728     Width = 373
    729     Anchors = [akTop, akLeft, akRight]
     727    Top = 424
     728    Width = 144
     729    Anchors = [akLeft, akRight, akBottom]
    730730    ItemHeight = 13
    731731    ItemIndex = 0
     
    744744    Left = 8
    745745    Height = 91
    746     Top = 402
    747     Width = 785
     746    Top = 398
     747    Width = 720
    748748    Anchors = [akLeft, akRight, akBottom]
    749749    ItemHeight = 0
     
    752752  end
    753753  object Panel1: TPanel
    754     Left = 504
    755     Height = 354
    756     Top = 40
    757     Width = 372
     754    Left = 648
     755    Height = 382
     756    Top = 8
     757    Width = 231
    758758    Anchors = [akTop, akLeft, akRight, akBottom]
    759759    BevelOuter = bvNone
    760760    TabOrder = 4
    761761  end
     762  object TreeViewProject: TTreeView
     763    Left = 7
     764    Height = 383
     765    Top = 8
     766    Width = 233
     767    Anchors = [akTop, akLeft, akBottom]
     768    DefaultItemHeight = 15
     769    ReadOnly = True
     770    TabOrder = 5
     771    OnChange = TreeViewProjectChange
     772    Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
     773  end
    762774  object SynPasSyn1: TSynPasSyn
    763775    CompilerMode = pcmDelphi
    764776    NestedComments = False
    765     left = 183
    766     top = 48
     777    left = 328
     778    top = 32
    767779  end
    768780end
  • branches/DelphiToC/Forms/UMainForm.pas

    r53 r54  
    99  Dialogs, StdCtrls, USourceCode, UCompiler, UProducerAsm8051,
    1010  UProducerC, ComCtrls, ExtCtrls, SynEdit, SynHighlighterPas, UProducerTreeView,
    11   UProducerPascal, Contnrs;
     11  UProducerPascal, Contnrs, UProject;
    1212
    1313const
    14   ExampleFileName = '../../Example.pas';
     14  ProjectDir = '../../Project/';
    1515
    1616type
     
    2424    SynEdit1: TSynEdit;
    2525    SynPasSyn1: TSynPasSyn;
     26    TreeViewProject: TTreeView;
    2627    procedure ComboBox1Change(Sender: TObject);
    2728    procedure FormShow(Sender: TObject);
     
    3132    procedure FormDestroy(Sender: TObject);
    3233    procedure ListBox1Click(Sender: TObject);
     34    procedure TreeViewProjectChange(Sender: TObject; Node: TTreeNode);
     35  private
    3336    procedure LoadErrorMessages;
    34   private
     37    procedure UpdateProjectTree;
     38    procedure UpdateProjectGroup(Node: TTreeNode; Group: TProjectGroup);
    3539  public
     40    Project: TProject;
    3641    ProducerControl: TControl;
    3742    Compiler: TCompiler;
    38     SourceTree: TProducerTreeView;
    3943  end;
    4044
     
    5256  I: Integer;
    5357begin
    54   MainForm.ListBox1.Clear;
    55   Compiler.SourceCode.Assign(SynEdit1.Lines);
    56 
    5758  ProducerControl.Free;
    5859  if ComboBox1.ItemIndex = 0 then begin
    5960    Compiler.Producer.Free;
    6061    Compiler.Producer := TProducerPascal.Create;
    61     Compiler.Producer.ProgramCode := Compiler.ProgramCode;
    62     Compiler.Compile;
     62  end else
     63  if ComboBox1.ItemIndex = 1 then begin
     64    Compiler.Producer.Free;
     65    Compiler.Producer := TProducerC.Create;
     66  end else
     67  if ComboBox1.ItemIndex = 2 then begin
     68    Compiler.Producer.Free;
     69    Compiler.Producer := TProducerAsm8051.Create;
     70  end else
     71  if ComboBox1.ItemIndex = 3 then begin
     72    Compiler.Producer.Free;
     73    Compiler.Producer := TProducerTreeView.Create;
     74    ProducerControl := TTreeView.Create(Self);
     75    ProducerControl.Parent := Panel1;
     76    ProducerControl.Align := alClient;
     77    TProducerTreeView(Compiler.Producer).TreeView := TTreeView(ProducerControl);
     78  end;
     79
     80  // Compile all project files
     81  for I := 0 to Project.Items.Count - 1 do begin
     82    if TProjectNode(Project.Items[I]) is TProjectFile then begin
     83      Compiler.Compile(TProjectFile(Project.Items[I]).Source,
     84        TProjectFile(Project.Items[I]).ProducedCode);
     85    end;
     86  end;
     87
     88  if ComboBox1.ItemIndex = 0 then begin
    6389    ProducerControl := TMemo.Create(Self);
    6490    ProducerControl.Parent := Panel1;
     
    6692    ProducerControl.Font.Name := 'Courier New';
    6793    TMemo(ProducerControl).ScrollBars := ssAutoBoth;
    68     with TProducerPascal(Compiler.Producer) do
    69       TMemo(ProducerControl).Lines.Assign(TextSource);
    7094  end else
    7195  if ComboBox1.ItemIndex = 1 then begin
    72     Compiler.Producer.Free;
    73     Compiler.Producer := TProducerC.Create;
    74     Compiler.Producer.ProgramCode := Compiler.ProgramCode;
    75     Compiler.Compile;
    7696    ProducerControl := TMemo.Create(Self);
    7797    ProducerControl.Parent := Panel1;
     
    7999    ProducerControl.Font.Name := 'Courier New';
    80100    TMemo(ProducerControl).ScrollBars := ssAutoBoth;
    81     with TProducerC(Compiler.Producer) do
    82       TMemo(ProducerControl).Lines.Assign(TextSource);
    83101  end else
    84102  if ComboBox1.ItemIndex = 2 then begin
    85     Compiler.Producer.Free;
    86     Compiler.Producer := TProducerAsm8051.Create;
    87     Compiler.Producer.ProgramCode := Compiler.ProgramCode;
    88     Compiler.Compile;
    89103    ProducerControl := TMemo.Create(Self);
    90104    ProducerControl.Parent := Panel1;
     
    92106    ProducerControl.Font.Name := 'Courier New';
    93107    TMemo(ProducerControl).ScrollBars := ssAutoBoth;
    94     with TProducerAsm8051(Compiler.Producer) do
    95     for I := 0 to AssemblyCode.Count - 1 do
    96       TMemo(ProducerControl).Lines.Add(TAssemblerLine(AssemblyCode[I]).AsString);
    97   end;
     108  end else
    98109  if ComboBox1.ItemIndex = 3 then begin
    99     Compiler.Producer.Free;
    100     Compiler.Producer := TProducerTreeView.Create;
    101     Compiler.Producer.ProgramCode := Compiler.ProgramCode;
    102     ProducerControl := TTreeView.Create(Self);
    103     ProducerControl.Parent := Panel1;
    104     ProducerControl.Align := alClient;
    105     TProducerTreeView(Compiler.Producer).TreeView := TTreeView(ProducerControl);
    106     Compiler.Compile;
    107   end;
     110  end;
     111
    108112  LoadErrorMessages;
    109113end;
     
    128132end;
    129133
     134procedure TMainForm.TreeViewProjectChange(Sender: TObject; Node: TTreeNode);
     135begin
     136  if Assigned(Node) then begin
     137    if TProjectNode(Node.Data) is TProjectFile then begin
     138      SynEdit1.Lines.Assign(TProjectFile(Node.Data).Source);
     139      if ProducerControl is TMemo then
     140        TMemo(ProducerControl).Lines.Assign(TProjectFile(Node.Data).ProducedCode);
     141    end;
     142  end;
     143end;
     144
     145procedure TMainForm.UpdateProjectTree;
     146var
     147  NewNode: TTreeNode;
     148begin
     149  with TreeViewProject, Items do begin
     150    BeginUpdate;
     151    Clear;
     152    NewNode := AddChild(nil, Project.Name);
     153    UpdateProjectGroup(NewNode, Project);
     154    NewNode.Expand(True);
     155    EndUpdate;
     156  end;
     157  TreeViewProject.TopItem.Items[0].Selected := True;
     158end;
     159
     160procedure TMainForm.UpdateProjectGroup(Node: TTreeNode; Group: TProjectGroup);
     161var
     162  I: Integer;
     163  NewNode: TTreeNode;
     164begin
     165  for I := 0 to Group.Items.Count - 1 do begin
     166    NewNode := TreeViewProject.Items.AddChild(Node,
     167      TProjectNode(Group.Items[I]).Name);
     168    NewNode.Data := Pointer(Group.Items[I]);
     169    if TProjectNode(Group.Items[I]) is TProjectGroup then
     170      UpdateProjectGroup(NewNode, TProjectGroup(Group.Items[I]));
     171  end;
     172end;
     173
    130174procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
    131175begin
    132   SynEdit1.Lines.SaveToFile(ExampleFileName);
     176  Project.Save;
    133177end;
    134178
     
    136180begin
    137181  Compiler := TCompiler.Create;
    138   SourceTree := TProducerTreeView.Create;
     182  Project := TProject.Create;
    139183end;
    140184
    141185procedure TMainForm.FormDestroy(Sender: TObject);
    142186begin
     187  Project.Free;
    143188  Compiler.Free;
    144   SourceTree.Free;
    145189end;
    146190
    147191procedure TMainForm.FormShow(Sender: TObject);
    148 begin
     192var
     193  NewProjectFile: TProjectFile;
     194begin
     195  Project.Name := 'Project';
     196  NewProjectFile := TProjectFile.Create;
     197  NewProjectFile.Name := 'Project.pas';
     198  NewProjectFile.FileName := ProjectDir + 'Project.pas';
     199  Project.Items.Add(NewProjectFile);
     200  NewProjectFile := TProjectFile.Create;
     201  NewProjectFile.Name := 'System.pas';
     202  NewProjectFile.FileName := ProjectDir + 'System.pas';
     203  Project.Items.Add(NewProjectFile);
     204  Project.Load;
     205  UpdateProjectTree;
     206
    149207  WindowState := wsMaximized;
    150   SynEdit1.Lines.LoadFromFile(ExampleFileName);
    151208  ButtonCompileClick(Self);
    152209end;
  • branches/DelphiToC/Produce/UProducer.pas

    r52 r54  
    66
    77uses
    8   USourceCode;
     8  USourceCode, Classes;
    99
    1010type
    1111  TProducer = class
    12     ProgramCode: TProgram;
    13     procedure Produce; virtual; abstract;
     12    procedure Produce(Module: TModule; ProducedCode: TStringList); virtual; abstract;
    1413  end;
    1514
  • branches/DelphiToC/Produce/UProducerAsm8051.pas

    r52 r54  
    2626  end;
    2727
     28  { TProducerAsm8051 }
     29
    2830  TProducerAsm8051 = class(TProducer)
    2931  private
     
    3335    procedure GenerateExpression(Expression: TExpression; LabelPrefix: string);
    3436    procedure GenerateProgram(ProgramBlock: TProgram);
     37    procedure GenerateModule(Module: TModule);
    3538  public
    3639    AssemblyCode: TList; // TList<TAssemblerLine>
    37     procedure Produce; override;
     40    procedure Produce(Module: TModule; ProducedCode: TStringList); override;
    3841    constructor Create;
    3942    destructor Destroy; override;
     
    189192end;
    190193
    191 procedure TProducerAsm8051.Produce;
    192 begin
    193   GenerateProgram(ProgramCode);
     194procedure TProducerAsm8051.GenerateModule(Module: TModule);
     195begin
     196
     197end;
     198
     199procedure TProducerAsm8051.Produce(Module: TModule; ProducedCode: TStringList);
     200begin
     201  GenerateModule(Module);
    194202end;
    195203
  • branches/DelphiToC/Produce/UProducerC.pas

    r53 r54  
    3838    IndentationLength: Integer;
    3939    Indetation: Integer;
    40     procedure Produce; override;
     40    procedure Produce(Module: TModule; ProducedCode: TStringList); override;
    4141    constructor Create;
    4242    destructor Destroy; override;
     
    119119end;
    120120
    121 procedure TProducerC.Produce;
     121procedure TProducerC.Produce(Module: TModule; ProducedCode: TStringList);
    122122begin
    123123  inherited;
    124124  TextSource.Clear;
    125   GenerateProgram(ProgramCode);
     125  GenerateModule(Module);
    126126end;
    127127
  • branches/DelphiToC/Produce/UProducerPascal.pas

    r53 r54  
    3838    IndentationLength: Integer;
    3939    Indetation: Integer;
    40     procedure Produce; override;
     40    procedure Produce(Module: TModule; ProducedCode: TStringList); override;
    4141    constructor Create;
    4242    destructor Destroy; override;
     
    4949constructor TProducerPascal.Create;
    5050begin
    51   TextSource := TStringList.Create;
    5251  IndentationLength := 2;
    5352end;
     
    5554destructor TProducerPascal.Destroy;
    5655begin
    57   TextSource.Free;
    5856  inherited;
    5957end;
     
    8684procedure TProducerPascal.GenerateModule(Module: TModule);
    8785begin
    88   Emit('program ' + Module.Name + ';');
     86  case Module.ModuleType of
     87    mdProgram: Emit('program', False);
     88    mdUnit: Emit('unit', False);
     89    mdLibrary: Emit('library', False);
     90    mdPackage: Emit('package', False);
     91  end;
     92  Emit(' ' + Module.Name + ';');
    8993  Emit('');
    9094  GenerateUses(Module.UsedModules);
     
    144148end;
    145149
    146 procedure TProducerPascal.Produce;
     150procedure TProducerPascal.Produce(Module: TModule; ProducedCode: TStringList);
    147151begin
    148152  inherited;
     153  TextSource := ProducedCode;
    149154  TextSource.Clear;
    150   GenerateProgram(ProgramCode);
     155  GenerateModule(Module);
    151156end;
    152157
     
    183188      Line := Line + ')';
    184189    end;
    185     if HaveResult then Line := Line + ': ' + ResultType.Name;
     190    if HaveResult and Assigned(ResultType) then
     191      Line := Line + ': ' + ResultType.Name;
    186192    Emit(Line + ';');
    187193    GenerateBeginEnd(Code);
     
    256262begin
    257263  with ForToDo do begin
     264    if Assigned(ControlVariable) and Assigned(Start) and Assigned(Stop) then
    258265    Emit('for ' + ControlVariable.Name + ' := ' +
    259266      GenerateExpression(Start) + ' to ' + GenerateExpression(Stop) + ' do ');
  • branches/DelphiToC/Produce/UProducerTreeView.pas

    r53 r54  
    3434  public
    3535    TreeView: TTreeView;
    36     procedure Produce; override;
     36    procedure Produce(Module: TModule; ProducedCode: TStringList); override;
    3737  end;
    3838
     
    322322end;
    323323
    324 procedure TProducerTreeView.Produce;
     324procedure TProducerTreeView.Produce(Module: TModule; ProducedCode: TStringList);
    325325begin
    326326  with TreeView do begin
    327327    BeginUpdate;
    328328    Items.Clear;
    329     AddNodeProgram(TopItem, ProgramCode);
     329    AddNodeModule(TopItem, Module);
    330330    TopItem.Expand(True);
    331331    EndUpdate;
  • branches/DelphiToC/Transpascal.lpi

    r53 r54  
    4141      </Item2>
    4242    </RequiredPackages>
    43     <Units Count="20">
     43    <Units Count="21">
    4444      <Unit0>
    4545        <Filename Value="Transpascal.lpr"/>
     
    4949        <WindowIndex Value="0"/>
    5050        <TopLine Value="4"/>
    51         <CursorPos X="26" Y="23"/>
     51        <CursorPos X="1" Y="29"/>
    5252        <UsageCount Value="148"/>
    5353        <Loaded Value="True"/>
     
    6262        <EditorIndex Value="6"/>
    6363        <WindowIndex Value="0"/>
    64         <TopLine Value="69"/>
    65         <CursorPos X="1" Y="94"/>
     64        <TopLine Value="91"/>
     65        <CursorPos X="40" Y="106"/>
    6666        <UsageCount Value="148"/>
    6767        <Loaded Value="True"/>
     
    8383        <EditorIndex Value="5"/>
    8484        <WindowIndex Value="0"/>
    85         <TopLine Value="146"/>
    86         <CursorPos X="5" Y="159"/>
     85        <TopLine Value="1"/>
     86        <CursorPos X="29" Y="14"/>
    8787        <UsageCount Value="148"/>
    8888        <Loaded Value="True"/>
     
    9292        <IsPartOfProject Value="True"/>
    9393        <UnitName Value="UCompiler"/>
    94         <EditorIndex Value="12"/>
    95         <WindowIndex Value="0"/>
    96         <TopLine Value="102"/>
    97         <CursorPos X="24" Y="98"/>
     94        <EditorIndex Value="13"/>
     95        <WindowIndex Value="0"/>
     96        <TopLine Value="37"/>
     97        <CursorPos X="29" Y="50"/>
    9898        <UsageCount Value="148"/>
    9999        <Loaded Value="True"/>
     
    105105        <EditorIndex Value="10"/>
    106106        <WindowIndex Value="0"/>
    107         <TopLine Value="15"/>
    108         <CursorPos X="19" Y="28"/>
     107        <TopLine Value="179"/>
     108        <CursorPos X="3" Y="196"/>
    109109        <UsageCount Value="148"/>
    110110        <Loaded Value="True"/>
     
    117117        <WindowIndex Value="0"/>
    118118        <TopLine Value="1"/>
    119         <CursorPos X="5" Y="13"/>
     119        <CursorPos X="38" Y="12"/>
    120120        <UsageCount Value="148"/>
    121121        <Loaded Value="True"/>
     
    125125        <IsPartOfProject Value="True"/>
    126126        <UnitName Value="UProducerC"/>
    127         <IsVisibleTab Value="True"/>
    128         <EditorIndex Value="11"/>
    129         <WindowIndex Value="0"/>
    130         <TopLine Value="57"/>
    131         <CursorPos X="46" Y="69"/>
     127        <EditorIndex Value="12"/>
     128        <WindowIndex Value="0"/>
     129        <TopLine Value="121"/>
     130        <CursorPos X="17" Y="125"/>
    132131        <UsageCount Value="148"/>
    133132        <Loaded Value="True"/>
     
    139138        <EditorIndex Value="0"/>
    140139        <WindowIndex Value="0"/>
    141         <TopLine Value="1042"/>
    142         <CursorPos X="29" Y="1061"/>
     140        <TopLine Value="619"/>
     141        <CursorPos X="1" Y="632"/>
    143142        <UsageCount Value="148"/>
    144143        <Loaded Value="True"/>
     
    207206        <EditorIndex Value="2"/>
    208207        <WindowIndex Value="0"/>
    209         <TopLine Value="166"/>
    210         <CursorPos X="33" Y="179"/>
     208        <TopLine Value="280"/>
     209        <CursorPos X="45" Y="294"/>
    211210        <UsageCount Value="110"/>
    212211        <Loaded Value="True"/>
     
    231230        <IsPartOfProject Value="True"/>
    232231        <UnitName Value="UProducerPascal"/>
     232        <IsVisibleTab Value="True"/>
    233233        <EditorIndex Value="8"/>
    234234        <WindowIndex Value="0"/>
    235         <TopLine Value="61"/>
    236         <CursorPos X="1" Y="70"/>
     235        <TopLine Value="74"/>
     236        <CursorPos X="14" Y="92"/>
    237237        <UsageCount Value="64"/>
    238238        <Loaded Value="True"/>
    239239      </Unit19>
     240      <Unit20>
     241        <Filename Value="UProject.pas"/>
     242        <IsPartOfProject Value="True"/>
     243        <UnitName Value="UProject"/>
     244        <EditorIndex Value="11"/>
     245        <WindowIndex Value="0"/>
     246        <TopLine Value="24"/>
     247        <CursorPos X="16" Y="37"/>
     248        <UsageCount Value="20"/>
     249        <Loaded Value="True"/>
     250      </Unit20>
    240251    </Units>
    241252    <JumpHistory Count="30" HistoryIndex="29">
    242253      <Position1>
    243254        <Filename Value="Produce\UProducerPascal.pas"/>
    244         <Caret Line="186" Column="17" TopLine="171"/>
     255        <Caret Line="149" Column="18" TopLine="144"/>
    245256      </Position1>
    246257      <Position2>
    247258        <Filename Value="Produce\UProducerPascal.pas"/>
    248         <Caret Line="217" Column="11" TopLine="209"/>
     259        <Caret Line="40" Column="23" TopLine="27"/>
    249260      </Position2>
    250261      <Position3>
    251         <Filename Value="Produce\UProducerPascal.pas"/>
    252         <Caret Line="244" Column="48" TopLine="238"/>
     262        <Filename Value="Produce\UProducerC.pas"/>
     263        <Caret Line="40" Column="38" TopLine="27"/>
    253264      </Position3>
    254265      <Position4>
    255         <Filename Value="Produce\UProducerPascal.pas"/>
    256         <Caret Line="278" Column="40" TopLine="263"/>
     266        <Filename Value="Produce\UProducerC.pas"/>
     267        <Caret Line="121" Column="29" TopLine="107"/>
    257268      </Position4>
    258269      <Position5>
    259         <Filename Value="Forms\UMainForm.pas"/>
    260         <Caret Line="29" Column="44" TopLine="15"/>
     270        <Filename Value="Produce\UProducerC.pas"/>
     271        <Caret Line="40" Column="66" TopLine="39"/>
    261272      </Position5>
    262273      <Position6>
    263         <Filename Value="Forms\UMainForm.pas"/>
    264         <Caret Line="66" Column="43" TopLine="56"/>
     274        <Filename Value="UCompiler.pas"/>
     275        <Caret Line="50" Column="1" TopLine="29"/>
    265276      </Position6>
    266277      <Position7>
    267         <Filename Value="Forms\UMainForm.pas"/>
    268         <Caret Line="146" Column="16" TopLine="129"/>
     278        <Filename Value="Produce\UProducerAsm8051.pas"/>
     279        <Caret Line="37" Column="38" TopLine="24"/>
    269280      </Position7>
    270281      <Position8>
    271         <Filename Value="Produce\UProducerPascal.pas"/>
    272         <Caret Line="31" Column="48" TopLine="20"/>
     282        <Filename Value="Produce\UProducerAsm8051.pas"/>
     283        <Caret Line="191" Column="35" TopLine="171"/>
    273284      </Position8>
    274285      <Position9>
    275         <Filename Value="Produce\UProducerPascal.pas"/>
    276         <Caret Line="243" Column="46" TopLine="238"/>
     286        <Filename Value="Produce\UProducerAsm8051.pas"/>
     287        <Caret Line="37" Column="66" TopLine="37"/>
    277288      </Position9>
    278289      <Position10>
    279         <Filename Value="Forms\UMainForm.pas"/>
    280         <Caret Line="67" Column="33" TopLine="55"/>
     290        <Filename Value="Produce\UProducerAsm8051.pas"/>
     291        <Caret Line="193" Column="24" TopLine="171"/>
    281292      </Position10>
    282293      <Position11>
    283         <Filename Value="Produce\UProducerC.pas"/>
    284         <Caret Line="29" Column="30" TopLine="14"/>
     294        <Filename Value="Produce\UProducerAsm8051.pas"/>
     295        <Caret Line="35" Column="45" TopLine="24"/>
    285296      </Position11>
    286297      <Position12>
    287         <Filename Value="Produce\UProducerC.pas"/>
    288         <Caret Line="24" Column="1" TopLine="14"/>
     298        <Filename Value="Produce\UProducerAsm8051.pas"/>
     299        <Caret Line="37" Column="15" TopLine="22"/>
    289300      </Position12>
    290301      <Position13>
    291         <Filename Value="Produce\UProducerC.pas"/>
    292         <Caret Line="25" Column="38" TopLine="11"/>
     302        <Filename Value="Produce\UProducerTreeView.pas"/>
     303        <Caret Line="325" Column="1" TopLine="311"/>
    293304      </Position13>
    294305      <Position14>
    295         <Filename Value="Produce\UProducerC.pas"/>
    296         <Caret Line="312" Column="16" TopLine="294"/>
     306        <Filename Value="Produce\UProducerTreeView.pas"/>
     307        <Caret Line="36" Column="23" TopLine="23"/>
    297308      </Position14>
    298309      <Position15>
    299         <Filename Value="Produce\UProducerC.pas"/>
    300         <Caret Line="24" Column="40" TopLine="11"/>
     310        <Filename Value="Produce\UProducerTreeView.pas"/>
     311        <Caret Line="329" Column="13" TopLine="311"/>
    301312      </Position15>
    302313      <Position16>
    303         <Filename Value="Produce\UProducerC.pas"/>
    304         <Caret Line="268" Column="47" TopLine="268"/>
     314        <Filename Value="Analyze\UParser.pas"/>
     315        <Caret Line="635" Column="12" TopLine="630"/>
    305316      </Position16>
    306317      <Position17>
    307         <Filename Value="Produce\UProducerC.pas"/>
    308         <Caret Line="281" Column="8" TopLine="268"/>
     318        <Filename Value="Analyze\UParser.pas"/>
     319        <Caret Line="632" Column="1" TopLine="627"/>
    309320      </Position17>
    310321      <Position18>
    311         <Filename Value="Produce\UProducerC.pas"/>
    312         <Caret Line="19" Column="31" TopLine="6"/>
     322        <Filename Value="Analyze\UParser.pas"/>
     323        <Caret Line="634" Column="1" TopLine="627"/>
    313324      </Position18>
    314325      <Position19>
    315         <Filename Value="Produce\UProducerC.pas"/>
    316         <Caret Line="91" Column="1" TopLine="87"/>
     326        <Filename Value="Analyze\UParser.pas"/>
     327        <Caret Line="635" Column="1" TopLine="627"/>
    317328      </Position19>
    318329      <Position20>
    319         <Filename Value="Produce\UProducerC.pas"/>
    320         <Caret Line="87" Column="27" TopLine="74"/>
     330        <Filename Value="Analyze\UParser.pas"/>
     331        <Caret Line="665" Column="1" TopLine="652"/>
    321332      </Position20>
    322333      <Position21>
    323         <Filename Value="Produce\UProducerC.pas"/>
    324         <Caret Line="19" Column="33" TopLine="18"/>
     334        <Filename Value="Analyze\UParser.pas"/>
     335        <Caret Line="666" Column="1" TopLine="652"/>
    325336      </Position21>
    326337      <Position22>
    327         <Filename Value="Produce\UProducerC.pas"/>
    328         <Caret Line="87" Column="21" TopLine="74"/>
     338        <Filename Value="Analyze\UParser.pas"/>
     339        <Caret Line="669" Column="1" TopLine="652"/>
    329340      </Position22>
    330341      <Position23>
    331         <Filename Value="Produce\UProducerC.pas"/>
    332         <Caret Line="19" Column="20" TopLine="18"/>
     342        <Filename Value="Analyze\UParser.pas"/>
     343        <Caret Line="670" Column="1" TopLine="652"/>
    333344      </Position23>
    334345      <Position24>
    335         <Filename Value="Produce\UProducerC.pas"/>
    336         <Caret Line="87" Column="28" TopLine="87"/>
     346        <Filename Value="Produce\UProducerPascal.pas"/>
     347        <Caret Line="88" Column="25" TopLine="84"/>
    337348      </Position24>
    338349      <Position25>
    339         <Filename Value="Produce\UProducerC.pas"/>
    340         <Caret Line="290" Column="17" TopLine="277"/>
     350        <Filename Value="Produce\UProducerPascal.pas"/>
     351        <Caret Line="86" Column="23" TopLine="74"/>
    341352      </Position25>
    342353      <Position26>
    343         <Filename Value="Produce\UProducerC.pas"/>
    344         <Caret Line="278" Column="3" TopLine="274"/>
     354        <Filename Value="USourceCode.pas"/>
     355        <Caret Line="274" Column="25" TopLine="261"/>
    345356      </Position26>
    346357      <Position27>
    347         <Filename Value="Produce\UProducerC.pas"/>
    348         <Caret Line="290" Column="45" TopLine="277"/>
     358        <Filename Value="Produce\UProducerPascal.pas"/>
     359        <Caret Line="86" Column="23" TopLine="74"/>
    349360      </Position27>
    350361      <Position28>
    351         <Filename Value="Produce\UProducerC.pas"/>
    352         <Caret Line="117" Column="18" TopLine="94"/>
     362        <Filename Value="Produce\UProducerPascal.pas"/>
     363        <Caret Line="89" Column="10" TopLine="74"/>
    353364      </Position28>
    354365      <Position29>
    355         <Filename Value="Produce\UProducerC.pas"/>
    356         <Caret Line="288" Column="27" TopLine="275"/>
     366        <Filename Value="Produce\UProducerPascal.pas"/>
     367        <Caret Line="92" Column="8" TopLine="74"/>
    357368      </Position29>
    358369      <Position30>
    359         <Filename Value="Produce\UProducerC.pas"/>
    360         <Caret Line="69" Column="39" TopLine="61"/>
     370        <Filename Value="Produce\UProducerPascal.pas"/>
     371        <Caret Line="88" Column="23" TopLine="74"/>
    361372      </Position30>
    362373    </JumpHistory>
  • branches/DelphiToC/Transpascal.lpr

    r53 r54  
    1515  UProducer,
    1616  UProducerC, UProducerPascal,
    17   UParser, UProducerTreeView;
     17  UParser, UProducerTreeView, UProject;
    1818
    1919{$R *.res}
  • branches/DelphiToC/UCompiler.pas

    r53 r54  
    2323    FOnErrorMessage: TOnErrorMessage;
    2424    procedure ErrorMessage(Text: string; Position: TPoint);
    25     procedure InitSystem;
    2625  public
    2726    ProgramCode: TProgram;
    28     SourceCode: TStringList;
    2927    Parser: TPascalParser;
    3028    Producer: TProducer;
    3129    ErrorMessages: TObjectList;
    3230    constructor Create;
    33     procedure Compile;
     31    procedure Init;
     32    procedure Compile(Source: TStringList; ProducedCode: TStringList);
    3433    destructor Destroy; override;
    3534    property OnErrorMessage: TOnErrorMessage read FOnErrorMessage write FOnErrorMessage;
     
    4039{ TCompiler }
    4140
    42 procedure TCompiler.Compile;
     41procedure TCompiler.Compile(Source: TStringList; ProducedCode: TStringList);
     42var
     43  NewModule: TModule;
    4344begin
    44   InitSystem;
    45   ErrorMessages.Clear;
     45  Parser.SourceCodeText := Source;
    4646  Parser.Init;
    47   Parser.ParseAll(ProgramCode);
    48   Producer.Produce;
     47  NewModule := TModule.Create;
     48  ProgramCode.Modules.Add(NewModule);
     49  Parser.ParseModule(NewModule);
     50  Producer.Produce(NewModule, ProducedCode);
    4951end;
    5052
    5153constructor TCompiler.Create;
    5254begin
    53   SourceCode := TStringList.Create;
    5455  ProgramCode := TProgram.Create;
    5556  Producer := TProducerC.Create;
    56   Producer.ProgramCode := ProgramCode;
    5757  Parser := TPascalParser.Create;
    58   Parser.SourceCodeText := SourceCode;
    5958  Parser.OnErrorMessage := ErrorMessage;
    6059  ErrorMessages := TObjectList.Create;
     60end;
     61
     62procedure TCompiler.Init;
     63begin
     64  ErrorMessages.Clear;
     65  ProgramCode.Modules.Clear;
    6166end;
    6267
     
    6469begin
    6570  ProgramCode.Free;
    66   SourceCode.Free;
    6771  Parser.Free;
    6872  Producer.Free;
     
    8185end;
    8286
    83 procedure TCompiler.InitSystem;
    84 begin
    85   with Parser do begin
    86     Log('==== Parse start ====');
    87     with ProgramCode do begin
    88       Modules.Clear;
    89 
    90       with TModule(Modules[Modules.Add(TModule.Create)]) do begin
    91         Name := 'Main';
    92         with TType(Types[Types.Add(TType.Create)]) do begin
    93           Name := 'Void';
    94           System := True;
    95           Size := 0;
    96           UsedType := nil;
    97         end;
    98         with TType(Types[Types.Add(TType.Create)]) do begin
    99           Name := 'Byte';
    100           System := True;
    101           Size := 1;
    102           UsedType := nil;
    103         end;
    104         with TType(Types[Types.Add(TType.Create)]) do begin
    105           Name := 'ShortInt';
    106           System := True;
    107           Size := 1;
    108           UsedType := nil;
    109         end;
    110         with TType(Types[Types.Add(TType.Create)]) do begin
    111           Name := 'Word';
    112           System := True;
    113           Size := 2;
    114           UsedType := nil;
    115         end;
    116         with TType(Types[Types.Add(TType.Create)]) do begin
    117           Name := 'SmallInt';
    118           System := True;
    119           Size := 2;
    120           UsedType := nil;
    121         end;
    122         with TType(Types[Types.Add(TType.Create)]) do begin
    123           Name := 'Cardinal';
    124           System := True;
    125           Size := 3;
    126           UsedType := nil;
    127         end;
    128         with TType(Types[Types.Add(TType.Create)]) do begin
    129           Name := 'Integer';
    130           System := True;
    131           Size := 3;
    132           UsedType := nil;
    133         end;
    134         with TType(Types[Types.Add(TType.Create)]) do begin
    135           Name := 'Char';
    136           System := True;
    137           Size := 1;
    138           UsedType := nil;
    139         end;
    140         with TType(Types[Types.Add(TType.Create)]) do begin
    141           Name := 'String';
    142           System := True;
    143           Size := 1;
    144           UsedType := nil;
    145         end;
    146         with TFunction(Functions[Functions.Add(TFunction.Create)]) do begin
    147           Name := 'Exit';
    148           System := True;
    149           ResultType := TType(TModule(Modules[0]).Types[0]);
    150         end;
    151         with TFunction(Functions[Functions.Add(TFunction.Create)]) do begin
    152           Name := 'Break';
    153           System := True;
    154           ResultType := TType(TModule(Modules[0]).Types[0]);
    155         end;
    156         with TFunction(Functions[Functions.Add(TFunction.Create)]) do begin
    157           Name := 'Continue';
    158           System := True;
    159           ResultType := TType(TModule(Modules[0]).Types[0]);
    160         end;
    161         with TFunction(Functions[Functions.Add(TFunction.Create)]) do begin
    162           Name := 'WriteLn';
    163           ResultType := TType(TModule(Modules[0]).Types[0]);
    164           with TParameter(Parameters[Parameters.Add(TParameter.Create)]) do begin
    165             Name := 'Text';
    166             ValueType := TType(TModule(Modules[0]).Types[1]);
    167           end;
    168         end;
    169       end;
    170     end;
    171   end;
    172 end;
    173 
    17487end.
  • branches/DelphiToC/USourceCode.pas

    r53 r54  
    279279  end;
    280280
     281  { TModuleList }
     282
     283  TModuleList = class(TObjectList)
     284    function Search(Name: string): TModule;
     285  end;
     286
    281287  TProgram = class
    282288    Device: TDevice;
    283     Modules: TObjectList; // TObjectList<TModule>
     289    Modules: TModuleList;
    284290    constructor Create;
    285291    destructor Destroy; override;
     
    321327begin
    322328  Device := TDevice.Create;
    323   Modules := TObjectList.Create;
     329  Modules := TModuleList.Create;
    324330end;
    325331
     
    677683end;
    678684
     685{ TModuleList }
     686
     687function TModuleList.Search(Name: string): TModule;
     688var
     689  I: Integer;
     690begin
     691  I := 0;
     692  while (I < Count) and (LowerCase(TModule(Items[I]).Name) <> LowerCase(Name)) do Inc(I);
     693  if I < Count then Result := TModule(Items[I]) else Result := nil;
     694end;
     695
    679696end.
    680697
Note: See TracChangeset for help on using the changeset viewer.