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