Changeset 124


Ignore:
Timestamp:
Nov 29, 2017, 5:09:16 PM (7 years ago)
Author:
chronos
Message:
  • Added: Top start rule can be selected for grammer. This rule is used for parser as initial rule.
Location:
branches/generator
Files:
2 added
7 edited

Legend:

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

    r119 r124  
    8080        Action = ASaveAs
    8181      end
     82      object MenuItem12: TMenuItem
     83        Action = AGrammerSettings
     84      end
    8285      object MenuItem6: TMenuItem
    8386        Caption = '-'
     
    143146      OnExecute = ANewExecute
    144147    end
     148    object AGrammerSettings: TAction
     149      Caption = 'Settings'
     150      OnExecute = AGrammerSettingsExecute
     151    end
    145152  end
    146153  object OpenDialog1: TOpenDialog
  • branches/generator/Forms/UFormMain.pas

    r123 r124  
    1515  TFormMain = class(TForm)
    1616    ABuildCompiler: TAction;
     17    AGrammerSettings: TAction;
    1718    ANew: TAction;
    1819    ASave: TAction;
     
    2829    MenuItem10: TMenuItem;
    2930    MenuItem11: TMenuItem;
     31    MenuItem12: TMenuItem;
    3032    MenuItem2: TMenuItem;
    3133    MenuItem3: TMenuItem;
     
    4345    procedure ABuildCompilerExecute(Sender: TObject);
    4446    procedure AExitExecute(Sender: TObject);
     47    procedure AGrammerSettingsExecute(Sender: TObject);
    4548    procedure ANewExecute(Sender: TObject);
    4649    procedure AOpenExecute(Sender: TObject);
     
    6669
    6770uses
    68   UFormRules, UCore;
     71  UFormRules, UCore, UFormGrammer;
    6972
    7073{ TFormMain }
     
    123126end;
    124127
     128procedure TFormMain.AGrammerSettingsExecute(Sender: TObject);
     129var
     130  FormGrammer: TFormGrammer;
     131begin
     132  FormGrammer := TFormGrammer.Create(nil);
     133  FormGrammer.LoadData(Core.Grammer);
     134  if FormGrammer.ShowModal = mrOk then begin
     135    FormGrammer.SaveData(Core.Grammer);
     136  end;
     137  FreeAndNil(FormGrammer);
     138end;
     139
    125140procedure TFormMain.ANewExecute(Sender: TObject);
    126141begin
  • branches/generator/Forms/UFormRuleItem.pas

    r123 r124  
    100100    ritNonTerminal: ListBox1.SetFocus;
    101101    ritSubItems: TFormRuleItems(FormRuleItems).ListView1.SetFocus;
     102    ritTerminalRange: EditTerminalFrom.SetFocus;
    102103  end;
    103104end;
  • branches/generator/URules.pas

    r123 r124  
    116116    FileName: string;
    117117    Rules: TRules;
     118    TopRule: TRule;
    118119    procedure LoadFromXmlFile(FileName: string);
    119120    procedure SaveToXmlFile(FileName: string);
     
    149150    Add('  Source;');
    150151    Add('');
    151     Add('procedure Compile;');
     152    Add('procedure Compile(FileName: string);');
     153    Add('var');
     154    Add('  SourceFile: Text;');
    152155    Add('begin');
     156    Add('  AssignFile(SourceFile, FileName);');
     157    Add('  Reset(SourceFile);');
     158    Add('  SetLength(Content, FileSize(SourceFile));');
     159    Add('  Read(SourceFile, Content);');
     160    if Assigned(TopRule) then
     161      Add('  Parse' + TopRule.Name + ';');
     162    Add('  CloseFile(SourceFile);');
    153163    Add('end;');
    154164    Add('');
    155165    Add('begin');
    156     Add('  Compile;');
     166    Add('  if ParamCount > 1 then');
     167    Add('    Compile(ParamStr(1));');
    157168    Add('end.');
    158169    SaveToFile(FileName);
     
    181192    Add('');
    182193    Add('type');
    183     for Rule in Rules do begin
     194    for Rule in Rules do
     195    if Rule.CreateSourceNode then begin
    184196      Add('  T' + Rule.Name + ' = class;');
    185197    end;
    186198    Add('');
    187     for Rule in Rules do begin
     199    for Rule in Rules do
     200    if Rule.CreateSourceNode then begin
    188201      Add('  T' + Rule.Name + ' = class');
    189202      for Item in Rule.Items do begin
     
    198211    Add('implementation');
    199212    Add('');
    200     for Rule in Rules do
    201     if Rule.CreateSourceNode then begin
     213    for Rule in Rules do begin
    202214      Add('function Parse' + Rule.Name + ': Boolean;');
    203215      Add('begin');
     
    212224          Line := Line + '';
    213225        end;
    214         if Item.RuleItemType = ritTerminal then
    215           Line := Line + 'Expect(''' + Item.Terminal + ''')'
    216         else if Item.RuleItemType = ritNonTerminal then
    217           Line := Line + 'Parse' + Item.NonTerminal.Name;
     226        case Item.RuleItemType of
     227          ritTerminal: Line := Line + 'Expect(''' + Item.Terminal + ''')';
     228          ritNonTerminal: Line := Line + 'Parse' + Item.NonTerminal.Name;
     229          ritTerminalRange: Line := Line + 'Expect(''' + Item.Terminal + ''')';
     230        end;
    218231        if Rule.Items.RuleType = rtOr then begin
    219232          Line := Line + ' then ';
     
    245258  RulesNode: TDOMNode;
    246259  Rule: TRule;
     260  TopRuleName: string;
    247261begin
    248262  Self.FileName := FileName;
     
    257271        Rules.LoadFromXmlNode(RulesNode);
    258272      end;
     273
     274      TopRule := Rules.FindName(ReadString(RootNode, 'TopRule', ''));
    259275    end;
    260276  finally
     
    282298    RootNode.AppendChild(RulesNode);
    283299    Rules.SaveToXmlNode(RulesNode);
     300
     301    if Assigned(TopRule) then
     302      WriteString(RootNode, 'TopRule', TopRule.Name);
    284303
    285304    WriteXMLFile(Doc, FileName);
  • branches/generator/generator.lpi

    r118 r124  
    8484      </Item3>
    8585    </RequiredPackages>
    86     <Units Count="8">
     86    <Units Count="9">
    8787      <Unit0>
    8888        <Filename Value="generator.lpr"/>
     
    135135        <ResourceBaseClass Value="Form"/>
    136136      </Unit7>
     137      <Unit8>
     138        <Filename Value="Forms/UFormGrammer.pas"/>
     139        <IsPartOfProject Value="True"/>
     140        <ComponentName Value="FormGrammer"/>
     141        <ResourceBaseClass Value="Form"/>
     142      </Unit8>
    137143    </Units>
    138144  </ProjectOptions>
  • branches/generator/generator.lpr

    r120 r124  
    99  Interfaces, // this includes the LCL widgetset
    1010  Forms, UCore, URules, Common, TemplateGenerics, UFormRule, UFormMain,
    11   UFormRules, UFormRuleItem, UFormRuleItems, SysUtils
     11  UFormRules, UFormRuleItem, UFormRuleItems, SysUtils, UFormGrammer
    1212  { you can add units after this };
    1313
  • branches/generator/pascal.grm

    r123 r124  
    358358          <AnyExcept>0</AnyExcept>
    359359          <NonTerminal>ForToDo</NonTerminal>
     360        </RuleItem>
     361        <RuleItem>
     362          <Type>1</Type>
     363          <Optional>0</Optional>
     364          <Repetitive>0</Repetitive>
     365          <AnyExcept>0</AnyExcept>
     366          <NonTerminal>ForInDo</NonTerminal>
    360367        </RuleItem>
    361368        <RuleItem>
     
    562569          <Repetitive>0</Repetitive>
    563570          <AnyExcept>0</AnyExcept>
    564           <NonTerminal>BeginEnd</NonTerminal>
     571          <NonTerminal>DeclarationBlock</NonTerminal>
    565572        </RuleItem>
    566573        <RuleItem>
     
    12701277    <Rule>
    12711278      <Name>Term</Name>
    1272       <CreateSourceNode>0</CreateSourceNode>
     1279      <CreateSourceNode>-1</CreateSourceNode>
    12731280      <RuleItems>
    12741281        <Type>0</Type>
     
    16621669          <Terminal>initialization</Terminal>
    16631670        </RuleItem>
     1671        <RuleItem>
     1672          <Type>1</Type>
     1673          <Optional>-1</Optional>
     1674          <Repetitive>-1</Repetitive>
     1675          <AnyExcept>0</AnyExcept>
     1676          <NonTerminal>Statement</NonTerminal>
     1677        </RuleItem>
    16641678      </RuleItems>
    16651679    </Rule>
     
    16761690          <Terminal>finalization</Terminal>
    16771691        </RuleItem>
     1692        <RuleItem>
     1693          <Type>1</Type>
     1694          <Optional>-1</Optional>
     1695          <Repetitive>-1</Repetitive>
     1696          <AnyExcept>0</AnyExcept>
     1697          <NonTerminal>Statement</NonTerminal>
     1698        </RuleItem>
    16781699      </RuleItems>
    16791700    </Rule>
     
    17621783      </RuleItems>
    17631784    </Rule>
     1785    <Rule>
     1786      <Name>Procedure</Name>
     1787      <CreateSourceNode>-1</CreateSourceNode>
     1788      <RuleItems>
     1789        <Type>0</Type>
     1790        <RuleItem>
     1791          <Type>0</Type>
     1792          <Optional>0</Optional>
     1793          <Repetitive>0</Repetitive>
     1794          <AnyExcept>0</AnyExcept>
     1795          <Terminal>procedure</Terminal>
     1796        </RuleItem>
     1797        <RuleItem>
     1798          <Type>1</Type>
     1799          <Optional>0</Optional>
     1800          <Repetitive>0</Repetitive>
     1801          <AnyExcept>0</AnyExcept>
     1802          <NonTerminal>FunctionName</NonTerminal>
     1803        </RuleItem>
     1804        <RuleItem>
     1805          <Type>1</Type>
     1806          <Optional>-1</Optional>
     1807          <Repetitive>0</Repetitive>
     1808          <AnyExcept>0</AnyExcept>
     1809          <NonTerminal>FunctionParameters</NonTerminal>
     1810        </RuleItem>
     1811        <RuleItem>
     1812          <Type>0</Type>
     1813          <Optional>0</Optional>
     1814          <Repetitive>0</Repetitive>
     1815          <AnyExcept>0</AnyExcept>
     1816          <Terminal>;</Terminal>
     1817        </RuleItem>
     1818        <RuleItem>
     1819          <Type>1</Type>
     1820          <Optional>0</Optional>
     1821          <Repetitive>0</Repetitive>
     1822          <AnyExcept>0</AnyExcept>
     1823          <NonTerminal>DeclarationBlock</NonTerminal>
     1824        </RuleItem>
     1825        <RuleItem>
     1826          <Type>0</Type>
     1827          <Optional>0</Optional>
     1828          <Repetitive>0</Repetitive>
     1829          <AnyExcept>0</AnyExcept>
     1830          <Terminal>;</Terminal>
     1831        </RuleItem>
     1832      </RuleItems>
     1833    </Rule>
    17641834  </Rules>
     1835  <TopRule>Program</TopRule>
    17651836</GrammerProject>
Note: See TracChangeset for help on using the changeset viewer.