Changeset 110


Ignore:
Timestamp:
Aug 8, 2017, 11:15:41 PM (7 years ago)
Author:
chronos
Message:
  • Added: Rule items can be managed.
  • Added: Show BNF syntax on main form.
Location:
branches/generator
Files:
2 added
8 edited

Legend:

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

    r109 r110  
    55  Width = 1050
    66  Caption = 'Language generator'
     7  ClientHeight = 646
     8  ClientWidth = 1050
    79  Menu = MainMenu1
     10  OnShow = FormShow
    811  LCLVersion = '1.6.4.0'
     12  object MemoBNF: TMemo
     13    Left = 0
     14    Height = 646
     15    Top = 0
     16    Width = 1050
     17    Align = alClient
     18    TabOrder = 0
     19  end
    920  object MainMenu1: TMainMenu
    1021    left = 240
  • branches/generator/Forms/UFormMain.pas

    r109 r110  
    2020    ActionList1: TActionList;
    2121    MainMenu1: TMainMenu;
     22    MemoBNF: TMemo;
    2223    MenuItem1: TMenuItem;
    2324    MenuItem2: TMenuItem;
     
    3334    procedure ARulesExecute(Sender: TObject);
    3435    procedure ASaveAsExecute(Sender: TObject);
     36    procedure FormShow(Sender: TObject);
    3537  private
    3638    { private declarations }
     
    5557begin
    5658  FormRules.Rules := Core.Rules;
    57   FormRules.Show;
     59  FormRules.ShowModal;
     60  MemoBNF.Lines.Text := Core.Rules.GetBNF;
    5861end;
    5962
    6063procedure TFormMain.ASaveAsExecute(Sender: TObject);
    6164begin
     65  SaveDialog1.FileName := Core.Rules.FileName;
    6266  if SaveDialog1.Execute then begin
    6367    Core.Rules.SaveToXmlFile(SaveDialog1.FileName);
    6468  end;
     69end;
     70
     71procedure TFormMain.FormShow(Sender: TObject);
     72begin
     73  MemoBNF.Lines.Text := Core.Rules.GetBNF;
    6574end;
    6675
     
    7281procedure TFormMain.AOpenExecute(Sender: TObject);
    7382begin
     83  OpenDialog1.FileName := Core.Rules.FileName;
    7484  if OpenDialog1.Execute then begin
    7585    Core.Rules.LoadFromXmlFile(OpenDialog1.FileName);
  • branches/generator/Forms/UFormRule.lfm

    r109 r110  
    1313    Left = 376
    1414    Height = 25
    15     Top = 328
     15    Top = 360
    1616    Width = 75
     17    Anchors = [akLeft, akBottom]
    1718    Caption = 'Ok'
    1819    ModalResult = 1
     
    2021  end
    2122  object ButtonCancel: TButton
    22     Left = 176
     23    Left = 168
    2324    Height = 25
    24     Top = 328
     25    Top = 360
    2526    Width = 75
     27    Anchors = [akLeft, akBottom]
    2628    Caption = 'Cancel'
    2729    ModalResult = 2
     
    4345    TabOrder = 2
    4446  end
     47  object ListView: TListView
     48    Left = 16
     49    Height = 264
     50    Top = 80
     51    Width = 624
     52    Anchors = [akTop, akLeft, akBottom]
     53    Columns = <   
     54      item
     55        Caption = 'Name'
     56        Width = 604
     57      end>
     58    MultiSelect = True
     59    OwnerData = True
     60    PopupMenu = PopupMenu1
     61    ReadOnly = True
     62    RowSelect = True
     63    TabOrder = 3
     64    ViewStyle = vsReport
     65    OnData = ListViewData
     66    OnDblClick = ListViewDblClick
     67    OnKeyPress = ListViewKeyPress
     68    OnSelectItem = ListViewSelectItem
     69  end
     70  object ActionList1: TActionList
     71    left = 347
     72    top = 187
     73    object AAdd: TAction
     74      Caption = 'Add'
     75      OnExecute = AAddExecute
     76    end
     77    object AModify: TAction
     78      Caption = 'Modify'
     79      OnExecute = AModifyExecute
     80    end
     81    object ARemove: TAction
     82      Caption = 'Remove'
     83      OnExecute = ARemoveExecute
     84    end
     85  end
     86  object PopupMenu1: TPopupMenu
     87    left = 118
     88    top = 185
     89    object MenuItem1: TMenuItem
     90      Action = AAdd
     91    end
     92    object MenuItem2: TMenuItem
     93      Action = AModify
     94    end
     95    object MenuItem3: TMenuItem
     96      Action = ARemove
     97    end
     98  end
    4599end
  • branches/generator/Forms/UFormRule.pas

    r109 r110  
    77uses
    88  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
    9   URules;
     9  ComCtrls, ActnList, Menus, URules;
    1010
    1111type
     
    1414
    1515  TFormRule = class(TForm)
     16    AAdd: TAction;
     17    AModify: TAction;
     18    ARemove: TAction;
     19    ActionList1: TActionList;
    1620    ButtonOk: TButton;
    1721    ButtonCancel: TButton;
    1822    EditName: TEdit;
    1923    Label1: TLabel;
     24    ListView: TListView;
     25    MenuItem1: TMenuItem;
     26    MenuItem2: TMenuItem;
     27    MenuItem3: TMenuItem;
     28    PopupMenu1: TPopupMenu;
     29    procedure AAddExecute(Sender: TObject);
     30    procedure AModifyExecute(Sender: TObject);
     31    procedure ARemoveExecute(Sender: TObject);
    2032    procedure FormShow(Sender: TObject);
     33    procedure ListViewData(Sender: TObject; Item: TListItem);
     34    procedure ListViewDblClick(Sender: TObject);
     35    procedure ListViewKeyPress(Sender: TObject; var Key: char);
     36    procedure ListViewSelectItem(Sender: TObject; Item: TListItem;
     37      Selected: Boolean);
    2138  private
    2239    { private declarations }
    2340  public
     41    RuleItems: TRuleItems;
     42    procedure UpdateInterface;
     43    procedure ReloadList;
    2444    procedure LoadData(Rule: TRule);
    2545    procedure SaveData(Rule: TRule);
     
    2949  FormRule: TFormRule;
    3050
     51
    3152implementation
    3253
    3354{$R *.lfm}
     55
     56uses
     57  UFormRuleItem;
    3458
    3559{ TFormRule }
     
    3862begin
    3963  EditName.SetFocus;
     64  ReloadList;
     65  UpdateInterface;
     66end;
     67
     68procedure TFormRule.ListViewData(Sender: TObject; Item: TListItem);
     69begin
     70  if (Item.Index >= 0) and (Item.Index < RuleItems.Count) then begin
     71    Item.Caption := RuleItems[Item.Index].Name;
     72    Item.Data := RuleItems[Item.Index];
     73  end;
     74end;
     75
     76procedure TFormRule.ListViewDblClick(Sender: TObject);
     77begin
     78  AModify.Execute;
     79end;
     80
     81procedure TFormRule.ListViewKeyPress(Sender: TObject; var Key: char);
     82begin
     83  if Key = #13 then AModify.Execute;
     84end;
     85
     86procedure TFormRule.ListViewSelectItem(Sender: TObject; Item: TListItem;
     87  Selected: Boolean);
     88begin
     89  UpdateInterface;
     90end;
     91
     92procedure TFormRule.AAddExecute(Sender: TObject);
     93var
     94  NewRuleItem: TRuleItem;
     95begin
     96  NewRuleItem := TRuleItem.Create;
     97  FormRuleItem.LoadData(NewRuleItem);
     98  if FormRuleItem.ShowModal = mrOk then begin
     99    FormRuleItem.SaveData(NewRuleItem);
     100    RuleItems.Add(NewRuleItem);
     101    ReloadList;
     102  end else FreeAndNil(NewRuleItem);
     103end;
     104
     105procedure TFormRule.AModifyExecute(Sender: TObject);
     106var
     107  RuleItem: TRuleItem;
     108begin
     109  RuleItem := TRuleItem(ListView.Selected.Data);
     110  FormRuleItem.LoadData(RuleItem);
     111  if FormRuleItem.ShowModal = mrOk then begin
     112    FormRuleItem.SaveData(RuleItem);
     113    ReloadList;
     114  end;
     115end;
     116
     117procedure TFormRule.ARemoveExecute(Sender: TObject);
     118var
     119  Item: TListItem;
     120begin
     121  for Item in ListView.Items do
     122  if Item.Selected then
     123    RuleItems.Remove(TRuleItem(Item.Data));
     124  ReloadList;
     125end;
     126
     127procedure TFormRule.UpdateInterface;
     128begin
     129  AModify.Enabled := Assigned(ListView.Selected);
     130  ARemove.Enabled := Assigned(ListView.Selected);
     131end;
     132
     133procedure TFormRule.ReloadList;
     134begin
     135  ListView.Items.Count := RuleItems.Count;
     136  ListView.Refresh;
    40137end;
    41138
     
    43140begin
    44141  EditName.Text := Rule.Name;
     142  RuleItems := Rule.Items;
    45143end;
    46144
  • branches/generator/URules.pas

    r109 r110  
    1010type
    1111
     12  { TRuleItem }
     13
     14  TRuleItem = class
     15    Name: string;
     16    procedure LoadFromXmlNode(Node: TDOMNode);
     17    procedure SaveToXmlNode(Node: TDOMNode);
     18  end;
     19
     20  { TRuleItems }
     21
     22  TRuleItems = class(TFPGObjectList<TRuleItem>)
     23    procedure LoadFromXmlNode(Node: TDOMNode);
     24    procedure SaveToXmlNode(Node: TDOMNode);
     25  end;
     26
    1227  { TRule }
    1328
    1429  TRule = class
    1530    Name: string;
    16     procedure SaveToXmlNode(Node: TDOMNode);
    17     procedure LoadFromXmlNode(Node: TDOMNode);
     31    Items: TRuleItems;
     32    constructor Create;
     33    destructor Destroy; override;
     34    procedure LoadFromXmlNode(Node: TDOMNode);
     35    procedure SaveToXmlNode(Node: TDOMNode);
     36    function GetBNF: string;
    1837  end;
    1938
     
    2140
    2241  TRules = class(TFPGObjectList<TRule>)
     42    FileName: string;
     43    procedure LoadFromXmlNode(Node: TDOMNode);
     44    procedure SaveToXmlNode(Node: TDOMNode);
    2345    procedure LoadFromXmlFile(FileName: string);
    2446    procedure SaveToXmlFile(FileName: string);
     47    function GetBNF: string;
    2548  end;
    2649
    2750implementation
    2851
     52{ TRuleItem }
     53
     54procedure TRuleItem.SaveToXmlNode(Node: TDOMNode);
     55begin
     56  WriteString(Node, 'Name', Name);
     57end;
     58
     59procedure TRuleItem.LoadFromXmlNode(Node: TDOMNode);
     60begin
     61  Name := ReadString(Node, 'Name', '');
     62end;
     63
     64{ TRuleItems }
     65
     66procedure TRuleItems.SaveToXmlNode(Node: TDOMNode);
     67var
     68  RuleItem: TRuleItem;
     69  RuleItemNode: TDOMNode;
     70begin
     71  for RuleItem in Self do begin
     72    RuleItemNode := Node.OwnerDocument.CreateElement('RuleItem');
     73    RuleItem.SaveToXmlNode(RuleItemNode);
     74    Node.AppendChild(RuleItemNode);
     75  end;
     76end;
     77
     78procedure TRuleItems.LoadFromXmlNode(Node: TDOMNode);
     79var
     80  RuleItemNode: TDOMNode;
     81  RuleItem: TRuleItem;
     82begin
     83  RuleItemNode := Node.FirstChild;
     84  while Assigned(RuleItemNode) do begin
     85    if RuleItemNode.NodeName = 'RuleItem' then begin
     86      RuleItem := TRuleItem.Create;
     87      RuleItem.LoadFromXmlNode(RuleItemNode);
     88      Add(RuleItem);
     89    end;
     90    RuleItemNode := RuleItemNode.NextSibling;
     91  end;
     92end;
     93
    2994{ TRule }
    3095
    3196procedure TRule.SaveToXmlNode(Node: TDOMNode);
     97var
     98  RuleItemsNode: TDOMNode;
    3299begin
    33100  WriteString(Node, 'Name', Name);
     101
     102  RuleItemsNode := Node.OwnerDocument.CreateElement('RuleItems');
     103  Node.AppendChild(RuleItemsNode);
     104  Items.SaveToXmlNode(RuleItemsNode);
     105end;
     106
     107function TRule.GetBNF: string;
     108var
     109  Item: TRuleItem;
     110begin
     111  Result := Name + ' ::=';
     112  for Item in Items do begin
     113    Result := Result + ' ' + Item.Name;
     114  end;
     115end;
     116
     117constructor TRule.Create;
     118begin
     119  Items := TRuleItems.Create;
     120end;
     121
     122destructor TRule.Destroy;
     123begin
     124  FreeAndNil(Items);
     125  inherited Destroy;
    34126end;
    35127
    36128procedure TRule.LoadFromXmlNode(Node: TDOMNode);
     129var
     130  ItemsNode: TDOMNode;
    37131begin
    38132  Name := ReadString(Node, 'Name', '');
     133
     134  ItemsNode := Node.FindNode('RuleItems');
     135  if Assigned(ItemsNode) then begin
     136    Items.LoadFromXmlNode(ItemsNode);
     137  end;
    39138end;
    40139
    41140{ TRules }
     141
     142procedure TRules.SaveToXmlNode(Node: TDOMNode);
     143var
     144  Rule: TRule;
     145  RuleNode: TDOMNode;
     146begin
     147  for Rule in Self do begin
     148    RuleNode := Node.OwnerDocument.CreateElement('Rule');
     149    Rule.SaveToXmlNode(RuleNode);
     150    Node.AppendChild(RuleNode);
     151  end;
     152end;
     153
     154procedure TRules.LoadFromXmlNode(Node: TDOMNode);
     155var
     156  RuleNode: TDOMNode;
     157  Rule: TRule;
     158begin
     159  RuleNode := Node.FirstChild;
     160  while Assigned(RuleNode) do begin
     161    if RuleNode.NodeName = 'Rule' then begin
     162      Rule := TRule.Create;
     163      Rule.LoadFromXmlNode(RuleNode);
     164      Add(Rule);
     165    end;
     166    RuleNode := RuleNode.NextSibling;
     167  end;
     168end;
    42169
    43170procedure TRules.LoadFromXmlFile(FileName: string);
     
    46173  RootNode: TDOMNode;
    47174  RulesNode: TDOMNode;
    48   RuleNode: TDOMNode;
    49   Rule: TRule;
    50 begin
     175begin
     176  Self.FileName := FileName;
    51177  Clear;
    52178  try
     
    57183      RulesNode := RootNode.FindNode('Rules');
    58184      if Assigned(RulesNode) then begin
    59         RuleNode := RulesNode.FirstChild;
    60         while Assigned(RuleNode) do begin
    61           if RuleNode.NodeName = 'Rule' then begin
    62             Rule := TRule.Create;
    63             Rule.LoadFromXmlNode(RuleNode);
    64             Add(Rule);
    65           end;
    66           RuleNode := RuleNode.NextSibling;
    67         end;
     185        LoadFromXmlNode(RulesNode);
    68186      end;
    69187    end;
     
    78196  RootNode: TDOMNode;
    79197  RulesNode: TDOMNode;
    80   RuleNode: TDOMNode;
    81   Rule: TRule;
    82 begin
     198begin
     199  Self.FileName := FileName;
    83200  Doc := TXMLDocument.Create;
    84201  try
     
    88205    RulesNode := Doc.CreateElement('Rules');
    89206    RootNode.AppendChild(RulesNode);
    90 
    91     for Rule in Self do begin
    92       RuleNode := Doc.CreateElement('Rule');
    93       Rule.SaveToXmlNode(RuleNode);
    94       RulesNode.AppendChild(RuleNode);
    95     end;
     207    SaveToXmlNode(RulesNode);
    96208
    97209    WriteXMLFile(Doc, FileName);
     
    101213end;
    102214
     215function TRules.GetBNF: string;
     216var
     217  Rule: TRule;
     218begin
     219  Result := '';
     220  for Rule in Self do begin
     221    Result := Result + Rule.GetBNF + LineEnding;
     222  end;
     223end;
     224
    103225end.
    104226
  • branches/generator/generator.lpi

    r109 r110  
    3333      </Item1>
    3434    </RequiredPackages>
    35     <Units Count="7">
     35    <Units Count="8">
    3636      <Unit0>
    3737        <Filename Value="generator.lpr"/>
     
    3939      </Unit0>
    4040      <Unit1>
    41         <Filename Value="UFormMain.pas"/>
     41        <Filename Value="UCore.pas"/>
     42        <IsPartOfProject Value="True"/>
     43        <ComponentName Value="Core"/>
     44        <HasResources Value="True"/>
     45        <ResourceBaseClass Value="DataModule"/>
     46      </Unit1>
     47      <Unit2>
     48        <Filename Value="URules.pas"/>
     49        <IsPartOfProject Value="True"/>
     50      </Unit2>
     51      <Unit3>
     52        <Filename Value="Forms/UFormRule.pas"/>
     53        <IsPartOfProject Value="True"/>
     54        <ComponentName Value="FormRule"/>
     55        <HasResources Value="True"/>
     56        <ResourceBaseClass Value="Form"/>
     57      </Unit3>
     58      <Unit4>
     59        <Filename Value="UXMLUtils.pas"/>
     60        <IsPartOfProject Value="True"/>
     61      </Unit4>
     62      <Unit5>
     63        <Filename Value="Forms/UFormMain.pas"/>
    4264        <IsPartOfProject Value="True"/>
    4365        <ComponentName Value="FormMain"/>
    4466        <HasResources Value="True"/>
    4567        <ResourceBaseClass Value="Form"/>
    46       </Unit1>
    47       <Unit2>
    48         <Filename Value="UFormRules.pas"/>
     68      </Unit5>
     69      <Unit6>
     70        <Filename Value="Forms/UFormRules.pas"/>
    4971        <IsPartOfProject Value="True"/>
    5072        <ComponentName Value="FormRules"/>
     73        <HasResources Value="True"/>
    5174        <ResourceBaseClass Value="Form"/>
    52       </Unit2>
    53       <Unit3>
    54         <Filename Value="UCore.pas"/>
     75      </Unit6>
     76      <Unit7>
     77        <Filename Value="Forms/UFormRuleItem.pas"/>
    5578        <IsPartOfProject Value="True"/>
    56         <ComponentName Value="Core"/>
    57         <ResourceBaseClass Value="DataModule"/>
    58       </Unit3>
    59       <Unit4>
    60         <Filename Value="URules.pas"/>
    61         <IsPartOfProject Value="True"/>
    62       </Unit4>
    63       <Unit5>
    64         <Filename Value="Forms/UFormRule.pas"/>
    65         <IsPartOfProject Value="True"/>
    66         <ComponentName Value="FormRule"/>
     79        <ComponentName Value="FormRuleItem"/>
    6780        <ResourceBaseClass Value="Form"/>
    68       </Unit5>
    69       <Unit6>
    70         <Filename Value="UXMLUtils.pas"/>
    71         <IsPartOfProject Value="True"/>
    72       </Unit6>
     81      </Unit7>
    7382    </Units>
    7483  </ProjectOptions>
  • branches/generator/generator.lpr

    r109 r110  
    88  {$ENDIF}{$ENDIF}
    99  Interfaces, // this includes the LCL widgetset
    10   Forms, UFormMain, UFormRules, UCore, URules, UFormRule
     10  Forms, UCore, URules, UFormRule, UFormMain, UFormRules, UFormRuleItem
    1111  { you can add units after this };
    1212
     
    1414
    1515begin
    16   RequireDerivedFormResource:=True;
     16  RequireDerivedFormResource := True;
    1717  Application.Initialize;
     18  Application.CreateForm(TCore, Core);
    1819  Application.CreateForm(TFormMain, FormMain);
     20  Application.CreateForm(TFormRule, FormRule);
    1921  Application.CreateForm(TFormRules, FormRules);
    20   Application.CreateForm(TCore, Core);
    21   Application.CreateForm(TFormRule, FormRule);
     22  Application.CreateForm(TFormRuleItem, FormRuleItem);
    2223  Application.Run;
    2324end.
  • branches/generator/pascal.grm

    r109 r110  
    44    <Rule>
    55      <Name>BeginEnd</Name>
     6      <RuleItems>
     7        <RuleItem>
     8          <Name>begin</Name>
     9        </RuleItem>
     10        <RuleItem>
     11          <Name>command</Name>
     12        </RuleItem>
     13        <RuleItem>
     14          <Name>end</Name>
     15        </RuleItem>
     16      </RuleItems>
    617    </Rule>
    718    <Rule>
    819      <Name>IfThenElse</Name>
     20      <RuleItems/>
    921    </Rule>
    1022    <Rule>
    1123      <Name>WhileDo</Name>
     24      <RuleItems/>
    1225    </Rule>
    1326    <Rule>
    1427      <Name>RepeatUntil</Name>
     28      <RuleItems/>
    1529    </Rule>
    1630    <Rule>
    1731      <Name>ForToDo</Name>
     32      <RuleItems/>
    1833    </Rule>
    1934    <Rule>
    2035      <Name>WithDo</Name>
     36      <RuleItems/>
    2137    </Rule>
    2238    <Rule>
    2339      <Name>CaseOf</Name>
     40      <RuleItems/>
    2441    </Rule>
    2542    <Rule>
    2643      <Name>Assignment</Name>
     44      <RuleItems/>
     45    </Rule>
     46    <Rule>
     47      <Name>Command</Name>
     48      <RuleItems/>
    2749    </Rule>
    2850  </Rules>
Note: See TracChangeset for help on using the changeset viewer.