kanocc 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+
@@ -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") { p @rhs[0].val}
69
- rule(Kanocc::Error, "\n") do
70
- error_string = $source[@rhs.start_pos, @rhs.end_pos - @rhs.start_pos]
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(Program, Line)
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
- #parser.logger.level = Logger::INFO
83
+
84
+ parser.logger.level = Logger::INFO
84
85
 
85
86
  # Feed it some input
87
+
86
88
  $source = <<-EOF
87
- 2 * 3
88
- 3 - 3 +
89
+ 2 + 3
89
90
  7 - 2 - 1
90
91
  3 * 2 + 4
91
92
  4 + 3 * 3
92
- 0xFF + 7
93
+ 8 - 3/2
93
94
  EOF
94
- puts "parsing: \n" + $source
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 &amp; McKeag, 1980)</h3>
5
+ <hr>
6
+ Syntax in recursive descent order
7
+ <hr>
8
+ <table>
9
+ <tr valign="top">
10
+ <td>&lt;<i>program</i>&gt; <b><code>::=</code></b>
11
+ <td><b>program</b> &lt;<i>identifier</i>&gt; <b>;</b> &lt;<i>block</i>&gt; <b>.</b>
12
+ </td>
13
+ </tr>
14
+ </table>
15
+ <table>
16
+ <tr valign="top">
17
+ <td>&lt;<i>block</i>&gt; <b><code>::=</code></b>
18
+ <td>
19
+ &lt;<i>variable declaration part</i>&gt; <br>
20
+ &lt;<i>procedure declaration part</i>&gt; <br>
21
+ &lt;<i>statement part</i>&gt;
22
+ </td>
23
+ </tr>
24
+ </table><hr>
25
+ <table>
26
+ <tr valign="top">
27
+ <td> &lt;<i>variable declaration part</i>&gt; <b><code>::=</code></b>
28
+ <td> &lt;<i>empty</i>&gt; | <br>
29
+ <b>var</b> &lt;<i>variable declaration</i>&gt; <b>;</b> <br>
30
+ &nbsp;&nbsp;&nbsp;&nbsp;{ &lt;<i>variable declaration</i>&gt; <b>;</b> }
31
+ </td>
32
+ </tr>
33
+ </table>
34
+ <table>
35
+ <tr valign="top">
36
+ <td> &lt;<i>variable declaration</i>&gt; <b><code>::=</code></b>
37
+ <td> &lt;<i>identifier </i>&gt; { <b>,</b> &lt;<i>identifier</i>&gt; } <b>:</b> &lt;<i>type</i>&gt;
38
+ </td>
39
+ </tr>
40
+ </table>
41
+ <table>
42
+ <tr valign="top">
43
+ <td> &lt;<i>type</i>&gt; <b><code>::=</code></b>
44
+ <td> &lt;<i>simple type</i>&gt; | &lt;<i>array type</i>&gt;
45
+ </td>
46
+ </tr>
47
+ </table>
48
+ <table>
49
+ <tr valign="top">
50
+ <td> &lt;<i>array type</i>&gt; <b><code>::=</code></b>
51
+ <td> <b>array</b> <b>[</b> &lt;<i>index range</i>&gt; <b>]</b> <b>of</b> &lt;<i>simple type</i>&gt;
52
+ </td>
53
+ </tr>
54
+ </table>
55
+ <table>
56
+ <tr valign="top">
57
+ <td> &lt;<i>index range</i>&gt; <b><code>::=</code></b>
58
+ <td> &lt;<i>integer constant</i>&gt; <b>..</b> &lt;<i>integer constant</i>&gt;
59
+ </td>
60
+ </tr>
61
+ </table>
62
+ <table>
63
+ <tr valign="top">
64
+ <td> &lt;<i>simple type</i>&gt; <b><code>::=</code></b>
65
+ <td> &lt;<i>type identifier</i>&gt;
66
+ </td>
67
+ </tr>
68
+ </table>
69
+ <table>
70
+ <tr valign="top">
71
+ <td> &lt;<i>type identifier</i>&gt; <b><code>::=</code></b>
72
+ <td> &lt;<i>identifier</i>&gt;
73
+ </td>
74
+ </tr>
75
+ </table>
76
+ <hr>
77
+ <table>
78
+ <tr valign="top">
79
+ <td> &lt;<i>procedure declaration part</i>&gt; <b><code>::=</code></b>
80
+ <td> { &lt;<i>procedure declaration</i>&gt; <b>;</b> }
81
+ </td>
82
+ </tr>
83
+ </table>
84
+ <table>
85
+ <tr valign="top">
86
+ <td> &lt;<i>procedure declaration</i>&gt; <b><code>::=</code></b>
87
+ <td> <b>procedure</b> &lt;<i>identifier</i>&gt; <b>;</b> &lt;<i>block</i>&gt;
88
+ </td>
89
+ </tr>
90
+ </table>
91
+ <hr>
92
+ <table>
93
+ <tr valign="top">
94
+ <td> &lt;<i>statement part</i>&gt; <b><code>::=</code></b>
95
+ <td> &lt;<i>compound statement</i>&gt;
96
+ </td>
97
+ </tr>
98
+ </table>
99
+ <table>
100
+ <tr valign="top">
101
+ <td> &lt;<i>compound statement</i>&gt; <b><code>::=</code></b>
102
+ <td> <b>begin</b> &lt;<i>statement</i>&gt;{ <b>;</b> &lt;<i>statement</i>&gt; } <b>end</b>
103
+ </td>
104
+ </tr>
105
+ </table>
106
+ <table>
107
+ <tr valign="top">
108
+ <td> &lt;<i>statement</i>&gt; <b><code>::=</code></b>
109
+ <td> &lt;<i>simple statement</i>&gt; | &lt;<i>structured statement</i>&gt;
110
+ </td>
111
+ </tr>
112
+ </table>
113
+ <hr>
114
+ <table>
115
+ <tr valign="top">
116
+ <td> &lt;<i>simple statement</i>&gt; <b><code>::=</code></b>
117
+ <td> &lt;<i>assignment statement</i>&gt; | &lt;<i>procedure statement</i>&gt; | <br>
118
+ &lt;<i>read statement</i>&gt; | &lt;<i>write statement</i>&gt;
119
+ </td>
120
+ </tr>
121
+ </table>
122
+ <table>
123
+ <tr valign="top">
124
+ <td> &lt;<i>assignment statement</i>&gt; <b><code>::=</code></b>
125
+ <td> &lt;<i>variable</i>&gt; <b><code>:=</code></b> &lt;<i>expression</i>&gt;
126
+ </td>
127
+ </tr>
128
+ </table>
129
+ <table>
130
+ <tr valign="top">
131
+ <td> &lt;<i>procedure statement</i>&gt; <b><code>::=</code></b>
132
+ <td> &lt;<i>procedure identifier</i>&gt;
133
+ </td>
134
+ </tr>
135
+ </table>
136
+ <table>
137
+ <tr valign="top">
138
+ <td> &lt;<i>procedure identifier</i>&gt; <b><code>::=</code></b>
139
+ <td> &lt;<i>identifier</i>&gt;
140
+ </td>
141
+ </tr>
142
+ </table>
143
+ <table>
144
+ <tr valign="top">
145
+ <td> &lt;<i>read statement</i>&gt; <b><code>::=</code></b>
146
+ <td> <b>read</b> <b>(</b> &lt;<i>input variable</i>&gt; { <b>,</b> &lt;<i>input variable</i>&gt; } <b>)</b>
147
+ </td>
148
+ </tr>
149
+ </table>
150
+ <table>
151
+ <tr valign="top">
152
+ <td> &lt;<i>input variable</i>&gt; <b><code>::=</code></b>
153
+ <td> &lt;<i>variable</i>&gt; </td>
154
+ </tr>
155
+ </table>
156
+ <table>
157
+ <tr valign="top">
158
+ <td> &lt;<i>write statement</i>&gt; <b><code>::=</code></b>
159
+ <td> <b>write</b> <b>(</b> &lt;<i>output value</i>&gt; { <b>,</b> &lt;<i>output value</i>&gt; } <b>)</b>
160
+ </td>
161
+ </tr>
162
+ </table>
163
+ <table>
164
+ <tr valign="top">
165
+ <td> &lt;<i>output value</i>&gt; <b><code>::=</code></b>
166
+ <td> &lt;<i>expression</i>&gt; </td>
167
+ </tr>
168
+ </table>
169
+ <hr>
170
+ <table>
171
+ <tr valign="top">
172
+ <td> &lt;<i>structured statement</i>&gt; <b><code>::=</code></b>
173
+ <td> &lt;<i>compound statement</i>&gt; | &lt;<i>if statement</i>&gt; | <br>
174
+ &lt;<i>while statement</i>&gt;
175
+ </td>
176
+ </tr>
177
+ </table>
178
+ <table>
179
+ <tr valign="top">
180
+ <td> &lt;<i>if statement</i>&gt; <b><code>::=</code></b>
181
+ <td> <b>if</b> &lt;<i>expression</i>&gt; <b>then</b> &lt;<i>statement</i>&gt; | <br>
182
+ <b>if</b> &lt;<i>expression</i>&gt; <b>then</b> &lt;<i>statement</i>&gt; <b>else</b> &lt;<i>statement</i>&gt;
183
+ </td>
184
+ </tr>
185
+ </table>
186
+ <table>
187
+ <tr valign="top">
188
+ <td> &lt;<i>while statement</i>&gt; <b><code>::=</code></b>
189
+ <td> <b>while</b> &lt;<i>expression</i>&gt; <b>do</b> &lt;<i>statement</i>&gt;
190
+ </td>
191
+ </tr>
192
+ </table>
193
+ <hr>
194
+ <table>
195
+ <tr valign="top">
196
+ <td> &lt;<i>expression</i>&gt; <b><code>::=</code></b>
197
+ <td> &lt;<i>simple expression</i>&gt; | <br>
198
+ &lt;<i>simple expression</i>&gt; &lt;<i>relational operator</i>&gt; &lt;<i>simple expression</i>&gt;
199
+ </td>
200
+ </tr>
201
+ </table>
202
+ <table>
203
+ <tr valign="top">
204
+ <td> &lt;<i>simple expression</i>&gt; <b><code>::=</code></b>
205
+ <td> &lt;<i>sign</i>&gt; &lt;<i>term</i>&gt; { &lt;<i>adding operator</i>&gt; &lt;<i>term</i>&gt; }
206
+ </td>
207
+ </tr>
208
+ </table>
209
+ <table>
210
+ <tr valign="top">
211
+ <td> &lt;<i>term</i>&gt; <b><code>::=</code></b>
212
+ <td> &lt;<i>factor</i>&gt; { &lt;<i>multiplying operator</i>&gt; &lt;<i>factor</i>&gt; }
213
+ </td>
214
+ </tr>
215
+ </table>
216
+ <table>
217
+ <tr valign="top">
218
+ <td> &lt;<i>factor</i>&gt; <b><code>::=</code></b>
219
+ <td> &lt;<i>variable</i>&gt; | &lt;<i>constant</i>&gt; | <b>(</b> &lt;<i>expression</i>&gt; <b>)</b> |
220
+ <b>not</b> &lt;<i>factor</i>&gt;
221
+ </td>
222
+ </tr>
223
+ </table>
224
+ <hr>
225
+ <table>
226
+ <tr valign="top">
227
+ <td> &lt;<i>relational operator</i>&gt; <b><code>::=</code></b>
228
+ <td> <b>=</b> | <b>&lt;&gt;</b> | <b>&lt;</b> | <b>&lt;=</b> | <b>&gt;=</b> | <b>&gt;</b>
229
+ </td>
230
+ </tr>
231
+ </table>
232
+ <table>
233
+ <tr valign="top">
234
+ <td> &lt;<i>sign</i>&gt; <b><code>::=</code></b>
235
+ <td> + | <code>-</code> | &lt;<i>empty</i>&gt;
236
+ </td>
237
+ </tr>
238
+ </table>
239
+ <table>
240
+ <tr valign="top">
241
+ <td> &lt;<i>adding operator</i>&gt; <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> &lt;<i>multiplying operator</i>&gt; <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> &lt;<i>variable</i>&gt; <b><code>::=</code></b>
257
+ <td> &lt;<i>entire variable</i>&gt; | &lt;<i>indexed variable</i>&gt;
258
+ </td>
259
+ </tr>
260
+ </table>
261
+ <table>
262
+ <tr valign="top">
263
+ <td> &lt;<i>indexed variable</i>&gt; <b><code>::=</code></b>
264
+ <td> &lt;<i>array variable</i>&gt; <b>[</b> &lt;<i>expression</i>&gt; <b>]</b>
265
+ </td>
266
+ </tr>
267
+ </table>
268
+ <table>
269
+ <tr valign="top">
270
+ <td> &lt;<i>array variable</i>&gt; <b><code>::=</code></b>
271
+ <td> &lt;<i>entire variable</i>&gt;
272
+ </td>
273
+ </tr>
274
+ </table>
275
+ <table>
276
+ <tr valign="top">
277
+ <td> &lt;<i>entire variable</i>&gt; <b><code>::=</code></b>
278
+ <td> &lt;<i>variable identifier</i>&gt;
279
+ </td>
280
+ </tr>
281
+ </table>
282
+ <table>
283
+ <tr valign="top">
284
+ <td> &lt;<i>variable identifier</i>&gt; <b><code>::=</code></b>
285
+ <td> &lt;<i>identifier</i>&gt;
286
+ </td>
287
+ </tr>
288
+ </table>
289
+ <hr>
290
+ Lexical grammar
291
+ <hr>
292
+ <table>
293
+ <tr valign="top">
294
+ <td> &lt;<i>constant</i>&gt; <b><code>::=</code></b>
295
+ <td> &lt;<i>integer constant</i>&gt; | &lt;<i>character constant</i>&gt; | &lt;<i>constant identifier</i>&gt;
296
+ </td>
297
+ </tr>
298
+ </table>
299
+ <table>
300
+ <tr valign="top">
301
+ <td> &lt;<i>constant identifier</i>&gt; <b><code>::=</code></b>
302
+ <td> &lt;<i>identifier</i>&gt;
303
+ </td>
304
+ </tr>
305
+ </table>
306
+ <table>
307
+ <tr valign="top">
308
+ <td> &lt;<i>identifier</i>&gt; <b><code>::=</code></b>
309
+ <td> &lt;<i>letter</i>&gt; { &lt;<i>letter or digit</i>&gt; }
310
+ </td>
311
+ </tr>
312
+ </table>
313
+ <table>
314
+ <tr valign="top">
315
+ <td> &lt;<i>letter or digit</i>&gt; <b><code>::=</code></b>
316
+ <td> &lt;<i>letter</i>&gt; | &lt;<i>digit</i>&gt;
317
+ </td>
318
+ </tr>
319
+ </table>
320
+ <table>
321
+ <tr valign="top">
322
+ <td> &lt;<i>integer constant</i>&gt; <b><code>::=</code></b>
323
+ <td> &lt;<i>digit</i>&gt; { &lt;<i>digit</i>&gt; }
324
+ </td>
325
+ </tr>
326
+ </table>
327
+ <table>
328
+ <tr valign="top">
329
+ <td> &lt;<i>character constant</i>&gt; <b><code>::=</code></b>
330
+ <td> <b>'</b>&lt;<i> any character other than </i>' &gt;<b>'</b> &nbsp;|&nbsp; <b>''''</b>
331
+ </td>
332
+ </tr>
333
+ </table>
334
+ <table>
335
+ <tr valign="top">
336
+ <td> &lt;<i>letter</i>&gt; <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> &lt;<i>digit</i>&gt; <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> &lt;<i>special symbol</i>&gt; <b><code>::=</code></b>
354
+ <td> + | - | * | = | &lt;&gt; | &lt; | &gt; | &lt;= | &gt;= | <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> &lt;<i>predefined identifier</i>&gt; <b><code>::=</code></b>
365
+ <td> integer | Boolean | true | false
366
+ </td>
367
+ </tr>
368
+ </table>
369
+ <hr>
370
+ </body>
371
+ </html>