Changeset 135 for branches/generator/UBuilder.pas
- Timestamp:
- Dec 26, 2017, 4:07:07 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/generator/UBuilder.pas
r134 r135 85 85 Add(''); 86 86 Add('uses'); 87 Add(' SysUtils, Tokenizer ;');87 Add(' SysUtils, Tokenizer, Types;'); 88 88 Add(''); 89 89 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(''); 90 96 Add(' TParser = class'); 91 97 Add(' Tokenizer: TTokenizer;'); 92 98 Add(' Content: string;'); 93 99 Add(' FileName: string;'); 94 Add(' Position: Integer;');100 Add(' Position: TPosition;'); 95 101 Add(' procedure Error(Text: string);'); 96 102 Add(' function Expect(Text: string; Required: Boolean = False): Boolean;'); … … 106 112 Add('implementation'); 107 113 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(''); 108 128 Add('constructor TParser.Create;'); 109 129 Add('begin'); 110 Add(' Position := 1;'); 130 Add(' Position.Index := 1;'); 131 Add(' Position.Pos := Point(1, 1);'); 111 132 Add(' Tokenizer := TTokenizer.Create;'); 112 133 Add('end;'); … … 119 140 Add('procedure TParser.Error(Text: string);'); 120 141 Add('begin'); 121 Add(' WriteLn(FileName + ''('' + IntToStr(Position ) + '') Error: '' + Text);');142 Add(' WriteLn(FileName + ''('' + IntToStr(Position.Pos.X) + '','' + IntToStr(Position.Pos.Y) + '') Error: '' + Text);'); 122 143 Add('end;'); 123 144 Add(''); … … 125 146 Add('var'); 126 147 Add(' ReadText: string;'); 127 Add(' StartPos: Integer;');148 Add(' StartPos: TPosition;'); 128 149 Add('begin'); 129 150 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);'); 132 153 Add(' Result := Text = ReadText;'); 133 154 Add(' if not Result then begin'); … … 140 161 Add('var'); 141 162 Add(' ReadChar: Char;'); 142 Add(' StartPos: Integer;');163 Add(' StartPos: TPosition;'); 143 164 Add('begin'); 144 165 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]);'); 147 168 Add(' Result := (ReadChar >= CharFrom) and (ReadChar <= CharTo);'); 148 169 Add(' if not Result then begin'); … … 152 173 Add('end;'); 153 174 Add(''); 154 LocalFunctionIndex := 1;155 LocalFunctions := '';156 175 for Rule in Grammer.Rules do 157 176 //if Rule.Level = rlParser then 158 177 begin 178 LocalFunctionIndex := 1; 179 LocalFunctions := ''; 159 180 FunctionBody := BuildParserItems(Rule.Items, True, 1); 160 181 Text := Text + 'function TParser.Parse' + Rule.Name + '(Required: Boolean = False): Boolean;' + LineEnding; 161 182 Text := Text + LocalFunctions; 162 Text := Text + 'var' + LineBreak + ' OldPosition: Integer;' + LineEnding; 183 Text := Text + 'var' + LineBreak; 184 Text := Text + ' OldPosition: TPosition;' + LineEnding; 163 185 Text := Text + 'begin' + LineEnding; 164 186 Text := Text + ' Result := True;' + LineEnding;
Note:
See TracChangeset
for help on using the changeset viewer.