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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.
Note: See TracChangeset for help on using the changeset viewer.