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.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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);
Note: See TracChangeset for help on using the changeset viewer.