source: tools/Grammer/Pl0Grammer.pas

Last change on this file was 33, checked in by george, 14 years ago
  • Added: Pl0 pascal grammer definition.
  • Added: Generation of source code for structure.
File size: 7.7 KB
Line 
1unit Pl0Grammer;
2
3{$mode Delphi}{$H+}
4
5interface
6
7uses
8 Classes, SysUtils, UGrammer;
9
10type
11 TPl0Grammer = class(TGrammer)
12 constructor Create;
13 end;
14
15implementation
16
17constructor TPl0Grammer.Create;
18begin
19 inherited;
20 begin
21 Rules.Clear;
22 with AddRule('Program', rtSequence) do begin
23 AddItem('Block', itReference, False, False);
24 AddItem('.', itText, False, False);
25 end;
26 with AddRule('Block', rtSequence) do begin
27 AddItem('Declaration', itReference, True, False);
28 AddItem('Statement', itReference, False, False);
29 end;
30 with AddRule('Declaration', rtAlternative) do begin
31 AddItem('Constant', itReference, False, False);
32 AddItem('Variable', itReference, False, False);
33 AddItem('Function', itReference, False, False);
34 end;
35 with AddRule('Constant', rtSequence) do begin
36 AddItem('const', itText, False, False);
37 AddItem('ConstantDefinition', itReference, False, False);
38 with AddGroup(rtSequence, False, True), Items do begin
39 AddItem(',', itText, False, False);
40 AddItem('ConstantDefinition', itReference, False, False);
41 end;
42 AddItem(';', itText, False, False);
43 end;
44 with AddRule('ConstantDefinition', rtSequence) do begin
45 AddItem('Name', itReference, False, False);
46 AddItem('=', itText, False, False);
47 AddItem('Number', itReference, False, False);
48 end;
49 with AddRule('Variable', rtSequence) do begin
50 AddItem('var', itText, False, False);
51 AddItem('Name', itReference, False, False);
52 with AddGroup(rtSequence, False, True), Items do begin
53 AddItem(',', itText, False, False);
54 AddItem('Name', itReference, False, False);
55 end;
56 AddItem(';', itText, False, False);
57 end;
58 with AddRule('Function', rtSequence) do begin
59 AddItem('Function', itText, False, False);
60 AddItem('Name', itReference, False, False);
61 AddItem('(', itText, False, False);
62 with AddGroup(rtSequence, True, False), Items do begin
63 AddItem('Name', itReference, False, False);
64 with AddGroup(rtSequence, False, True), Items do begin
65 AddItem(',', itText, False, False);
66 AddItem('Name', itReference, False, False);
67 end;
68 end;
69 AddItem(')', itText, False, False);
70 AddItem('Block', itReference, False, False);
71 AddItem(';', itText, False, False);
72 end;
73 with AddRule('Expression', rtSequence) do begin
74 with AddGroup(rtAlternative, True, False), Items do begin
75 AddItem('-', itText, False, False);
76 AddItem('+', itText, False, False);
77 end;
78 AddItem('Term', itReference, False, False);
79 with AddGroup(rtSequence, False, True), Items do begin
80 with AddGroup(rtAlternative, False, False), Items do begin
81 AddItem('-', itText, False, False);
82 AddItem('+', itText, False, False);
83 end;
84 AddItem('Term', itReference, False, False);
85 end;
86 end;
87 with AddRule('Term', rtSequence) do begin
88 AddItem('Factor', itReference, False, False);
89 with AddGroup(rtSequence, False, True), Items do begin
90 with AddGroup(rtAlternative, False, False), Items do begin
91 AddItem('*', itText, False, False);
92 AddItem('/', itText, False, False);
93 end;
94 AddItem('Factor', itReference, False, False);
95 end;
96 end;
97 with AddRule('Factor', rtAlternative) do begin
98 with AddGroup(rtSequence, False, False), Items do begin
99 AddItem('Name', itReference, False, False);
100 AddItem('(', itText, False, False);
101 with AddGroup(rtSequence, True, False), Items do begin
102 AddItem('Expression', itReference, False, False);
103 with AddGroup(rtSequence, False, True), Items do begin
104 AddItem(',', itText, False, False);
105 AddItem('Expression', itReference, False, False);
106 end;
107 end;
108 AddItem('(', itText, False, False);
109 end;
110 AddItem('Number', itReference, False, False);
111 AddItem('Name', itReference, False, False);
112 with AddGroup(rtSequence, False, False), Items do begin
113 AddItem('(', itText, False, False);
114 AddItem('Expression', itReference, False, False);
115 AddItem(')', itText, False, False);
116 end;
117 end;
118 with AddRule('Statement', rtSequence) do begin
119 with AddGroup(rtAlternative, True, False), Items do begin
120 with AddGroup(rtSequence, False, False), Items do begin
121 AddItem('Name', itReference, False, False);
122 AddItem(':=', itText, False, False);
123 AddItem('Expression', itReference, False, False);
124 end;
125 with AddGroup(rtSequence, False, False), Items do begin
126 AddItem('begin', itText, False, False);
127 AddItem('Statement', itReference, False, False);
128 with AddGroup(rtSequence, False, True), Items do begin
129 AddItem(',', itText, False, False);
130 AddItem('Statement', itReference, False, False);
131 end;
132 AddItem('end', itText, False, False);
133 end;
134 with AddGroup(rtSequence, False, False), Items do begin
135 AddItem('if', itText, False, False);
136 AddItem('Condition', itReference, False, False);
137 AddItem('then', itText, False, False);
138 AddItem('Statement', itReference, False, False);
139 end;
140 with AddGroup(rtSequence, False, False), Items do begin
141 AddItem('while', itText, False, False);
142 AddItem('Condition', itReference, False, False);
143 AddItem('do', itText, False, False);
144 AddItem('Statement', itReference, False, False);
145 end;
146 with AddGroup(rtSequence, False, False), Items do begin
147 AddItem('return', itText, False, False);
148 AddItem('Expression', itReference, False, False);
149 end;
150 with AddGroup(rtSequence, False, False), Items do begin
151 AddItem('write', itText, False, False);
152 AddItem('Expression', itReference, False, False);
153 end;
154 end;
155 end;
156 with AddRule('Condition', rtAlternative) do begin
157 with AddGroup(rtSequence, False, False), Items do begin
158 AddItem('odd', itText, False, False);
159 AddItem('Expression', itReference, False, False);
160 end;
161 with AddGroup(rtSequence, False, False), Items do begin
162 AddItem('Expression', itReference, False, False);
163 with AddGroup(rtAlternative, False, False), Items do begin
164 AddItem('=', itText, False, False);
165 AddItem('<>', itText, False, False);
166 AddItem('<', itText, False, False);
167 AddItem('<=', itText, False, False);
168 AddItem('>', itText, False, False);
169 AddItem('=>', itText, False, False);
170 end;
171 AddItem('Expression', itReference, False, False);
172 end;
173 end;
174
175(* http://www.felix-colibri.com/papers/compilers/pl0_grammar/pl0_grammar.html
176
177 program = block '.' .
178 block = { declaration } statement .
179 declaration = constant | variable | function .
180 constant = CONST constant_definition { ',' constant_definition } ';' .
181 constant_definition = NAME '=' NUMBER .
182 variable = VAR NAME { ',' NAME } ';' .
183 function = FUNCTION NAME '(' [ NAME { ',' NAME } ] ')' block ';' .
184 expression = [ ( '-' | '+' ) ] term { ( '-' | '+' ) term } .
185 term = factor { ( '*' | '/' ) factor } .
186 factor = NAME '(' [ expression { ',' expression } ] ')'
187 | NUMBER | NAME | '(' expression ')' .
188 statement = [ NAME ':=' expression
189 | BEGIN statement { ';' statement } END
190 | IF condition THEN statement
191 | WHILE condition DO statement
192 | RETURN expression
193 | WRITE expression ] .
194 condition = ODD expression
195 | expression ( '=' | '<>' | '<' | '<=' | '>' | '>=' ) expression .
196 *)
197 end;
198end;
199
200
201end.
202
Note: See TracBrowser for help on using the repository browser.