Changeset 11


Ignore:
Timestamp:
Nov 9, 2009, 4:15:39 PM (15 years ago)
Author:
george
Message:
  • Přidáno: Parsování pascalovského bloku var a begin-end.
Location:
branches/Void
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/Void/Example.void

    r10 r11  
    1 Define Text
    2 Text := Hell
    3 WriteLn('Leave me')
    4 WriteLn('Heal the world')
    5 ReadLn
     1var
     2  Text: string;
     3begin;
     4  Text := 'Hell';
     5  WriteLn('Leave me');
     6  WriteLn(Text);
     7  ReadLn;
     8end;
  • branches/Void/UCompilator.pas

    r10 r11  
    1717    FOnError: TOnErrorEvent;
    1818    procedure DoError(Text: string);
     19    procedure ParseBeginEnd;
     20    procedure ParseProgram;
     21    procedure ParseVariableDefinition;
    1922  public
    2023    Model: TModel;
     
    2326    Parser: TVoidParser;
    2427    procedure Compile;
    25     procedure Process;
    2628    constructor Create;
    2729    destructor Destroy; override;
     
    4244end;
    4345
     46procedure TCompilator.ParseProgram;
     47begin
     48  while SourceCode.Position < SourceCode.Size do
     49  with Model, Module, BeginEnd do begin
     50    if Parser.TokenType = ttWhiteSpace then begin
     51    end else
     52    if Parser.TokenType = ttIdentifier then begin
     53      if Parser.TokenValue = 'program' then begin
     54        Parser.ParseNextToken;
     55        if Parser.TokenType <> ttWhiteSpace then DoError('Expect white space');
     56        Parser.ParseNextToken;
     57        if Parser.TokenType <> ttString then DoError('Expect string');
     58        Parser.ParseNextToken;
     59        if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue <> ';') then DoError('Expect ;');
     60        Parser.ParseNextToken;
     61      end else
     62      if Parser.TokenValue = 'var' then begin
     63        ParseVariableDefinition;
     64      end else
     65      if Parser.TokenValue = 'begin' then begin
     66        ParseBeginEnd;
     67      end;
     68    end;
     69  end;
     70end;
     71
     72procedure TCompilator.ParseVariableDefinition;
     73var
     74  VariableName: string;
     75  VariableType: string;
     76  Variable: TVariable;
     77begin
     78  repeat
     79    Parser.ParseNextToken;
     80    if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
     81    Parser.ParseNextToken;
     82    if Parser.TokenType <> ttIdentifier then DoError('Expected identifier');
     83    VariableName := Parser.TokenValue;
     84    Parser.ParseNextToken;
     85    if Parser.TokenType = ttWhiteSpace then Parser.ParseNextToken;
     86    if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue = ':') then
     87      DoError('Expected :');
     88    Parser.ParseNextToken;
     89    if Parser.TokenType = ttWhiteSpace then Parser.ParseNextToken;
     90    if Parser.TokenType <> ttIdentifier then DoError('Expected identifier');
     91    VariableType := Parser.TokenValue;
     92
     93    with Model.Module do begin
     94    Variable := FindVariableByName(VariableName);
     95    if Assigned(Variable) then DoError('Variable ' + VariableName + ' redefined')
     96    else begin
     97      Variable := TVariable.Create;
     98      with Variable do begin
     99        Name := VariableName;
     100        VarType := VariableType;
     101      end;
     102      Variables.Add(Variable);
     103    end;
     104    end;
     105
     106    Parser.ParseNextToken;
     107    if (Parser.TokenType <> ttSymbol) and (Parser.TokenValue = ';') then
     108      DoError('Expected ;');
     109    Parser.ParseNextToken;
     110    if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
     111    Parser.ParseNextToken;
     112  until (Parser.TokenType = ttIdentifier) and ((Parser.TokenValue = 'begin') or
     113  (Parser.TokenValue = 'type'));
     114end;
     115
    44116procedure TCompilator.Compile;
    45117var
     
    49121  SourceCode.Position := 0;
    50122  Parser.Open(SourceCode);
    51 
    52   // Process source lines
    53   while SourceCode.Position < SourceCode.Size do begin;
    54     Process;
    55     Parser.ParseNextToken;
    56   end;
    57 
     123  ParseProgram;
    58124  Generator.Generate(Model);
    59125end;
    60126
    61 procedure TCompilator.Process;
     127procedure TCompilator.ParseBeginEnd;
    62128var
    63129  CommandName: string;
     
    67133  Value: string;
    68134begin
    69   with Model, BeginEnd do begin
     135  with Model, Module, BeginEnd do begin
     136    if Parser.TokenType = ttWhiteSpace then begin
     137    end else
    70138    if Parser.TokenType = ttIdentifier then begin
    71139      CommandName := Parser.TokenValue;
    72       if CommandName = 'Define' then begin
    73         Parser.ParseNextToken;
    74         if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
    75         Parser.ParseNextToken;
    76         if Parser.TokenType <> ttIdentifier then DoError('Expected identifier');
    77         VariableName := Parser.TokenValue;
    78         Variable := FindVariableByName(VariableName);
    79         if Assigned(Variable) then DoError('Variable ' + VariableName + ' redefined')
    80         else begin
    81           Variable := TVariable.Create;
    82           with Variable do begin
    83             Name := VariableName;
    84             VarType := 'string';
    85           end;
    86           Variables.Add(Variable);
    87         end;
    88       end else begin
     140      begin
    89141        Command := FindProcedureByName(CommandName);
    90142        if Assigned(Command) then begin
     
    131183        end;
    132184      end;
     185      Parser.ParseNextToken;
     186      if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
    133187    end else DoError('Expected identifier');
    134     Parser.ParseNextToken;
    135     if Parser.TokenType <> ttWhiteSpace then DoError('Expected white space');
    136188  end;
    137189end;
  • branches/Void/UModel.pas

    r9 r11  
    3636  end;
    3737
    38   { TModel }
    39 
    40   TModel = class
    41   private
     38  TModule = class
    4239  public
    4340    Variables: TList;
    4441    Procedures: TList;
    4542    BeginEnd: TBeginEnd;
     43    constructor Create;
     44    destructor Destroy; override;
     45    procedure Clear;
     46    function FindProcedureByName(AName: string): TProcedure;
    4647    function FindVariableByName(AName: string): TVariable;
    47     function FindProcedureByName(AName: string): TProcedure;
    4848    procedure Init;
     49  end;
     50
     51  { TModel }
     52
     53  TModel = class
     54  private
     55  public
     56    Module: TModule;
    4957    procedure Clear;
    5058    constructor Create;
     
    5664{ TModel }
    5765
     66procedure TModel.Clear;
     67begin
     68  Module.Clear;
     69end;
     70
    5871constructor TModel.Create;
     72begin
     73  Module := TModule.Create;
     74end;
     75
     76destructor TModel.Destroy;
     77begin
     78  Module.Destroy;
     79  inherited Destroy;
     80end;
     81
     82{ TBeginEnd }
     83
     84constructor TBeginEnd.Create;
     85begin
     86  Commands := TList.Create;
     87end;
     88
     89destructor TBeginEnd.Destroy;
     90var
     91  I: Integer;
     92begin
     93  for I := 0 to Commands.Count - 1 do
     94    TCommand(Commands[I]).Destroy;
     95  Commands.Destroy;
     96  inherited Destroy;
     97end;
     98
     99procedure TBeginEnd.Clear;
     100var
     101  I: Integer;
     102begin
     103  for I := 0 to Commands.Count - 1 do
     104    TCommand(Commands[I]).Destroy;
     105  Commands.Clear;
     106end;
     107
     108{ TCommand }
     109
     110constructor TCommand.Create;
     111begin
     112  Parameters := TStringList.Create;
     113end;
     114
     115destructor TCommand.Destroy;
     116begin
     117  Parameters.Destroy;
     118  inherited Destroy;
     119end;
     120
     121constructor TProcedure.Create;
     122begin
     123  BeginEnd := TBeginEnd.Create;
     124  Parameters := TStringList.Create;
     125end;
     126
     127destructor TProcedure.Destroy;
     128begin
     129  Parameters.Destroy;
     130  BeginEnd.Destroy;
     131  inherited Destroy;
     132end;
     133
     134{ TModule }
     135
     136constructor TModule.Create;
    59137begin
    60138  Variables := TList.Create;
     
    63141end;
    64142
    65 destructor TModel.Destroy;
     143destructor TModule.Destroy;
    66144var
    67145  I: Integer;
     
    77155end;
    78156
    79 function TModel.FindVariableByName(AName: string): TVariable;
     157function TModule.FindVariableByName(AName: string): TVariable;
    80158var
    81159  I: Integer;
     
    87165end;
    88166
    89 function TModel.FindProcedureByName(AName: string): TProcedure;
     167function TModule.FindProcedureByName(AName: string): TProcedure;
    90168var
    91169  I: Integer;
     
    97175end;
    98176
    99 procedure TModel.Init;
     177
     178procedure TModule.Init;
    100179begin
    101180  with TProcedure(Procedures[Procedures.Add(TProcedure.Create)]) do begin
     
    110189end;
    111190
    112 procedure TModel.Clear;
     191procedure TModule.Clear;
    113192var
    114193  I: Integer;
     
    121200end;
    122201
    123 
    124 { TBeginEnd }
    125 
    126 constructor TBeginEnd.Create;
    127 begin
    128   Commands := TList.Create;
    129 end;
    130 
    131 destructor TBeginEnd.Destroy;
    132 var
    133   I: Integer;
    134 begin
    135   for I := 0 to Commands.Count - 1 do
    136     TCommand(Commands[I]).Destroy;
    137   Commands.Destroy;
    138   inherited Destroy;
    139 end;
    140 
    141 procedure TBeginEnd.Clear;
    142 var
    143   I: Integer;
    144 begin
    145   for I := 0 to Commands.Count - 1 do
    146     TCommand(Commands[I]).Destroy;
    147   Commands.Clear;
    148 end;
    149 
    150 { TCommand }
    151 
    152 constructor TCommand.Create;
    153 begin
    154   Parameters := TStringList.Create;
    155 end;
    156 
    157 destructor TCommand.Destroy;
    158 begin
    159   Parameters.Destroy;
    160   inherited Destroy;
    161 end;
    162 
    163 constructor TProcedure.Create;
    164 begin
    165   BeginEnd := TBeginEnd.Create;
    166   Parameters := TStringList.Create;
    167 end;
    168 
    169 destructor TProcedure.Destroy;
    170 begin
    171   Parameters.Destroy;
    172   BeginEnd.Destroy;
    173   inherited Destroy;
    174 end;
    175 
    176202end.
    177203
  • branches/Void/UOutputGenerator.pas

    r10 r11  
    1414  TOutputGenerator = class
    1515  private
     16    Model: TModel;
    1617  public
    1718    Output: TStringList;
     
    2526  TPascalGenerator = class(TOutputGenerator)
    2627    procedure Generate(Model: TModel); override;
     28    procedure GenerateModule(Module: TModule);
    2729  end;
    2830
     
    3133  TCGenerator = class(TOutputGenerator)
    3234    procedure Generate(Model: TModel); override;
     35    procedure GenerateModule(Module: TModule);
    3336  end;
    3437
     
    3942procedure TOutputGenerator.Generate(Model: TModel);
    4043begin
    41 
     44  Self.Model := Model;
    4245end;
    4346
     
    5659
    5760procedure TPascalGenerator.Generate(Model: TModel);
     61begin
     62  inherited;
     63  GenerateModule(Model.Module);
     64end;
     65
     66procedure TPascalGenerator.GenerateModule(Module: TModule);
    5867var
    5968  I, P: Integer;
     
    6170  Row: string;
    6271begin
    63   inherited;
    64 
    65   with Model do begin
     72  with Module do begin
    6673    // Prepare output
    6774    Output.Clear;
     
    98105
    99106procedure TCGenerator.Generate(Model: TModel);
     107begin
     108  inherited;
     109  GenerateModule(Model.Module);
     110end;
     111
     112procedure TCGenerator.GenerateModule(Module: TModule);
    100113var
    101114  I, P: Integer;
    102115  Row: string;
    103116  ParameterText: string;
    104   begin
    105   inherited;
    106 
    107   with Model do begin
     117begin
     118  with Module do begin
    108119    // Prepare output
    109120    Output.Clear;
  • branches/Void/UVoidParser.pas

    r10 r11  
    6060        TokenStartPosition := Position;
    6161        if Character in [#13, #10, ' '] then begin
     62          TokenType := ttWhiteSpace;
    6263          ParseState := psWhiteSpace;
    6364        end else
  • branches/Void/project1.lpi

    r10 r11  
    99      <Icon Value="0"/>
    1010      <UseXPManifest Value="True"/>
    11       <ActiveEditorIndexAtStart Value="2"/>
     11      <ActiveEditorIndexAtStart Value="1"/>
    1212    </General>
    1313    <VersionInfo>
     
    3838        <IsPartOfProject Value="True"/>
    3939        <UnitName Value="project1"/>
    40         <CursorPos X="26" Y="17"/>
     40        <CursorPos X="21" Y="16"/>
    4141        <TopLine Value="1"/>
    4242        <EditorIndex Value="2"/>
    43         <UsageCount Value="29"/>
     43        <UsageCount Value="32"/>
    4444        <Loaded Value="True"/>
    4545      </Unit0>
     
    5353        <TopLine Value="68"/>
    5454        <EditorIndex Value="0"/>
    55         <UsageCount Value="29"/>
     55        <UsageCount Value="32"/>
    5656        <Loaded Value="True"/>
    5757      </Unit1>
     
    5959        <Filename Value="UCompilator.pas"/>
    6060        <UnitName Value="UCompilator"/>
    61         <CursorPos X="53" Y="116"/>
    62         <TopLine Value="99"/>
     61        <CursorPos X="1" Y="60"/>
     62        <TopLine Value="50"/>
    6363        <EditorIndex Value="1"/>
    64         <UsageCount Value="15"/>
     64        <UsageCount Value="16"/>
    6565        <Loaded Value="True"/>
    6666      </Unit2>
     
    6969        <IsPartOfProject Value="True"/>
    7070        <UnitName Value="UOutputGenerator"/>
    71         <CursorPos X="72" Y="87"/>
    72         <TopLine Value="71"/>
     71        <CursorPos X="12" Y="118"/>
     72        <TopLine Value="112"/>
    7373        <EditorIndex Value="4"/>
    74         <UsageCount Value="29"/>
     74        <UsageCount Value="32"/>
    7575        <Loaded Value="True"/>
    7676      </Unit3>
     
    8080        <CursorPos X="15" Y="4"/>
    8181        <TopLine Value="1"/>
    82         <UsageCount Value="29"/>
     82        <UsageCount Value="32"/>
    8383        <SyntaxHighlighter Value="None"/>
    8484      </Unit4>
     
    8787        <IsPartOfProject Value="True"/>
    8888        <UnitName Value="UModel"/>
    89         <CursorPos X="25" Y="87"/>
    90         <TopLine Value="83"/>
     89        <CursorPos X="24" Y="48"/>
     90        <TopLine Value="25"/>
    9191        <EditorIndex Value="5"/>
    92         <UsageCount Value="29"/>
     92        <UsageCount Value="32"/>
    9393        <Loaded Value="True"/>
    9494      </Unit5>
     
    122122        <IsPartOfProject Value="True"/>
    123123        <UnitName Value="UVoidParser"/>
    124         <CursorPos X="44" Y="54"/>
    125         <TopLine Value="40"/>
     124        <CursorPos X="9" Y="69"/>
     125        <TopLine Value="52"/>
    126126        <EditorIndex Value="3"/>
    127         <UsageCount Value="29"/>
     127        <UsageCount Value="32"/>
    128128        <Loaded Value="True"/>
    129129      </Unit10>
     
    138138      <Position1>
    139139        <Filename Value="UCompilator.pas"/>
    140         <Caret Line="107" Column="1" TopLine="92"/>
     140        <Caret Line="86" Column="1" TopLine="71"/>
    141141      </Position1>
    142142      <Position2>
    143143        <Filename Value="UCompilator.pas"/>
    144         <Caret Line="108" Column="1" TopLine="93"/>
     144        <Caret Line="88" Column="1" TopLine="73"/>
    145145      </Position2>
    146146      <Position3>
    147147        <Filename Value="UCompilator.pas"/>
    148         <Caret Line="109" Column="1" TopLine="94"/>
     148        <Caret Line="86" Column="22" TopLine="74"/>
    149149      </Position3>
    150150      <Position4>
    151151        <Filename Value="UCompilator.pas"/>
    152         <Caret Line="111" Column="1" TopLine="96"/>
     152        <Caret Line="48" Column="1" TopLine="33"/>
    153153      </Position4>
    154154      <Position5>
    155155        <Filename Value="UCompilator.pas"/>
    156         <Caret Line="112" Column="1" TopLine="97"/>
     156        <Caret Line="83" Column="1" TopLine="68"/>
    157157      </Position5>
    158158      <Position6>
    159159        <Filename Value="UCompilator.pas"/>
    160         <Caret Line="113" Column="1" TopLine="98"/>
     160        <Caret Line="84" Column="1" TopLine="69"/>
    161161      </Position6>
    162162      <Position7>
    163163        <Filename Value="UCompilator.pas"/>
    164         <Caret Line="114" Column="1" TopLine="99"/>
     164        <Caret Line="85" Column="1" TopLine="70"/>
    165165      </Position7>
    166166      <Position8>
    167167        <Filename Value="UCompilator.pas"/>
    168         <Caret Line="115" Column="1" TopLine="100"/>
     168        <Caret Line="86" Column="1" TopLine="71"/>
    169169      </Position8>
    170170      <Position9>
    171171        <Filename Value="UCompilator.pas"/>
    172         <Caret Line="116" Column="1" TopLine="101"/>
     172        <Caret Line="88" Column="1" TopLine="73"/>
    173173      </Position9>
    174174      <Position10>
    175175        <Filename Value="UCompilator.pas"/>
    176         <Caret Line="117" Column="1" TopLine="102"/>
     176        <Caret Line="89" Column="1" TopLine="74"/>
    177177      </Position10>
    178178      <Position11>
    179179        <Filename Value="UCompilator.pas"/>
    180         <Caret Line="116" Column="33" TopLine="103"/>
     180        <Caret Line="90" Column="1" TopLine="75"/>
    181181      </Position11>
    182182      <Position12>
    183183        <Filename Value="UCompilator.pas"/>
    184         <Caret Line="114" Column="23" TopLine="99"/>
     184        <Caret Line="91" Column="1" TopLine="76"/>
    185185      </Position12>
    186186      <Position13>
    187187        <Filename Value="UCompilator.pas"/>
    188         <Caret Line="113" Column="1" TopLine="98"/>
     188        <Caret Line="93" Column="1" TopLine="78"/>
    189189      </Position13>
    190190      <Position14>
    191         <Filename Value="UVoidParser.pas"/>
    192         <Caret Line="49" Column="1" TopLine="34"/>
     191        <Filename Value="UCompilator.pas"/>
     192        <Caret Line="94" Column="1" TopLine="79"/>
    193193      </Position14>
    194194      <Position15>
    195         <Filename Value="UVoidParser.pas"/>
    196         <Caret Line="51" Column="1" TopLine="36"/>
     195        <Filename Value="UCompilator.pas"/>
     196        <Caret Line="95" Column="1" TopLine="80"/>
    197197      </Position15>
    198198      <Position16>
    199         <Filename Value="UVoidParser.pas"/>
    200         <Caret Line="52" Column="1" TopLine="37"/>
     199        <Filename Value="UCompilator.pas"/>
     200        <Caret Line="97" Column="1" TopLine="82"/>
    201201      </Position16>
    202202      <Position17>
    203         <Filename Value="UVoidParser.pas"/>
    204         <Caret Line="54" Column="1" TopLine="39"/>
     203        <Filename Value="UCompilator.pas"/>
     204        <Caret Line="99" Column="1" TopLine="84"/>
    205205      </Position17>
    206206      <Position18>
    207         <Filename Value="UVoidParser.pas"/>
    208         <Caret Line="55" Column="1" TopLine="40"/>
     207        <Filename Value="UCompilator.pas"/>
     208        <Caret Line="100" Column="1" TopLine="85"/>
    209209      </Position18>
    210210      <Position19>
    211         <Filename Value="UVoidParser.pas"/>
    212         <Caret Line="56" Column="1" TopLine="41"/>
     211        <Filename Value="UCompilator.pas"/>
     212        <Caret Line="102" Column="1" TopLine="87"/>
    213213      </Position19>
    214214      <Position20>
    215         <Filename Value="UVoidParser.pas"/>
    216         <Caret Line="58" Column="1" TopLine="43"/>
     215        <Filename Value="UCompilator.pas"/>
     216        <Caret Line="106" Column="1" TopLine="91"/>
    217217      </Position20>
    218218      <Position21>
    219         <Filename Value="UVoidParser.pas"/>
    220         <Caret Line="60" Column="1" TopLine="45"/>
     219        <Filename Value="UCompilator.pas"/>
     220        <Caret Line="107" Column="1" TopLine="92"/>
    221221      </Position21>
    222222      <Position22>
    223         <Filename Value="UVoidParser.pas"/>
    224         <Caret Line="61" Column="1" TopLine="46"/>
     223        <Filename Value="UCompilator.pas"/>
     224        <Caret Line="109" Column="1" TopLine="94"/>
    225225      </Position22>
    226226      <Position23>
    227         <Filename Value="UVoidParser.pas"/>
    228         <Caret Line="64" Column="1" TopLine="49"/>
     227        <Filename Value="UCompilator.pas"/>
     228        <Caret Line="110" Column="1" TopLine="95"/>
    229229      </Position23>
    230230      <Position24>
    231         <Filename Value="UVoidParser.pas"/>
    232         <Caret Line="65" Column="1" TopLine="50"/>
     231        <Filename Value="UCompilator.pas"/>
     232        <Caret Line="111" Column="1" TopLine="96"/>
    233233      </Position24>
    234234      <Position25>
    235         <Filename Value="UVoidParser.pas"/>
    236         <Caret Line="165" Column="1" TopLine="142"/>
     235        <Filename Value="UCompilator.pas"/>
     236        <Caret Line="112" Column="1" TopLine="97"/>
    237237      </Position25>
    238238      <Position26>
    239239        <Filename Value="UCompilator.pas"/>
    240         <Caret Line="113" Column="1" TopLine="98"/>
     240        <Caret Line="114" Column="1" TopLine="99"/>
    241241      </Position26>
    242242      <Position27>
    243         <Filename Value="UVoidParser.pas"/>
    244         <Caret Line="56" Column="26" TopLine="40"/>
     243        <Filename Value="UCompilator.pas"/>
     244        <Caret Line="68" Column="1" TopLine="38"/>
    245245      </Position27>
    246246      <Position28>
    247         <Filename Value="UVoidParser.pas"/>
    248         <Caret Line="54" Column="44" TopLine="40"/>
     247        <Filename Value="UCompilator.pas"/>
     248        <Caret Line="49" Column="1" TopLine="34"/>
    249249      </Position28>
    250250      <Position29>
    251         <Filename Value="project1.lpr"/>
    252         <Caret Line="19" Column="1" TopLine="1"/>
     251        <Filename Value="UCompilator.pas"/>
     252        <Caret Line="50" Column="1" TopLine="35"/>
    253253      </Position29>
    254254      <Position30>
    255         <Filename Value="project1.lpr"/>
    256         <Caret Line="20" Column="36" TopLine="1"/>
     255        <Filename Value="UCompilator.pas"/>
     256        <Caret Line="52" Column="1" TopLine="37"/>
    257257      </Position30>
    258258    </JumpHistory>
     
    280280  </CompilerOptions>
    281281  <Debugging>
     282    <BreakPoints Count="2">
     283      <Item1>
     284        <Source Value="UCompilator.pas"/>
     285        <Line Value="47"/>
     286      </Item1>
     287      <Item2>
     288        <Source Value="UCompilator.pas"/>
     289        <Line Value="83"/>
     290      </Item2>
     291    </BreakPoints>
    282292    <Exceptions Count="3">
    283293      <Item1>
Note: See TracChangeset for help on using the changeset viewer.