Ignore:
Timestamp:
Nov 29, 2017, 12:31:26 PM (7 years ago)
Author:
chronos
Message:
  • Added: New rules flag directing if source node should be generated for them.
  • Added: New and Save menu actions.
Location:
branches/generator/Forms
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • branches/generator/Forms/UFormMain.lfm

    r118 r119  
    11object FormMain: TFormMain
    2   Left = 382
     2  Left = 376
    33  Height = 678
    4   Top = 195
     4  Top = 202
    55  Width = 1050
    66  Caption = 'Language generator'
     
    1717    Width = 1050
    1818    Align = alClient
     19    ScrollBars = ssAutoBoth
    1920    TabOrder = 0
    2021  end
     
    6768    object MenuItem2: TMenuItem
    6869      Caption = 'File'
     70      object MenuItem11: TMenuItem
     71        Action = ANew
     72      end
    6973      object MenuItem4: TMenuItem
    7074        Action = AOpen
     75      end
     76      object MenuItem10: TMenuItem
     77        Action = ASave
    7178      end
    7279      object MenuItem5: TMenuItem
     
    126133      OnExecute = ABuildCompilerExecute
    127134    end
     135    object ASave: TAction
     136      Caption = 'Save'
     137      ImageIndex = 5
     138      OnExecute = ASaveExecute
     139    end
     140    object ANew: TAction
     141      Caption = 'New'
     142      ImageIndex = 10
     143      OnExecute = ANewExecute
     144    end
    128145  end
    129146  object OpenDialog1: TOpenDialog
  • branches/generator/Forms/UFormMain.pas

    r118 r119  
    1515  TFormMain = class(TForm)
    1616    ABuildCompiler: TAction;
     17    ANew: TAction;
     18    ASave: TAction;
    1719    AExit: TAction;
    1820    AOpen: TAction;
     
    2426    MemoBNF: TMemo;
    2527    MenuItem1: TMenuItem;
     28    MenuItem10: TMenuItem;
     29    MenuItem11: TMenuItem;
    2630    MenuItem2: TMenuItem;
    2731    MenuItem3: TMenuItem;
     
    3943    procedure ABuildCompilerExecute(Sender: TObject);
    4044    procedure AExitExecute(Sender: TObject);
     45    procedure ANewExecute(Sender: TObject);
    4146    procedure AOpenExecute(Sender: TObject);
    4247    procedure ARulesExecute(Sender: TObject);
    4348    procedure ASaveAsExecute(Sender: TObject);
     49    procedure ASaveExecute(Sender: TObject);
    4450    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    4551    procedure FormShow(Sender: TObject);
    4652  private
    47     { private declarations }
     53    procedure ReloadMemo;
    4854  public
    4955    { public declarations }
     
    7076  FormRules.Rules := Core.Grammer.Rules;
    7177  FormRules.ShowModal;
    72   MemoBNF.Lines.Text := Core.Grammer.GetBNF;
     78  ReloadMemo;
    7379  FreeAndNil(FormRules);
    7480end;
     
    8288end;
    8389
     90procedure TFormMain.ASaveExecute(Sender: TObject);
     91begin
     92  Core.Grammer.SaveToXmlFile(Core.Grammer.FileName);
     93end;
     94
    8495procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    8596begin
     
    90101begin
    91102  Core.PersistentForm1.Load(Self, True);
    92   MemoBNF.Lines.Text := Core.Grammer.GetBNF;
     103  ReloadMemo;
     104end;
     105
     106procedure TFormMain.ReloadMemo;
     107begin
     108  MemoBNF.Lines.Text := Core.Grammer.GetString;
    93109end;
    94110
     
    98114end;
    99115
     116procedure TFormMain.ANewExecute(Sender: TObject);
     117begin
     118  Core.Grammer.Rules.Clear;
     119  ReloadMemo;
     120end;
     121
    100122procedure TFormMain.ABuildCompilerExecute(Sender: TObject);
    101 var
    102   ParserFile: TStringList;
    103   SourceFile: TStringList;
    104   Rule: TRule;
    105   Item: TRuleItem;
    106   OutputDir: string;
    107   Line: string;
    108   I: Integer;
    109123begin
    110   OutputDir := 'Generated';
    111   ForceDirectories(OutputDir);
    112 
    113   ParserFile := TStringList.Create;
    114   with ParserFile do begin
    115     Add('program Compiler;');
    116     Add('');
    117     Add('{$MODE Delphi}');
    118     Add('');
    119     Add('uses');
    120     Add('  Source;');
    121     Add('');
    122     Add('procedure Compile;');
    123     Add('begin');
    124     Add('end;');
    125     Add('');
    126     Add('begin');
    127     Add('  Compile;');
    128     Add('end.');
    129     SaveToFile(OutputDir + DirectorySeparator + 'Compiler.pas');
    130   end;
    131   FreeAndNil(ParserFile);
    132 
    133   SourceFile := TStringList.Create;
    134   with SourceFile do begin
    135     Add('unit Source;');
    136     Add('');
    137     Add('{$MODE Delphi}');
    138     Add('');
    139     Add('interface');
    140     Add('');
    141     Add('uses');
    142     Add('  fgl;');
    143     Add('');
    144     Add('type');
    145     for Rule in Core.Grammer.Rules do begin
    146       Add('  T' + Rule.Name + ' = class;');
    147     end;
    148     Add('');
    149     for Rule in Core.Grammer.Rules do begin
    150       Add('  T' + Rule.Name + ' = class');
    151       for Item in Rule.Items do begin
    152         if Item.RuleItemType = ritNonTerminal then
    153           if Item.Repetitive then
    154           Add('    ' + Item.NonTerminal.Name + ': TFPGObjectList<T' + Item.NonTerminal.Name + '>;')
    155           else Add('    ' + Item.NonTerminal.Name + ': T' + Item.NonTerminal.Name + ';');
    156       end;
    157       Add('  end;' + LineEnding);
    158     end;
    159     Add('');
    160     Add('implementation');
    161     Add('');
    162     for Rule in Core.Grammer.Rules do begin
    163       Add('function Parse' + Rule.Name + ': Boolean;');
    164       Add('begin');
    165       I := 0;
    166       for Item in Rule.Items do begin
    167         Line := '  ';
    168         if Rule.Items.RuleType = rtOr then begin
    169           if I > 0 then Line := Line + 'else ';
    170           Line := Line + 'if ';
    171         end else
    172         if Rule.Items.RuleType = rtAnd then begin
    173           Line := Line + '';
    174         end;
    175         if Item.RuleItemType = ritTerminal then
    176           Line := Line + 'Expect(''' + Item.Terminal + ''')'
    177         else if Item.RuleItemType = ritNonTerminal then
    178           Line := Line + 'Parse' + Item.NonTerminal.Name;
    179         if Rule.Items.RuleType = rtOr then begin
    180           Line := Line + ' then ';
    181         end else
    182         if Rule.Items.RuleType = rtAnd then begin
    183           Line := Line + ';';
    184         end;
    185         Add(Line);
    186         Inc(I);
    187       end;
    188       if Rule.Items.RuleType = rtOr then begin
    189         Add('  else ShowError(''Unexpected token'');');
    190       end;
    191       Add('end;');
    192       Add('');
    193     end;
    194 
    195     Add('end.');
    196 
    197     SaveToFile(OutputDir + DirectorySeparator +'Source.pas');
    198   end;
    199   FreeAndNil(SourceFile);
     124  Core.Grammer.BuildCompiler;
    200125end;
    201126
     
    205130  if OpenDialog1.Execute then begin
    206131    Core.Grammer.LoadFromXmlFile(OpenDialog1.FileName);
     132    ReloadMemo;
    207133  end;
    208134end;
  • branches/generator/Forms/UFormRule.lfm

    r117 r119  
    1515    Left = 376
    1616    Height = 25
    17     Top = 476
     17    Top = 480
    1818    Width = 75
    1919    Anchors = [akLeft, akBottom]
     
    2525    Left = 168
    2626    Height = 25
    27     Top = 476
     27    Top = 480
    2828    Width = 75
    2929    Anchors = [akLeft, akBottom]
     
    4141  end
    4242  object PageControl1: TPageControl
    43     Left = 16
    44     Height = 421
    45     Top = 48
     43    Left = 8
     44    Height = 392
     45    Top = 80
    4646    Width = 640
    4747    ActivePage = TabSheet1
     
    6363    TabOrder = 3
    6464  end
     65  object CheckBoxCreateNode: TCheckBox
     66    Left = 16
     67    Height = 24
     68    Top = 48
     69    Width = 152
     70    Caption = 'Create source node'
     71    TabOrder = 4
     72  end
    6573end
  • branches/generator/Forms/UFormRule.pas

    r117 r119  
    1616    ButtonOk: TButton;
    1717    ButtonCancel: TButton;
     18    CheckBoxCreateNode: TCheckBox;
    1819    EditName: TEdit;
    1920    Label1: TLabel;
     
    6465  Self.Rule := Rule;
    6566  EditName.Text := Rule.Name;
     67  CheckBoxCreateNode.Checked := Rule.CreateSourceNode;
    6668  FormRuleItems.LoadData(Rule.Items);
    6769end;
     
    7072begin
    7173  Rule.Name := EditName.Text;
     74  Rule.CreateSourceNode := CheckBoxCreateNode.Checked;
    7275  FormRuleItems.SaveData(Rule.Items);
    7376end;
  • branches/generator/Forms/UFormRuleItems.pas

    r117 r119  
    7171begin
    7272  if (Item.Index >= 0) and (Item.Index < RuleItems.Count) then begin
    73     Item.Caption := RuleItems[Item.Index].GetBNF;
     73    Item.Caption := RuleItems[Item.Index].GetString;
    7474    Item.Data := RuleItems[Item.Index];
    7575  end;
     
    9797  RuleItem: TRuleItem;
    9898begin
    99   RuleItem := TRuleItem(ListView.Selected.Data);
    100   FormRuleItem := TFormRuleItem.Create(nil);
    101   FormRuleItem.LoadData(RuleItem);
    102   if FormRuleItem.ShowModal = mrOk then begin
    103     FormRuleItem.SaveData(RuleItem);
    104     ReloadList;
     99  if Assigned(ListView.Selected) then begin
     100    RuleItem := TRuleItem(ListView.Selected.Data);
     101    FormRuleItem := TFormRuleItem.Create(nil);
     102    FormRuleItem.LoadData(RuleItem);
     103    if FormRuleItem.ShowModal = mrOk then begin
     104      FormRuleItem.SaveData(RuleItem);
     105      ReloadList;
     106    end;
     107    FreeAndNil(FormRuleItem);
    105108  end;
    106   FreeAndNil(FormRuleItem);
    107109end;
    108110
  • branches/generator/Forms/UFormRules.lfm

    r116 r119  
    7272      end   
    7373      item
     74        Caption = 'Node'
     75        Width = 80
     76      end   
     77      item
    7478        Caption = 'Items'
    75         Width = 629
     79        Width = 500
    7680      end>
    7781    MultiSelect = True
  • branches/generator/Forms/UFormRules.pas

    r117 r119  
    5858  UFormRule, UCore;
    5959
     60const
     61  BooleanText: array[Boolean] of string = ('No', 'Yes');
     62
    6063{ TFormRules }
    6164
     
    8891  FormRule: TFormRule;
    8992begin
    90   Rule := TRule(ListView1.Selected.Data);
    91   FormRule := TFormRule.Create(nil);
    92   FormRule.LoadData(Rule);
    93   if FormRule.ShowModal = mrOk then begin
    94     FormRule.SaveData(Rule);
    95     ReloadList;
     93  if Assigned(ListView1.Selected) then begin
     94    Rule := TRule(ListView1.Selected.Data);
     95    FormRule := TFormRule.Create(nil);
     96    FormRule.LoadData(Rule);
     97    if FormRule.ShowModal = mrOk then begin
     98      FormRule.SaveData(Rule);
     99      ReloadList;
     100    end;
     101    FreeAndNil(FormRule);
    96102  end;
    97   FreeAndNil(FormRule);
    98103end;
    99104
     
    123128    Item.Caption := Rules[Item.Index].Name;
    124129    Item.Data := Rules[Item.Index];
    125     Item.SubItems.Add(Rules[Item.Index].Items.GetBNF);
     130    Item.SubItems.Add(BooleanText[Rules[Item.Index].CreateSourceNode]);
     131    Item.SubItems.Add(Rules[Item.Index].Items.GetString);
    126132  end;
    127133end;
Note: See TracChangeset for help on using the changeset viewer.