Changeset 33


Ignore:
Timestamp:
Apr 25, 2011, 10:41:52 PM (13 years ago)
Author:
george
Message:
  • Added: Pl0 pascal grammer definition.
  • Added: Generation of source code for structure.
Location:
tools/Grammer
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • tools/Grammer/Grammer.lpi

    r31 r33  
    3939      </Item2>
    4040    </RequiredPackages>
    41     <Units Count="4">
     41    <Units Count="5">
    4242      <Unit0>
    4343        <Filename Value="Grammer.lpr"/>
    4444        <IsPartOfProject Value="True"/>
    4545        <UnitName Value="Grammer"/>
    46         <EditorIndex Value="3"/>
     46        <EditorIndex Value="4"/>
    4747        <WindowIndex Value="0"/>
    4848        <TopLine Value="1"/>
     
    5050        <UsageCount Value="20"/>
    5151        <Loaded Value="True"/>
     52        <DefaultSyntaxHighlighter Value="Delphi"/>
    5253      </Unit0>
    5354      <Unit1>
     
    6061        <EditorIndex Value="0"/>
    6162        <WindowIndex Value="0"/>
    62         <TopLine Value="72"/>
    63         <CursorPos X="11" Y="91"/>
     63        <TopLine Value="93"/>
     64        <CursorPos X="20" Y="98"/>
    6465        <UsageCount Value="20"/>
    6566        <Loaded Value="True"/>
    6667        <LoadedDesigner Value="True"/>
     68        <DefaultSyntaxHighlighter Value="Delphi"/>
    6769      </Unit1>
    6870      <Unit2>
    6971        <Filename Value="Test.grammer"/>
    7072        <IsPartOfProject Value="True"/>
    71         <EditorIndex Value="1"/>
     73        <EditorIndex Value="2"/>
    7274        <WindowIndex Value="0"/>
    7375        <TopLine Value="1"/>
     
    8183        <IsPartOfProject Value="True"/>
    8284        <UnitName Value="UGrammer"/>
    83         <EditorIndex Value="2"/>
    84         <WindowIndex Value="0"/>
    85         <TopLine Value="25"/>
    86         <CursorPos X="14" Y="42"/>
    87         <UsageCount Value="20"/>
    88         <Loaded Value="True"/>
     85        <EditorIndex Value="3"/>
     86        <WindowIndex Value="0"/>
     87        <TopLine Value="1"/>
     88        <CursorPos X="44" Y="12"/>
     89        <UsageCount Value="20"/>
     90        <Loaded Value="True"/>
     91        <DefaultSyntaxHighlighter Value="Delphi"/>
    8992      </Unit3>
     93      <Unit4>
     94        <Filename Value="Pl0Grammer.pas"/>
     95        <IsPartOfProject Value="True"/>
     96        <UnitName Value="Pl0Grammer"/>
     97        <EditorIndex Value="1"/>
     98        <WindowIndex Value="0"/>
     99        <TopLine Value="11"/>
     100        <CursorPos X="24" Y="21"/>
     101        <UsageCount Value="20"/>
     102        <Loaded Value="True"/>
     103        <DefaultSyntaxHighlighter Value="Delphi"/>
     104      </Unit4>
    90105    </Units>
    91106    <JumpHistory Count="30" HistoryIndex="29">
    92107      <Position1>
    93108        <Filename Value="UMainForm.pas"/>
    94         <Caret Line="116" Column="17" TopLine="99"/>
     109        <Caret Line="102" Column="1" TopLine="84"/>
    95110      </Position1>
    96111      <Position2>
    97112        <Filename Value="UMainForm.pas"/>
    98         <Caret Line="114" Column="15" TopLine="99"/>
     113        <Caret Line="103" Column="1" TopLine="84"/>
    99114      </Position2>
    100115      <Position3>
    101         <Filename Value="UGrammer.pas"/>
    102         <Caret Line="116" Column="22" TopLine="100"/>
     116        <Filename Value="UMainForm.pas"/>
     117        <Caret Line="112" Column="1" TopLine="84"/>
    103118      </Position3>
    104119      <Position4>
    105         <Filename Value="UGrammer.pas"/>
    106         <Caret Line="3" Column="14" TopLine="1"/>
     120        <Filename Value="UMainForm.pas"/>
     121        <Caret Line="101" Column="1" TopLine="84"/>
    107122      </Position4>
    108123      <Position5>
    109         <Filename Value="UGrammer.pas"/>
    110         <Caret Line="57" Column="1" TopLine="40"/>
     124        <Filename Value="UMainForm.pas"/>
     125        <Caret Line="102" Column="1" TopLine="84"/>
    111126      </Position5>
    112127      <Position6>
    113128        <Filename Value="UMainForm.pas"/>
    114         <Caret Line="116" Column="17" TopLine="99"/>
     129        <Caret Line="103" Column="1" TopLine="84"/>
    115130      </Position6>
    116131      <Position7>
    117132        <Filename Value="UMainForm.pas"/>
    118         <Caret Line="124" Column="14" TopLine="109"/>
     133        <Caret Line="101" Column="1" TopLine="84"/>
    119134      </Position7>
    120135      <Position8>
    121         <Filename Value="UGrammer.pas"/>
    122         <Caret Line="132" Column="19" TopLine="101"/>
     136        <Filename Value="UMainForm.pas"/>
     137        <Caret Line="102" Column="1" TopLine="84"/>
    123138      </Position8>
    124139      <Position9>
    125         <Filename Value="UGrammer.pas"/>
    126         <Caret Line="127" Column="33" TopLine="104"/>
     140        <Filename Value="UMainForm.pas"/>
     141        <Caret Line="103" Column="1" TopLine="84"/>
    127142      </Position9>
    128143      <Position10>
    129         <Filename Value="UGrammer.pas"/>
    130         <Caret Line="26" Column="34" TopLine="3"/>
     144        <Filename Value="UMainForm.pas"/>
     145        <Caret Line="101" Column="1" TopLine="84"/>
    131146      </Position10>
    132147      <Position11>
    133         <Filename Value="UGrammer.pas"/>
    134         <Caret Line="71" Column="14" TopLine="64"/>
     148        <Filename Value="UMainForm.pas"/>
     149        <Caret Line="102" Column="1" TopLine="84"/>
    135150      </Position11>
    136151      <Position12>
    137         <Filename Value="UGrammer.pas"/>
    138         <Caret Line="114" Column="15" TopLine="93"/>
     152        <Filename Value="UMainForm.pas"/>
     153        <Caret Line="103" Column="1" TopLine="84"/>
    139154      </Position12>
    140155      <Position13>
    141         <Filename Value="UGrammer.pas"/>
    142         <Caret Line="1" Column="1" TopLine="1"/>
     156        <Filename Value="UMainForm.pas"/>
     157        <Caret Line="101" Column="1" TopLine="84"/>
    143158      </Position13>
    144159      <Position14>
    145         <Filename Value="UGrammer.pas"/>
    146         <Caret Line="136" Column="14" TopLine="116"/>
     160        <Filename Value="UMainForm.pas"/>
     161        <Caret Line="106" Column="11" TopLine="84"/>
    147162      </Position14>
    148163      <Position15>
    149164        <Filename Value="UMainForm.pas"/>
    150         <Caret Line="117" Column="10" TopLine="109"/>
     165        <Caret Line="105" Column="96" TopLine="91"/>
    151166      </Position15>
    152167      <Position16>
    153168        <Filename Value="UMainForm.pas"/>
    154         <Caret Line="118" Column="10" TopLine="109"/>
     169        <Caret Line="35" Column="48" TopLine="11"/>
    155170      </Position16>
    156171      <Position17>
    157172        <Filename Value="UMainForm.pas"/>
    158         <Caret Line="134" Column="16" TopLine="111"/>
     173        <Caret Line="126" Column="18" TopLine="124"/>
    159174      </Position17>
    160175      <Position18>
    161176        <Filename Value="UMainForm.pas"/>
    162         <Caret Line="135" Column="15" TopLine="111"/>
     177        <Caret Line="108" Column="26" TopLine="91"/>
    163178      </Position18>
    164179      <Position19>
    165180        <Filename Value="UMainForm.pas"/>
    166         <Caret Line="134" Column="19" TopLine="111"/>
     181        <Caret Line="95" Column="21" TopLine="80"/>
    167182      </Position19>
    168183      <Position20>
    169         <Filename Value="UGrammer.pas"/>
    170         <Caret Line="42" Column="1" TopLine="25"/>
     184        <Filename Value="UMainForm.pas"/>
     185        <Caret Line="85" Column="29" TopLine="71"/>
    171186      </Position20>
    172187      <Position21>
    173         <Filename Value="UGrammer.pas"/>
    174         <Caret Line="146" Column="38" TopLine="125"/>
     188        <Filename Value="UMainForm.pas"/>
     189        <Caret Line="34" Column="47" TopLine="17"/>
    175190      </Position21>
    176191      <Position22>
    177         <Filename Value="UGrammer.pas"/>
    178         <Caret Line="42" Column="91" TopLine="42"/>
     192        <Filename Value="UMainForm.pas"/>
     193        <Caret Line="114" Column="57" TopLine="91"/>
    179194      </Position22>
    180195      <Position23>
    181         <Filename Value="UGrammer.pas"/>
    182         <Caret Line="148" Column="1" TopLine="125"/>
     196        <Filename Value="UMainForm.pas"/>
     197        <Caret Line="109" Column="73" TopLine="95"/>
    183198      </Position23>
    184199      <Position24>
    185         <Filename Value="UGrammer.pas"/>
    186         <Caret Line="146" Column="43" TopLine="125"/>
     200        <Filename Value="UMainForm.pas"/>
     201        <Caret Line="107" Column="63" TopLine="91"/>
    187202      </Position24>
    188203      <Position25>
    189         <Filename Value="UGrammer.pas"/>
    190         <Caret Line="42" Column="91" TopLine="42"/>
     204        <Filename Value="UMainForm.pas"/>
     205        <Caret Line="128" Column="62" TopLine="111"/>
    191206      </Position25>
    192207      <Position26>
    193208        <Filename Value="UMainForm.pas"/>
    194         <Caret Line="109" Column="36" TopLine="81"/>
     209        <Caret Line="133" Column="1" TopLine="106"/>
    195210      </Position26>
    196211      <Position27>
    197212        <Filename Value="UMainForm.pas"/>
    198         <Caret Line="172" Column="46" TopLine="167"/>
     213        <Caret Line="135" Column="15" TopLine="106"/>
    199214      </Position27>
    200215      <Position28>
    201216        <Filename Value="UMainForm.pas"/>
    202         <Caret Line="186" Column="13" TopLine="164"/>
     217        <Caret Line="97" Column="24" TopLine="82"/>
    203218      </Position28>
    204219      <Position29>
    205220        <Filename Value="UMainForm.pas"/>
    206         <Caret Line="89" Column="48" TopLine="73"/>
     221        <Caret Line="95" Column="5" TopLine="86"/>
    207222      </Position29>
    208223      <Position30>
    209224        <Filename Value="UMainForm.pas"/>
    210         <Caret Line="90" Column="43" TopLine="73"/>
     225        <Caret Line="110" Column="51" TopLine="88"/>
    211226      </Position30>
    212227    </JumpHistory>
     
    221236      <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
    222237    </SearchPaths>
     238    <Parsing>
     239      <SyntaxOptions>
     240        <SyntaxMode Value="Delphi"/>
     241      </SyntaxOptions>
     242    </Parsing>
    223243    <Linking>
    224244      <Options>
     
    229249    </Linking>
    230250    <Other>
     251      <CompilerMessages>
     252        <UseMsgFile Value="True"/>
     253      </CompilerMessages>
    231254      <CompilerPath Value="$(CompPath)"/>
    232255    </Other>
  • tools/Grammer/Grammer.lpr

    r31 r33  
    88  {$ENDIF}{$ENDIF}
    99  Interfaces, // this includes the LCL widgetset
    10   Forms, UMainForm, UGrammer
     10  Forms, UMainForm, UGrammer, Pl0Grammer
    1111  { you can add units after this };
    1212
  • tools/Grammer/UMainForm.lfm

    r31 r33  
    11object Form1: TForm1
    2   Left = 356
    3   Height = 421
    4   Top = 127
    5   Width = 471
     2  Left = 209
     3  Height = 552
     4  Top = 43
     5  Width = 673
    66  Caption = 'Grammer transformator'
    7   ClientHeight = 421
    8   ClientWidth = 471
     7  ClientHeight = 552
     8  ClientWidth = 673
    99  OnCreate = FormCreate
    1010  OnDestroy = FormDestroy
     
    1414    Height = 21
    1515    Top = 25
    16     Width = 375
     16    Width = 577
    1717    Anchors = [akTop, akLeft, akRight]
    1818    TabOrder = 0
     
    2828  end
    2929  object Button1: TButton
    30     Left = 391
     30    Left = 593
    3131    Height = 25
    3232    Top = 25
     
    4949    Height = 21
    5050    Top = 72
    51     Width = 374
     51    Width = 576
    5252    Anchors = [akTop, akLeft, akRight]
    5353    TabOrder = 2
     
    5555  end
    5656  object Button2: TButton
    57     Left = 391
     57    Left = 593
    5858    Height = 25
    5959    Top = 72
     
    6464    TabOrder = 3
    6565  end
    66   object Button3: TButton
     66  object ButtonGenerate: TButton
    6767    Left = 11
    6868    Height = 25
     
    7070    Width = 75
    7171    Caption = 'Generate'
    72     OnClick = Button3Click
     72    OnClick = ButtonGenerateClick
    7373    TabOrder = 4
    7474  end
    7575  object Memo1: TMemo
    7676    Left = 8
    77     Height = 276
     77    Height = 407
    7878    Top = 140
    79     Width = 458
     79    Width = 660
    8080    Anchors = [akTop, akLeft, akRight, akBottom]
     81    Font.Name = 'freemono'
     82    ParentFont = False
    8183    ScrollBars = ssAutoBoth
    8284    TabOrder = 5
  • tools/Grammer/UMainForm.pas

    r31 r33  
    11unit UMainForm;
    22
    3 {$mode objfpc}{$H+}
     3{$mode Delphi}{$H+}
    44
    55interface
     
    1616    Button1: TButton;
    1717    Button2: TButton;
    18     Button3: TButton;
     18    ButtonGenerate: TButton;
    1919    ButtonDump: TButton;
    2020    Edit1: TEdit;
     
    2525    procedure Button1Click(Sender: TObject);
    2626    procedure Button2Click(Sender: TObject);
    27     procedure Button3Click(Sender: TObject);
     27    procedure ButtonGenerateClick(Sender: TObject);
    2828    procedure ButtonDumpClick(Sender: TObject);
    2929    procedure FormCreate(Sender: TObject);
    3030    procedure FormDestroy(Sender: TObject);
    3131  private
     32    LastIndex: Integer;
    3233    function DumpGroup(Group: TGrammerRule): string;
     34    function GenerateGroup(Group: TGrammerRule; Lines: TStrings): string;
     35    function GetFreeName(Name: string): string;
    3336    { private declarations }
    3437  public
    3538    Grammer: TGrammer;
    36     procedure InitPascal;
    37   end;
     39  end;
    3840
    3941var
     
    4345
    4446{$R *.lfm}
     47
     48uses
     49  Pl0Grammer;
    4550
    4651{ TForm1 }
     
    6873end;
    6974
    70 procedure TForm1.Button3Click(Sender: TObject);
    71 begin
    72 
     75procedure TForm1.ButtonGenerateClick(Sender: TObject);
     76  var
     77  I: Integer;
     78  Row: string;
     79begin
     80  Memo1.Clear;
     81  with Grammer do
     82  for I := 0 to Rules.Count - 1 do
     83  with TGrammerRule(Rules[I]) do begin
     84    Row := 'T' + Name + ' = class' + LineEnding;
     85    Row := Row + GenerateGroup(TGrammerRule(Rules[I]), Memo1.Lines);
     86    Row := Row + 'end;' + LineEnding;
     87    Memo1.Lines.Add(Row);
     88  end;
     89end;
     90
     91function TForm1.GenerateGroup(Group: TGrammerRule; Lines: TStrings): string;
     92var
     93  J: Integer;
     94  Item: string;
     95  UniqueName: string;
     96  SwitchItems: string;
     97  GroupContent: string;
     98  TypeName: string;
     99begin
     100  Result := '';
     101  SwitchItems := '';
     102  with Group do begin
     103    for J := 0 to Items.Count - 1 do
     104    with TGrammerRuleItem(Items[J]) do begin
     105      Item := '';
     106      if ItemType = itText then begin
     107          Item := ''
     108        end else
     109        if ItemType = itReference then begin
     110          UniqueName := GetFreeName(Text);
     111          if Text = 'Name' then TypeName := 'string'
     112          else if Text = 'Number' then TypeName := 'Integer'
     113          else TypeName := 'T' + Text;
     114          Item := '  ' + UniqueName + ': ' + TypeName + ';' + LineEnding;
     115          SwitchItems := SwitchItems + 'si' + UniqueName;
     116          if J < (Items.Count - 1) then SwitchItems := SwitchItems + ', ';
     117        end else
     118        if ItemType = itGroup then begin
     119          GroupContent := GenerateGroup(Group, Lines);
     120          if GroupContent <> '' then begin
     121            UniqueName := GetFreeName('Group');
     122            Item := '  ' + UniqueName + ': ';
     123            Lines.Add('T' + UniqueName + ' = class' + LineEnding +
     124              GroupContent + 'end' + LineEnding);
     125            if Repetition then begin
     126              Item := Item + 'TObjectList; // TList<T' + UniqueName + '>' + LineEnding
     127            end else Item := Item + 'T' + UniqueName + ';' + LineEnding;
     128
     129            SwitchItems := SwitchItems + 'si' + UniqueName;
     130            if J < (Items.Count - 1) then SwitchItems := SwitchItems + ', ';
     131          end;
     132        end else Item := '';
     133
     134        //else if Optional then Item := '[ ' + Item + ' ]';
     135      Result := Result + Item;
     136    end;
     137    if (RuleType = rtAlternative) then begin
     138      if SwitchItems <> '' then begin
     139        Lines.Add('T' + Name + 'Switch = (' + SwitchItems + ');');
     140        Result := Result + '  Switch: T' + Name + 'Switch;' + LineEnding;
     141      end;
     142    end;
     143  end;
     144end;
     145
     146function TForm1.GetFreeName(Name: string): string;
     147begin
     148  Inc(LastIndex);
     149  Result := Name + IntToStr(LastIndex);
    73150end;
    74151
     
    96173    Result := Result + Item + ' ';
    97174  end;
    98 
    99175end;
    100176
     
    104180  Row: string;
    105181begin
     182  Memo1.Clear;
    106183  with Grammer do
    107184  for I := 0 to Rules.Count - 1 do
     
    116193procedure TForm1.FormCreate(Sender: TObject);
    117194begin
    118   Grammer := TGrammer.Create;
    119   InitPascal;
     195  Grammer := TPl0Grammer.Create;
    120196end;
    121197
     
    125201end;
    126202
    127 procedure TForm1.InitPascal;
    128 begin
    129   with Grammer do begin
    130     Rules.Clear;
    131     with AddRule('program', rtSequence) do begin
    132       AddItem('block', itReference, False, False);
    133       AddItem('.', itText, False, False);
    134     end;
    135     with AddRule('block', rtSequence) do begin
    136       AddItem('declaration', itReference, True, False);
    137       AddItem('statement', itReference, False, False);
    138     end;
    139     with AddRule('declaration', rtAlternative) do begin
    140       AddItem('constant', itReference, False, False);
    141       AddItem('variable', itReference, False, False);
    142       AddItem('function', itReference, False, False);
    143     end;
    144     with AddRule('constant', rtSequence) do begin
    145       AddItem('const', itText, False, False);
    146       AddItem('constant_definition', itReference, False, False);
    147       with AddGroup(rtSequence, False, True), Items do begin
    148         AddItem(',', itText, False, False);
    149         AddItem('constant_definition', itReference, False, False);
    150       end;
    151       AddItem(';', itText, False, False);
    152     end;
    153     with AddRule('constant_definition', rtSequence) do begin
    154       AddItem('name', itReference, False, False);
    155       AddItem('=', itText, False, False);
    156       AddItem('number', itReference, False, False);
    157     end;
    158     with AddRule('variable', rtSequence) do begin
    159       AddItem('var', itText, False, False);
    160       AddItem('name', itReference, False, False);
    161       with AddGroup(rtSequence, False, True), Items do begin
    162         AddItem(',', itText, False, False);
    163         AddItem('name', itReference, False, False);
    164       end;
    165       AddItem(';', itText, False, False);
    166     end;
    167     with AddRule('function', rtSequence) do begin
    168       AddItem('function', itText, False, False);
    169       AddItem('name', itReference, False, False);
    170       AddItem('(', itText, False, False);
    171       with AddGroup(rtSequence, True, False), Items do begin
    172         AddItem('name', itReference, False, False);
    173         with AddGroup(rtSequence, False, True), Items do begin
    174           AddItem(',', itText, False, False);
    175           AddItem('name', itReference, False, False);
    176         end;
    177       end;
    178       AddItem(')', itText, False, False);
    179       AddItem('block', itReference, False, False);
    180       AddItem(';', itText, False, False);
    181     end;
    182     with AddRule('expression', rtSequence) do begin
    183       with AddGroup(rtAlternative, True, False), Items do begin
    184         AddItem('-', itText, False, False);
    185         AddItem('+', itText, False, False);
    186       end;
    187       AddItem('term', itReference, False, False);
    188       with AddGroup(rtSequence, False, True), Items do begin
    189         with AddGroup(rtAlternative, False, False), Items do begin
    190           AddItem('-', itText, False, False);
    191           AddItem('+', itText, False, False);
    192         end;
    193         AddItem('term', itReference, False, False);
    194       end;
    195     end;
    196     with AddRule('term', rtSequence) do begin
    197       AddItem('factor', itReference, False, False);
    198       with AddGroup(rtSequence, False, True), Items do begin
    199         with AddGroup(rtAlternative, False, False), Items do begin
    200           AddItem('*', itText, False, False);
    201           AddItem('/', itText, False, False);
    202         end;
    203         AddItem('factor', itReference, False, False);
    204       end;
    205     end;
    206     with AddRule('factor', rtAlternative) do begin
    207       with AddGroup(rtSequence, False, False), Items do begin
    208         AddItem('name', itReference, False, False);
    209         AddItem('(', itText, False, False);
    210         with AddGroup(rtSequence, True, False), Items do begin
    211           AddItem('expression', itReference, False, False);
    212           with AddGroup(rtSequence, False, True), Items do begin
    213             AddItem(',', itText, False, False);
    214             AddItem('expression', itReference, False, False);
    215           end;
    216         end;
    217         AddItem('(', itText, False, False);
    218       end;
    219       AddItem('number', itReference, False, False);
    220       AddItem('name', itReference, False, False);
    221       with AddGroup(rtSequence, False, False), Items do begin
    222         AddItem('(', itText, False, False);
    223         AddItem('expression', itReference, False, False);
    224         AddItem(')', itText, False, False);
    225       end;
    226     end;
    227     with AddRule('statement', rtSequence) do begin
    228       with AddGroup(rtAlternative, True, False), Items do begin
    229         with AddGroup(rtSequence, False, False), Items do begin
    230           AddItem('name', itReference, False, False);
    231           AddItem(':=', itText, False, False);
    232           AddItem('expression', itReference, False, False);
    233         end;
    234         with AddGroup(rtSequence, False, False), Items do begin
    235           AddItem('begin', itText, False, False);
    236           AddItem('statement', itReference, False, False);
    237           with AddGroup(rtSequence, False, True), Items do begin
    238             AddItem(',', itText, False, False);
    239             AddItem('statement', itReference, False, False);
    240           end;
    241           AddItem('end', itText, False, False);
    242         end;
    243         with AddGroup(rtSequence, False, False), Items do begin
    244           AddItem('if', itText, False, False);
    245           AddItem('condition', itReference, False, False);
    246           AddItem('then', itText, False, False);
    247           AddItem('statement', itReference, False, False);
    248         end;
    249         with AddGroup(rtSequence, False, False), Items do begin
    250           AddItem('whilef', itText, False, False);
    251           AddItem('condition', itReference, False, False);
    252           AddItem('do', itText, False, False);
    253           AddItem('statement', itReference, False, False);
    254         end;
    255         with AddGroup(rtSequence, False, False), Items do begin
    256           AddItem('return', itText, False, False);
    257           AddItem('expression', itReference, False, False);
    258         end;
    259         with AddGroup(rtSequence, False, False), Items do begin
    260           AddItem('write', itText, False, False);
    261           AddItem('expression', itReference, False, False);
    262         end;
    263       end;
    264     end;
    265     with AddRule('condition', rtAlternative) do begin
    266       with AddGroup(rtSequence, False, False), Items do begin
    267         AddItem('odd', itText, False, False);
    268         AddItem('expression', itReference, False, False);
    269       end;
    270       with AddGroup(rtSequence, False, False), Items do begin
    271         AddItem('expression', itReference, False, False);
    272         with AddGroup(rtAlternative, False, False), Items do begin
    273           AddItem('=', itText, False, False);
    274           AddItem('<>', itText, False, False);
    275           AddItem('<', itText, False, False);
    276           AddItem('<=', itText, False, False);
    277           AddItem('>', itText, False, False);
    278           AddItem('=>', itText, False, False);
    279         end;
    280         AddItem('expression', itReference, False, False);
    281       end;
    282     end;
    283 
    284     (*
    285           condition = ODD expression
    286              | expression ( '=' | '<>' | '<' | '<=' | '>' | '>=' ) expression .
    287              *)
    288   end;
    289 end;
    290 
    291203end.
    292204
Note: See TracChangeset for help on using the changeset viewer.