Changeset 135 for branches/generator


Ignore:
Timestamp:
Dec 26, 2017, 4:07:07 PM (7 years ago)
Author:
chronos
Message:
  • Added: Track position in source code as Line and Row instead just index.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/generator/UBuilder.pas

    r134 r135  
    8585    Add('');
    8686    Add('uses');
    87     Add('  SysUtils, Tokenizer;');
     87    Add('  SysUtils, Tokenizer, Types;');
    8888    Add('');
    8989    Add('type');
     90    Add('  TPosition = record');
     91    Add('    Index: Integer;');
     92    Add('    Pos: TPoint;');
     93    Add('    procedure Calc(Text: string);');
     94    Add('  end;');
     95    Add('');
    9096    Add('  TParser = class');
    9197    Add('    Tokenizer: TTokenizer;');
    9298    Add('    Content: string;');
    9399    Add('    FileName: string;');
    94     Add('    Position: Integer;');
     100    Add('    Position: TPosition;');
    95101    Add('    procedure Error(Text: string);');
    96102    Add('    function Expect(Text: string; Required: Boolean = False): Boolean;');
     
    106112    Add('implementation');
    107113    Add('');
     114    Add('procedure TPosition.Calc(Text: string);');
     115    Add('var');
     116    Add('  I: Integer;');
     117    Add('begin');
     118    Add('  for I := 1 to Length(Text) do begin');
     119    Add('    Inc(Pos.X);');
     120    Add('    Inc(Index);');
     121    Add('    if Text[I] = LineEnding then begin');
     122    Add('      Pos.X := 1;');
     123    Add('      Inc(Pos.Y);');
     124    Add('    end;');
     125    Add('  end;');
     126    Add('end;');
     127    Add('');
    108128    Add('constructor TParser.Create;');
    109129    Add('begin');
    110     Add('  Position := 1;');
     130    Add('  Position.Index := 1;');
     131    Add('  Position.Pos := Point(1, 1);');
    111132    Add('  Tokenizer := TTokenizer.Create;');
    112133    Add('end;');
     
    119140    Add('procedure TParser.Error(Text: string);');
    120141    Add('begin');
    121     Add('  WriteLn(FileName + ''('' + IntToStr(Position) + '') Error: '' + Text);');
     142    Add('  WriteLn(FileName + ''('' + IntToStr(Position.Pos.X) + '','' + IntToStr(Position.Pos.Y) + '') Error: '' + Text);');
    122143    Add('end;');
    123144    Add('');
     
    125146    Add('var');
    126147    Add('  ReadText: string;');
    127     Add('  StartPos: Integer;');
     148    Add('  StartPos: TPosition;');
    128149    Add('begin');
    129150    Add('  StartPos := Position;');
    130     Add('  ReadText := Copy(Content, Position, Length(Text));');
    131     Add('  Inc(Position, Length(Text));');
     151    Add('  ReadText := Copy(Content, Position.Index, Length(Text));');
     152    Add('  Position.Calc(Text);');
    132153    Add('  Result := Text = ReadText;');
    133154    Add('  if not Result then begin');
     
    140161    Add('var');
    141162    Add('  ReadChar: Char;');
    142     Add('  StartPos: Integer;');
     163    Add('  StartPos: TPosition;');
    143164    Add('begin');
    144165    Add('  StartPos := Position;');
    145     Add('  ReadChar := Content[Position];');
    146     Add('  Inc(Position, 1);');
     166    Add('  ReadChar := Content[Position.Index];');
     167    Add('  Position.Calc(Content[Position.Index]);');
    147168    Add('  Result := (ReadChar >= CharFrom) and (ReadChar <= CharTo);');
    148169    Add('  if not Result then begin');
     
    152173    Add('end;');
    153174    Add('');
    154     LocalFunctionIndex := 1;
    155     LocalFunctions := '';
    156175    for Rule in Grammer.Rules do
    157176    //if Rule.Level = rlParser then
    158177    begin
     178      LocalFunctionIndex := 1;
     179      LocalFunctions := '';
    159180      FunctionBody := BuildParserItems(Rule.Items, True, 1);
    160181      Text := Text + 'function TParser.Parse' + Rule.Name + '(Required: Boolean = False): Boolean;' + LineEnding;
    161182      Text := Text + LocalFunctions;
    162       Text := Text + 'var' + LineBreak + '  OldPosition: Integer;' + LineEnding;
     183      Text := Text + 'var' + LineBreak;
     184      Text := Text + '  OldPosition: TPosition;' + LineEnding;
    163185      Text := Text + 'begin' + LineEnding;
    164186      Text := Text + '  Result := True;' + LineEnding;
Note: See TracChangeset for help on using the changeset viewer.