source: tools/Grammer/UGrammer.pas

Last change on this file was 31, checked in by george, 13 years ago
  • Added: Tool for generating source code structure from language grammer difinition.
File size: 3.1 KB
Line 
1unit UGrammer;
2
3{$mode Delphi}{$H+}
4
5interface
6
7uses
8 Classes, SysUtils, Contnrs;
9
10type
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
62implementation
63
64constructor TGrammerRuleItem.Create;
65begin
66 Group := TGrammerRule.Create;
67end;
68
69destructor TGrammerRuleItem.Destroy;
70begin
71 Group.Free;
72 inherited Destroy;
73end;
74
75{ TGrammerRuleItems }
76
77function TGrammerRuleItems.AddNew: TGrammerRuleItem;
78begin
79 Result := TGrammerRuleItem(Items[Add(TGrammerRuleItem.Create)]);
80end;
81
82{ TGrammerRules }
83
84function TGrammerRules.AddNew: TGrammerRule;
85begin
86 Result := TGrammerRule(Items[Add(TGrammerRule.Create)]);
87end;
88
89function TGrammerRules.ItemByName(Name: string): TGrammerRule;
90var
91 I: Integer;
92begin
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;
97end;
98
99constructor TGrammer.Create;
100begin
101 Rules := TGrammerRules.Create;
102end;
103
104destructor TGrammer.Destroy;
105begin
106 Rules.Free;
107 inherited Destroy;
108end;
109
110function TGrammer.AddRule(AName: string; ARuleType: TRuleType
111 ): TGrammerRule;
112begin
113 Result := Rules.AddNew;
114 with Result do begin
115 Name := AName;
116 RuleType := ARuleType;
117 end;
118end;
119
120{ TGrammerRule }
121
122constructor TGrammerRule.Create;
123begin
124 Items := TGrammerRuleItems.Create;
125end;
126
127destructor TGrammerRule.Destroy;
128begin
129 Items.Free;
130 inherited Destroy;
131end;
132
133function TGrammerRule.AddItem(AText: string; AItemType: TItemType;
134 AOptional, ARepetition: Boolean): TGrammerRuleItem;
135begin
136 Result := Items.AddNew;
137 with Result do begin
138 Text := AText;
139 ItemType := AItemType;
140 Optional := AOptional;
141 Repetition := ARepetition;
142 end;
143end;
144
145function TGrammerRule.AddGroup(ARuleType: TRuleType; AOptional,
146 ARepetition: Boolean): TGrammerRule;
147begin
148 with Items.AddNew do begin
149 Optional := AOptional;
150 Repetition := ARepetition;
151 ItemType := itGroup;
152 Group.RuleType := ARuleType;
153 Result := Group;
154 end;
155end;
156
157end.
158
Note: See TracBrowser for help on using the repository browser.