| 1 | unit UGrammer;
|
|---|
| 2 |
|
|---|
| 3 | {$mode Delphi}{$H+}
|
|---|
| 4 |
|
|---|
| 5 | interface
|
|---|
| 6 |
|
|---|
| 7 | uses
|
|---|
| 8 | Classes, SysUtils, Contnrs;
|
|---|
| 9 |
|
|---|
| 10 | type
|
|---|
| 11 | TRuleType = (rtSequence, rtAlternative);
|
|---|
| 12 | TItemType = (itReference, itText, itGroup);
|
|---|
| 13 |
|
|---|
| 14 | TGrammerRule = class;
|
|---|
| 15 |
|
|---|
| 16 | { TGrammerRuleItem }
|
|---|
| 17 |
|
|---|
| 18 | TGrammerRuleItem = class
|
|---|
| 19 | Rule: TGrammerRule;
|
|---|
| 20 | ItemType: TItemType;
|
|---|
| 21 | Text: string;
|
|---|
| 22 | Optional: Boolean;
|
|---|
| 23 | Repetition: Boolean;
|
|---|
| 24 | Group: TGrammerRule;
|
|---|
| 25 | constructor Create;
|
|---|
| 26 | destructor Destroy; override;
|
|---|
| 27 | end;
|
|---|
| 28 |
|
|---|
| 29 | { TGrammerRuleItems }
|
|---|
| 30 |
|
|---|
| 31 | TGrammerRuleItems = class(TObjectList)
|
|---|
| 32 | function AddNew: TGrammerRuleItem;
|
|---|
| 33 | end;
|
|---|
| 34 |
|
|---|
| 35 | { TGrammerRule }
|
|---|
| 36 |
|
|---|
| 37 | TGrammerRule = class
|
|---|
| 38 | Name: string;
|
|---|
| 39 | RuleType: TRuleType;
|
|---|
| 40 | Items: TGrammerRuleItems;
|
|---|
| 41 | function AddItem(AText: string; AItemType: TItemType; AOptional, ARepetition: Boolean): TGrammerRuleItem;
|
|---|
| 42 | function AddGroup(ARuleType: TRuleType; AOptional, ARepetition: Boolean): TGrammerRule;
|
|---|
| 43 | constructor Create;
|
|---|
| 44 | destructor Destroy; override;
|
|---|
| 45 | end;
|
|---|
| 46 |
|
|---|
| 47 | { TGrammerRules }
|
|---|
| 48 |
|
|---|
| 49 | TGrammerRules = class(TObjectList)
|
|---|
| 50 | function AddNew: TGrammerRule;
|
|---|
| 51 | function ItemByName(Name: string): TGrammerRule;
|
|---|
| 52 | end;
|
|---|
| 53 |
|
|---|
| 54 | TGrammer = class
|
|---|
| 55 | Rules: TGrammerRules;
|
|---|
| 56 | TopRule: TGrammerRule;
|
|---|
| 57 | constructor Create;
|
|---|
| 58 | destructor Destroy; override;
|
|---|
| 59 | function AddRule(AName: string; ARuleType: TRuleType): TGrammerRule;
|
|---|
| 60 | end;
|
|---|
| 61 |
|
|---|
| 62 | implementation
|
|---|
| 63 |
|
|---|
| 64 | constructor TGrammerRuleItem.Create;
|
|---|
| 65 | begin
|
|---|
| 66 | Group := TGrammerRule.Create;
|
|---|
| 67 | end;
|
|---|
| 68 |
|
|---|
| 69 | destructor TGrammerRuleItem.Destroy;
|
|---|
| 70 | begin
|
|---|
| 71 | Group.Free;
|
|---|
| 72 | inherited Destroy;
|
|---|
| 73 | end;
|
|---|
| 74 |
|
|---|
| 75 | { TGrammerRuleItems }
|
|---|
| 76 |
|
|---|
| 77 | function TGrammerRuleItems.AddNew: TGrammerRuleItem;
|
|---|
| 78 | begin
|
|---|
| 79 | Result := TGrammerRuleItem(Items[Add(TGrammerRuleItem.Create)]);
|
|---|
| 80 | end;
|
|---|
| 81 |
|
|---|
| 82 | { TGrammerRules }
|
|---|
| 83 |
|
|---|
| 84 | function TGrammerRules.AddNew: TGrammerRule;
|
|---|
| 85 | begin
|
|---|
| 86 | Result := TGrammerRule(Items[Add(TGrammerRule.Create)]);
|
|---|
| 87 | end;
|
|---|
| 88 |
|
|---|
| 89 | function TGrammerRules.ItemByName(Name: string): TGrammerRule;
|
|---|
| 90 | var
|
|---|
| 91 | I: Integer;
|
|---|
| 92 | begin
|
|---|
| 93 | I := 0;
|
|---|
| 94 | while (I < Count) and (TGrammerRule(Items[I]).Name <> Name) do Inc(I);
|
|---|
| 95 | if I < Count then Result := TGrammerRule(Items[I])
|
|---|
| 96 | else Result := nil;
|
|---|
| 97 | end;
|
|---|
| 98 |
|
|---|
| 99 | constructor TGrammer.Create;
|
|---|
| 100 | begin
|
|---|
| 101 | Rules := TGrammerRules.Create;
|
|---|
| 102 | end;
|
|---|
| 103 |
|
|---|
| 104 | destructor TGrammer.Destroy;
|
|---|
| 105 | begin
|
|---|
| 106 | Rules.Free;
|
|---|
| 107 | inherited Destroy;
|
|---|
| 108 | end;
|
|---|
| 109 |
|
|---|
| 110 | function TGrammer.AddRule(AName: string; ARuleType: TRuleType
|
|---|
| 111 | ): TGrammerRule;
|
|---|
| 112 | begin
|
|---|
| 113 | Result := Rules.AddNew;
|
|---|
| 114 | with Result do begin
|
|---|
| 115 | Name := AName;
|
|---|
| 116 | RuleType := ARuleType;
|
|---|
| 117 | end;
|
|---|
| 118 | end;
|
|---|
| 119 |
|
|---|
| 120 | { TGrammerRule }
|
|---|
| 121 |
|
|---|
| 122 | constructor TGrammerRule.Create;
|
|---|
| 123 | begin
|
|---|
| 124 | Items := TGrammerRuleItems.Create;
|
|---|
| 125 | end;
|
|---|
| 126 |
|
|---|
| 127 | destructor TGrammerRule.Destroy;
|
|---|
| 128 | begin
|
|---|
| 129 | Items.Free;
|
|---|
| 130 | inherited Destroy;
|
|---|
| 131 | end;
|
|---|
| 132 |
|
|---|
| 133 | function TGrammerRule.AddItem(AText: string; AItemType: TItemType;
|
|---|
| 134 | AOptional, ARepetition: Boolean): TGrammerRuleItem;
|
|---|
| 135 | begin
|
|---|
| 136 | Result := Items.AddNew;
|
|---|
| 137 | with Result do begin
|
|---|
| 138 | Text := AText;
|
|---|
| 139 | ItemType := AItemType;
|
|---|
| 140 | Optional := AOptional;
|
|---|
| 141 | Repetition := ARepetition;
|
|---|
| 142 | end;
|
|---|
| 143 | end;
|
|---|
| 144 |
|
|---|
| 145 | function TGrammerRule.AddGroup(ARuleType: TRuleType; AOptional,
|
|---|
| 146 | ARepetition: Boolean): TGrammerRule;
|
|---|
| 147 | begin
|
|---|
| 148 | with Items.AddNew do begin
|
|---|
| 149 | Optional := AOptional;
|
|---|
| 150 | Repetition := ARepetition;
|
|---|
| 151 | ItemType := itGroup;
|
|---|
| 152 | Group.RuleType := ARuleType;
|
|---|
| 153 | Result := Group;
|
|---|
| 154 | end;
|
|---|
| 155 | end;
|
|---|
| 156 |
|
|---|
| 157 | end.
|
|---|
| 158 |
|
|---|