Ignore:
Timestamp:
Nov 30, 2017, 12:02:32 AM (7 years ago)
Author:
chronos
Message:
  • Added: New project Close action.
  • Added: Track project Modified flag and offer project save if modified project is closed.
  • Added: Remember last opened project file.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/generator/URules.pas

    r125 r126  
    120120    procedure LoadFromXmlFile(FileName: string);
    121121    procedure SaveToXmlFile(FileName: string);
     122    procedure Clear;
    122123    constructor Create;
    123124    destructor Destroy; override;
     
    148149  ParserFile := TStringList.Create;
    149150  with ParserFile do begin
    150     Add('unit Parse;');
     151    Add('unit Parser;');
    151152    Add('');
    152153    Add('{$MODE Delphi}');
     
    158159    Add('    Content: string;');
    159160    Add('    Position: Integer;');
     161    Add('    procedure Error(Text: string);');
    160162    Add('    function Expect(Text: string; Required: Boolean = False): Boolean;');
    161163    Add('    function ExpectRange(CharFrom, CharTo: Char; Required: Boolean = False): Boolean;');
    162164    for Rule in Rules do
    163165      Add('    function Parse' + Rule.Name + ': Boolean;');
     166    Add('    constructor Create;');
    164167    Add('  end;');
    165168    Add('');
    166169    Add('implementation');
     170    Add('');
     171    Add('constructor TParser.Create;');
     172    Add('begin');
     173    Add('  Position := 1;');
     174    Add('end;');
     175    Add('');
     176    Add('procedure TParser.Error(Text: string);');
     177    Add('begin');
     178    Add('  WriteLn(''Error: '' + Text);');
     179    Add('end;');
    167180    Add('');
    168181    Add('function TParser.Expect(Text: string; Required: Boolean = False): Boolean;');
     
    172185    Add('  ReadText := Copy(Content, Position, Length(Text));');
    173186    Add('  Inc(Position, Length(Text));');
    174     Add('  Result := Text = ReadText');
     187    Add('  Result := Text = ReadText;');
    175188    Add('  if not Result and Required then Error(''Expected '' + Text + '' but found '' + ReadText + ''.'');');
    176189    Add('end;');
     
    242255    Add('procedure Compile(FileName: string);');
    243256    Add('var');
    244     Add('  SourceFile: Text;');
     257    Add('  SourceFile: file of Char;');
     258    Add('  Parser: TParser;');
     259    Add('  I: Integer;');
    245260    Add('begin');
    246261    Add('  AssignFile(SourceFile, FileName);');
    247262    Add('  Reset(SourceFile);');
    248     Add('  SetLength(Content, FileSize(SourceFile));');
    249263    Add('  Parser := TParser.Create;');
    250     Add('  Read(SourceFile, Parser.Content);');
     264    Add('  SetLength(Parser.Content, FileSize(SourceFile));');
     265    Add('  I := 1;');
     266    Add('  while not Eof(SourceFile) do begin');
     267    Add('    Read(SourceFile, Parser.Content[I]);');
     268    Add('    Inc(I);');
     269    Add('  end;');
    251270    Add('  CloseFile(SourceFile);');
    252271    if Assigned(TopRule) then
     
    256275    Add('');
    257276    Add('begin');
    258     Add('  if ParamCount > 1 then');
    259     Add('    Compile(ParamStr(1));');
     277    Add('  if ParamCount > 0 then');
     278    Add('    Compile(ParamStr(1))');
     279    Add('    else WriteLn(''File name not specified as parameter.'');');
    260280    Add('end.');
    261281    SaveToFile(FileName);
     
    269289  Item: TRuleItem;
    270290  SourceFile: TStringList;
     291  TypeSectionStarted: Boolean;
    271292begin
    272293  SourceFile := TStringList.Create;
     
    281302    Add('  fgl;');
    282303    Add('');
    283     Add('type');
     304    TypeSectionStarted := False;
    284305    for Rule in Rules do
    285306    if Rule.CreateSourceNode then begin
     307      if not TypeSectionStarted then begin
     308        Add('type');
     309        TypeSectionStarted := True;
     310      end;
    286311      Add('  T' + Rule.Name + ' = class;');
    287312    end;
     
    365390end;
    366391
     392procedure TGrammer.Clear;
     393begin
     394  TopRule := nil;
     395  Rules.Clear;
     396end;
     397
    367398constructor TGrammer.Create;
    368399begin
Note: See TracChangeset for help on using the changeset viewer.