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 |
|
---|