kanocc 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/examples/bind.rb +26 -0
- data/examples/calculator.rb +19 -15
- data/examples/doc_calc.rb +42 -0
- data/examples/minipascalsyntax.html +371 -0
- data/examples/ruby_quiz_78.rb +12 -11
- data/lib/kanocc.rb +73 -102
- data/lib/kanocc/earley.rb +262 -217
- data/lib/kanocc/grammar_rule.rb +7 -21
- data/lib/kanocc/nonterminal.rb +67 -65
- data/lib/kanocc/scanner.rb +168 -85
- data/lib/kanocc/token.rb +24 -0
- data/lib/todo +2 -3
- metadata +13 -9
data/examples/bind.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
libdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
+
$:.unshift(libdir)
|
4
|
+
require "kanocc.rb"
|
5
|
+
require "logger"
|
6
|
+
|
7
|
+
class Number < Kanocc::Token
|
8
|
+
attr_reader :val
|
9
|
+
pattern(/\d+/) {@val = @m[0].to_i}
|
10
|
+
end
|
11
|
+
|
12
|
+
class Expr < Kanocc::Nonterminal
|
13
|
+
attr_reader :val
|
14
|
+
rule(Expr, "-", Expr) {@val = @rhs[0].val - @rhs[2].val};
|
15
|
+
rule(Expr, "+", Expr) {@val = @rhs[0].val + @rhs[2].val};
|
16
|
+
rule(Number) {@val = @rhs[0].val}
|
17
|
+
end
|
18
|
+
|
19
|
+
# Make a parser, give it 'Program' as the grammars startsymbol
|
20
|
+
|
21
|
+
parser = Kanocc::Kanocc.new(Expr)
|
22
|
+
#parser.logger.level = Logger::INFO
|
23
|
+
|
24
|
+
puts parser.parse("7 - 5 + 3").val
|
25
|
+
puts parser.parse("7 - 3 - 2").val
|
26
|
+
|
data/examples/calculator.rb
CHANGED
@@ -56,43 +56,47 @@ class Expr < Kanocc::Nonterminal
|
|
56
56
|
|
57
57
|
rule(Expr, "+", Expr) {@val = @rhs[0].val + @rhs[2].val}
|
58
58
|
rule(Expr, "-", Expr) {@val = @rhs[0].val - @rhs[2].val}
|
59
|
-
rule(Expr, "*", Expr) {@val = @rhs[0].val * @rhs[2].val}
|
60
|
-
rule(Expr, "/", Expr) {@val = @rhs[0].val / @rhs[2].val}
|
59
|
+
rule(Expr, "*", Expr) {@val = @rhs[0].val * @rhs[2].val}; precedence -1
|
60
|
+
rule(Expr, "/", Expr) {@val = @rhs[0].val / @rhs[2].val}; precedence -1
|
61
61
|
rule("(", Expr, ")") {@val = @rhs[1].val}
|
62
62
|
rule(Number) {@val = @rhs[0].val}
|
63
|
-
|
64
|
-
set_operator_precedence ['*', '/'], 2
|
65
63
|
end
|
66
64
|
|
67
65
|
class Line < Kanocc::Nonterminal
|
68
|
-
rule(Expr, "\n")
|
69
|
-
|
70
|
-
|
71
|
-
puts "Sorry - didn't understand: #{error_string.inspect}"
|
66
|
+
rule(Expr, "\n") do
|
67
|
+
str = $source[@rhs.start_pos..@rhs.end_pos - 2]
|
68
|
+
puts str + " gives: " + @rhs[0].val.to_s
|
72
69
|
end
|
70
|
+
# rule(Kanocc::Error, "\n") do
|
71
|
+
# error_string = $source[@rhs.start_pos..@rhs.end_pos]
|
72
|
+
# puts "Sorry - didn't understand: #{error_string.inspect}"
|
73
|
+
# end
|
73
74
|
end
|
74
75
|
|
75
76
|
class Program < Kanocc::Nonterminal
|
76
|
-
rule(
|
77
|
-
rule()
|
77
|
+
rule(zm(Line))
|
78
78
|
end
|
79
79
|
|
80
80
|
# Make a parser, give it 'Program' as the grammars startsymbol
|
81
81
|
|
82
82
|
parser = Kanocc::Kanocc.new(Program)
|
83
|
-
|
83
|
+
|
84
|
+
parser.logger.level = Logger::INFO
|
84
85
|
|
85
86
|
# Feed it some input
|
87
|
+
|
86
88
|
$source = <<-EOF
|
87
|
-
2
|
88
|
-
3 - 3 +
|
89
|
+
2 + 3
|
89
90
|
7 - 2 - 1
|
90
91
|
3 * 2 + 4
|
91
92
|
4 + 3 * 3
|
92
|
-
|
93
|
+
8 - 3/2
|
93
94
|
EOF
|
94
|
-
|
95
|
+
|
96
|
+
|
97
|
+
#puts "parsing: \n" + $source
|
95
98
|
|
96
99
|
# and go
|
97
100
|
parser.parse($source)
|
98
101
|
|
102
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "kanocc"
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
class Number < Kanocc::Token
|
6
|
+
attr_reader :val
|
7
|
+
pattern(/\d+/) { @val = @m[0].to_i}
|
8
|
+
end
|
9
|
+
|
10
|
+
class Expr < Kanocc::Nonterminal
|
11
|
+
attr_reader :val
|
12
|
+
|
13
|
+
rule(Expr, "+", Expr) { @val = @rhs[0].val + @rhs[2].val}
|
14
|
+
rule(Expr, "-", Expr) { @val = @rhs[0].val - @rhs[2].val}
|
15
|
+
rule(Expr, "*", Expr) { @val = @rhs[0].val * @rhs[2].val}; precedence(-1);
|
16
|
+
rule(Expr, "/", Expr) { @val = @rhs[0].val / @rhs[2].val}; precedence(-1);
|
17
|
+
rule("(", Expr, ")") { @val = @rhs[1].val}
|
18
|
+
rule(Number) {@val = @rhs[0].val}
|
19
|
+
|
20
|
+
bind_right('-')
|
21
|
+
end
|
22
|
+
|
23
|
+
#class Line < Kanocc::Nonterminal
|
24
|
+
# rule(Expr, "\n") {puts @rhs[0].val}
|
25
|
+
# rule(Kanocc::Error, "\n") {puts "Sorry - didn't understand: " + @rhs[0].str.inspect}
|
26
|
+
#end
|
27
|
+
#
|
28
|
+
#class Program < Kanocc::Nonterminal
|
29
|
+
# rule(zm(Line))
|
30
|
+
#end
|
31
|
+
#
|
32
|
+
parser = Kanocc::Kanocc.new(Expr)
|
33
|
+
parser.logger.level = Logger::INFO
|
34
|
+
|
35
|
+
prog = <<-EOI
|
36
|
+
8 - 4 + 2
|
37
|
+
EOI
|
38
|
+
|
39
|
+
puts prog.inspect
|
40
|
+
Expr.show_all_rules
|
41
|
+
|
42
|
+
puts parser.parse(prog).val
|
@@ -0,0 +1,371 @@
|
|
1
|
+
<html><head><title>Syntax of Mini-Pascal</title></head>
|
2
|
+
<body bgcolor="#FFFFFF">
|
3
|
+
<hr>
|
4
|
+
<h3>Syntax of Mini-Pascal (Welsh & McKeag, 1980)</h3>
|
5
|
+
<hr>
|
6
|
+
Syntax in recursive descent order
|
7
|
+
<hr>
|
8
|
+
<table>
|
9
|
+
<tr valign="top">
|
10
|
+
<td><<i>program</i>> <b><code>::=</code></b>
|
11
|
+
<td><b>program</b> <<i>identifier</i>> <b>;</b> <<i>block</i>> <b>.</b>
|
12
|
+
</td>
|
13
|
+
</tr>
|
14
|
+
</table>
|
15
|
+
<table>
|
16
|
+
<tr valign="top">
|
17
|
+
<td><<i>block</i>> <b><code>::=</code></b>
|
18
|
+
<td>
|
19
|
+
<<i>variable declaration part</i>> <br>
|
20
|
+
<<i>procedure declaration part</i>> <br>
|
21
|
+
<<i>statement part</i>>
|
22
|
+
</td>
|
23
|
+
</tr>
|
24
|
+
</table><hr>
|
25
|
+
<table>
|
26
|
+
<tr valign="top">
|
27
|
+
<td> <<i>variable declaration part</i>> <b><code>::=</code></b>
|
28
|
+
<td> <<i>empty</i>> | <br>
|
29
|
+
<b>var</b> <<i>variable declaration</i>> <b>;</b> <br>
|
30
|
+
{ <<i>variable declaration</i>> <b>;</b> }
|
31
|
+
</td>
|
32
|
+
</tr>
|
33
|
+
</table>
|
34
|
+
<table>
|
35
|
+
<tr valign="top">
|
36
|
+
<td> <<i>variable declaration</i>> <b><code>::=</code></b>
|
37
|
+
<td> <<i>identifier </i>> { <b>,</b> <<i>identifier</i>> } <b>:</b> <<i>type</i>>
|
38
|
+
</td>
|
39
|
+
</tr>
|
40
|
+
</table>
|
41
|
+
<table>
|
42
|
+
<tr valign="top">
|
43
|
+
<td> <<i>type</i>> <b><code>::=</code></b>
|
44
|
+
<td> <<i>simple type</i>> | <<i>array type</i>>
|
45
|
+
</td>
|
46
|
+
</tr>
|
47
|
+
</table>
|
48
|
+
<table>
|
49
|
+
<tr valign="top">
|
50
|
+
<td> <<i>array type</i>> <b><code>::=</code></b>
|
51
|
+
<td> <b>array</b> <b>[</b> <<i>index range</i>> <b>]</b> <b>of</b> <<i>simple type</i>>
|
52
|
+
</td>
|
53
|
+
</tr>
|
54
|
+
</table>
|
55
|
+
<table>
|
56
|
+
<tr valign="top">
|
57
|
+
<td> <<i>index range</i>> <b><code>::=</code></b>
|
58
|
+
<td> <<i>integer constant</i>> <b>..</b> <<i>integer constant</i>>
|
59
|
+
</td>
|
60
|
+
</tr>
|
61
|
+
</table>
|
62
|
+
<table>
|
63
|
+
<tr valign="top">
|
64
|
+
<td> <<i>simple type</i>> <b><code>::=</code></b>
|
65
|
+
<td> <<i>type identifier</i>>
|
66
|
+
</td>
|
67
|
+
</tr>
|
68
|
+
</table>
|
69
|
+
<table>
|
70
|
+
<tr valign="top">
|
71
|
+
<td> <<i>type identifier</i>> <b><code>::=</code></b>
|
72
|
+
<td> <<i>identifier</i>>
|
73
|
+
</td>
|
74
|
+
</tr>
|
75
|
+
</table>
|
76
|
+
<hr>
|
77
|
+
<table>
|
78
|
+
<tr valign="top">
|
79
|
+
<td> <<i>procedure declaration part</i>> <b><code>::=</code></b>
|
80
|
+
<td> { <<i>procedure declaration</i>> <b>;</b> }
|
81
|
+
</td>
|
82
|
+
</tr>
|
83
|
+
</table>
|
84
|
+
<table>
|
85
|
+
<tr valign="top">
|
86
|
+
<td> <<i>procedure declaration</i>> <b><code>::=</code></b>
|
87
|
+
<td> <b>procedure</b> <<i>identifier</i>> <b>;</b> <<i>block</i>>
|
88
|
+
</td>
|
89
|
+
</tr>
|
90
|
+
</table>
|
91
|
+
<hr>
|
92
|
+
<table>
|
93
|
+
<tr valign="top">
|
94
|
+
<td> <<i>statement part</i>> <b><code>::=</code></b>
|
95
|
+
<td> <<i>compound statement</i>>
|
96
|
+
</td>
|
97
|
+
</tr>
|
98
|
+
</table>
|
99
|
+
<table>
|
100
|
+
<tr valign="top">
|
101
|
+
<td> <<i>compound statement</i>> <b><code>::=</code></b>
|
102
|
+
<td> <b>begin</b> <<i>statement</i>>{ <b>;</b> <<i>statement</i>> } <b>end</b>
|
103
|
+
</td>
|
104
|
+
</tr>
|
105
|
+
</table>
|
106
|
+
<table>
|
107
|
+
<tr valign="top">
|
108
|
+
<td> <<i>statement</i>> <b><code>::=</code></b>
|
109
|
+
<td> <<i>simple statement</i>> | <<i>structured statement</i>>
|
110
|
+
</td>
|
111
|
+
</tr>
|
112
|
+
</table>
|
113
|
+
<hr>
|
114
|
+
<table>
|
115
|
+
<tr valign="top">
|
116
|
+
<td> <<i>simple statement</i>> <b><code>::=</code></b>
|
117
|
+
<td> <<i>assignment statement</i>> | <<i>procedure statement</i>> | <br>
|
118
|
+
<<i>read statement</i>> | <<i>write statement</i>>
|
119
|
+
</td>
|
120
|
+
</tr>
|
121
|
+
</table>
|
122
|
+
<table>
|
123
|
+
<tr valign="top">
|
124
|
+
<td> <<i>assignment statement</i>> <b><code>::=</code></b>
|
125
|
+
<td> <<i>variable</i>> <b><code>:=</code></b> <<i>expression</i>>
|
126
|
+
</td>
|
127
|
+
</tr>
|
128
|
+
</table>
|
129
|
+
<table>
|
130
|
+
<tr valign="top">
|
131
|
+
<td> <<i>procedure statement</i>> <b><code>::=</code></b>
|
132
|
+
<td> <<i>procedure identifier</i>>
|
133
|
+
</td>
|
134
|
+
</tr>
|
135
|
+
</table>
|
136
|
+
<table>
|
137
|
+
<tr valign="top">
|
138
|
+
<td> <<i>procedure identifier</i>> <b><code>::=</code></b>
|
139
|
+
<td> <<i>identifier</i>>
|
140
|
+
</td>
|
141
|
+
</tr>
|
142
|
+
</table>
|
143
|
+
<table>
|
144
|
+
<tr valign="top">
|
145
|
+
<td> <<i>read statement</i>> <b><code>::=</code></b>
|
146
|
+
<td> <b>read</b> <b>(</b> <<i>input variable</i>> { <b>,</b> <<i>input variable</i>> } <b>)</b>
|
147
|
+
</td>
|
148
|
+
</tr>
|
149
|
+
</table>
|
150
|
+
<table>
|
151
|
+
<tr valign="top">
|
152
|
+
<td> <<i>input variable</i>> <b><code>::=</code></b>
|
153
|
+
<td> <<i>variable</i>> </td>
|
154
|
+
</tr>
|
155
|
+
</table>
|
156
|
+
<table>
|
157
|
+
<tr valign="top">
|
158
|
+
<td> <<i>write statement</i>> <b><code>::=</code></b>
|
159
|
+
<td> <b>write</b> <b>(</b> <<i>output value</i>> { <b>,</b> <<i>output value</i>> } <b>)</b>
|
160
|
+
</td>
|
161
|
+
</tr>
|
162
|
+
</table>
|
163
|
+
<table>
|
164
|
+
<tr valign="top">
|
165
|
+
<td> <<i>output value</i>> <b><code>::=</code></b>
|
166
|
+
<td> <<i>expression</i>> </td>
|
167
|
+
</tr>
|
168
|
+
</table>
|
169
|
+
<hr>
|
170
|
+
<table>
|
171
|
+
<tr valign="top">
|
172
|
+
<td> <<i>structured statement</i>> <b><code>::=</code></b>
|
173
|
+
<td> <<i>compound statement</i>> | <<i>if statement</i>> | <br>
|
174
|
+
<<i>while statement</i>>
|
175
|
+
</td>
|
176
|
+
</tr>
|
177
|
+
</table>
|
178
|
+
<table>
|
179
|
+
<tr valign="top">
|
180
|
+
<td> <<i>if statement</i>> <b><code>::=</code></b>
|
181
|
+
<td> <b>if</b> <<i>expression</i>> <b>then</b> <<i>statement</i>> | <br>
|
182
|
+
<b>if</b> <<i>expression</i>> <b>then</b> <<i>statement</i>> <b>else</b> <<i>statement</i>>
|
183
|
+
</td>
|
184
|
+
</tr>
|
185
|
+
</table>
|
186
|
+
<table>
|
187
|
+
<tr valign="top">
|
188
|
+
<td> <<i>while statement</i>> <b><code>::=</code></b>
|
189
|
+
<td> <b>while</b> <<i>expression</i>> <b>do</b> <<i>statement</i>>
|
190
|
+
</td>
|
191
|
+
</tr>
|
192
|
+
</table>
|
193
|
+
<hr>
|
194
|
+
<table>
|
195
|
+
<tr valign="top">
|
196
|
+
<td> <<i>expression</i>> <b><code>::=</code></b>
|
197
|
+
<td> <<i>simple expression</i>> | <br>
|
198
|
+
<<i>simple expression</i>> <<i>relational operator</i>> <<i>simple expression</i>>
|
199
|
+
</td>
|
200
|
+
</tr>
|
201
|
+
</table>
|
202
|
+
<table>
|
203
|
+
<tr valign="top">
|
204
|
+
<td> <<i>simple expression</i>> <b><code>::=</code></b>
|
205
|
+
<td> <<i>sign</i>> <<i>term</i>> { <<i>adding operator</i>> <<i>term</i>> }
|
206
|
+
</td>
|
207
|
+
</tr>
|
208
|
+
</table>
|
209
|
+
<table>
|
210
|
+
<tr valign="top">
|
211
|
+
<td> <<i>term</i>> <b><code>::=</code></b>
|
212
|
+
<td> <<i>factor</i>> { <<i>multiplying operator</i>> <<i>factor</i>> }
|
213
|
+
</td>
|
214
|
+
</tr>
|
215
|
+
</table>
|
216
|
+
<table>
|
217
|
+
<tr valign="top">
|
218
|
+
<td> <<i>factor</i>> <b><code>::=</code></b>
|
219
|
+
<td> <<i>variable</i>> | <<i>constant</i>> | <b>(</b> <<i>expression</i>> <b>)</b> |
|
220
|
+
<b>not</b> <<i>factor</i>>
|
221
|
+
</td>
|
222
|
+
</tr>
|
223
|
+
</table>
|
224
|
+
<hr>
|
225
|
+
<table>
|
226
|
+
<tr valign="top">
|
227
|
+
<td> <<i>relational operator</i>> <b><code>::=</code></b>
|
228
|
+
<td> <b>=</b> | <b><></b> | <b><</b> | <b><=</b> | <b>>=</b> | <b>></b>
|
229
|
+
</td>
|
230
|
+
</tr>
|
231
|
+
</table>
|
232
|
+
<table>
|
233
|
+
<tr valign="top">
|
234
|
+
<td> <<i>sign</i>> <b><code>::=</code></b>
|
235
|
+
<td> + | <code>-</code> | <<i>empty</i>>
|
236
|
+
</td>
|
237
|
+
</tr>
|
238
|
+
</table>
|
239
|
+
<table>
|
240
|
+
<tr valign="top">
|
241
|
+
<td> <<i>adding operator</i>> <b><code>::=</code></b>
|
242
|
+
<td> + | <code>-</code> | <b>or</b>
|
243
|
+
</td>
|
244
|
+
</tr>
|
245
|
+
</table>
|
246
|
+
<table>
|
247
|
+
<tr valign="top">
|
248
|
+
<td> <<i>multiplying operator</i>> <b><code>::=</code></b>
|
249
|
+
<td> <code>*</code> | <b>div</b> | <b>and</b>
|
250
|
+
</td>
|
251
|
+
</tr>
|
252
|
+
</table>
|
253
|
+
<hr>
|
254
|
+
<table>
|
255
|
+
<tr valign="top">
|
256
|
+
<td> <<i>variable</i>> <b><code>::=</code></b>
|
257
|
+
<td> <<i>entire variable</i>> | <<i>indexed variable</i>>
|
258
|
+
</td>
|
259
|
+
</tr>
|
260
|
+
</table>
|
261
|
+
<table>
|
262
|
+
<tr valign="top">
|
263
|
+
<td> <<i>indexed variable</i>> <b><code>::=</code></b>
|
264
|
+
<td> <<i>array variable</i>> <b>[</b> <<i>expression</i>> <b>]</b>
|
265
|
+
</td>
|
266
|
+
</tr>
|
267
|
+
</table>
|
268
|
+
<table>
|
269
|
+
<tr valign="top">
|
270
|
+
<td> <<i>array variable</i>> <b><code>::=</code></b>
|
271
|
+
<td> <<i>entire variable</i>>
|
272
|
+
</td>
|
273
|
+
</tr>
|
274
|
+
</table>
|
275
|
+
<table>
|
276
|
+
<tr valign="top">
|
277
|
+
<td> <<i>entire variable</i>> <b><code>::=</code></b>
|
278
|
+
<td> <<i>variable identifier</i>>
|
279
|
+
</td>
|
280
|
+
</tr>
|
281
|
+
</table>
|
282
|
+
<table>
|
283
|
+
<tr valign="top">
|
284
|
+
<td> <<i>variable identifier</i>> <b><code>::=</code></b>
|
285
|
+
<td> <<i>identifier</i>>
|
286
|
+
</td>
|
287
|
+
</tr>
|
288
|
+
</table>
|
289
|
+
<hr>
|
290
|
+
Lexical grammar
|
291
|
+
<hr>
|
292
|
+
<table>
|
293
|
+
<tr valign="top">
|
294
|
+
<td> <<i>constant</i>> <b><code>::=</code></b>
|
295
|
+
<td> <<i>integer constant</i>> | <<i>character constant</i>> | <<i>constant identifier</i>>
|
296
|
+
</td>
|
297
|
+
</tr>
|
298
|
+
</table>
|
299
|
+
<table>
|
300
|
+
<tr valign="top">
|
301
|
+
<td> <<i>constant identifier</i>> <b><code>::=</code></b>
|
302
|
+
<td> <<i>identifier</i>>
|
303
|
+
</td>
|
304
|
+
</tr>
|
305
|
+
</table>
|
306
|
+
<table>
|
307
|
+
<tr valign="top">
|
308
|
+
<td> <<i>identifier</i>> <b><code>::=</code></b>
|
309
|
+
<td> <<i>letter</i>> { <<i>letter or digit</i>> }
|
310
|
+
</td>
|
311
|
+
</tr>
|
312
|
+
</table>
|
313
|
+
<table>
|
314
|
+
<tr valign="top">
|
315
|
+
<td> <<i>letter or digit</i>> <b><code>::=</code></b>
|
316
|
+
<td> <<i>letter</i>> | <<i>digit</i>>
|
317
|
+
</td>
|
318
|
+
</tr>
|
319
|
+
</table>
|
320
|
+
<table>
|
321
|
+
<tr valign="top">
|
322
|
+
<td> <<i>integer constant</i>> <b><code>::=</code></b>
|
323
|
+
<td> <<i>digit</i>> { <<i>digit</i>> }
|
324
|
+
</td>
|
325
|
+
</tr>
|
326
|
+
</table>
|
327
|
+
<table>
|
328
|
+
<tr valign="top">
|
329
|
+
<td> <<i>character constant</i>> <b><code>::=</code></b>
|
330
|
+
<td> <b>'</b><<i> any character other than </i>' ><b>'</b> | <b>''''</b>
|
331
|
+
</td>
|
332
|
+
</tr>
|
333
|
+
</table>
|
334
|
+
<table>
|
335
|
+
<tr valign="top">
|
336
|
+
<td> <<i>letter</i>> <b><code>::=</code></b>
|
337
|
+
<td> a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | <br>
|
338
|
+
p | q | r | s | t | u | v | w | x | y | z | A | B | C | <br>
|
339
|
+
D | E | F | G | H | I | J | K | L | M | N | O | P <br>
|
340
|
+
| Q | R | S | T | W | V | W | X | Y | Z
|
341
|
+
</td>
|
342
|
+
</tr>
|
343
|
+
</table>
|
344
|
+
<table>
|
345
|
+
<tr valign="top">
|
346
|
+
<td> <<i>digit</i>> <b><code>::=</code></b>
|
347
|
+
<td> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
|
348
|
+
</td>
|
349
|
+
</tr>
|
350
|
+
</table>
|
351
|
+
<table>
|
352
|
+
<tr valign="top">
|
353
|
+
<td> <<i>special symbol</i>> <b><code>::=</code></b>
|
354
|
+
<td> + | - | * | = | <> | < | > | <= | >= | <br>
|
355
|
+
( | ) | [ | ] | <b><code>:=</code></b> | . | , | ; | : | .. | <b>div</b> | <b>or</b> | <br>
|
356
|
+
<b>and</b> | <b>not</b> | <b>if</b> | <b>then</b> | <b>else</b> | <b>of</b> | <b>while</b> | <b>do</b> | <br>
|
357
|
+
<b>begin</b> | <b>end</b> | <b>read</b> | <b>write</b> | <b>var</b> | <b>array</b> | <br>
|
358
|
+
<b>procedure</b> | <b>program</b>
|
359
|
+
</td>
|
360
|
+
</tr>
|
361
|
+
</table>
|
362
|
+
<table>
|
363
|
+
<tr valign="top">
|
364
|
+
<td> <<i>predefined identifier</i>> <b><code>::=</code></b>
|
365
|
+
<td> integer | Boolean | true | false
|
366
|
+
</td>
|
367
|
+
</tr>
|
368
|
+
</table>
|
369
|
+
<hr>
|
370
|
+
</body>
|
371
|
+
</html>
|