abnf 0.0.1

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,28 @@
1
+ require 'abnf/abnf'
2
+ require 'abnf/parser'
3
+
4
+ class ABNF
5
+ CoreRules = ABNF.parse(<<'End', true) # taken from RFC 2234
6
+ ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
7
+ BIT = "0" / "1"
8
+ CHAR = %x01-7F ; any 7-bit US-ASCII character, excluding NUL
9
+ CR = %x0D ; carriage return
10
+ CRLF = CR LF ; Internet standard newline
11
+ CTL = %x00-1F / %x7F ; controls
12
+ DIGIT = %x30-39 ; 0-9
13
+ DQUOTE = %x22 ; " (Double Quote)
14
+ HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
15
+ HTAB = %x09 ; horizontal tab
16
+ LF = %x0A ; linefeed
17
+ LWSP = *(WSP / CRLF WSP) ; linear white space (past newline)
18
+ OCTET = %x00-FF ; 8 bits of data
19
+ SP = %x20
20
+ VCHAR = %x21-7E ; visible (printing) characters
21
+ WSP = SP / HTAB ; white space
22
+ End
23
+ end
24
+
25
+ if $0 == __FILE__
26
+ require 'pp'
27
+ pp ABNF::CoreRules
28
+ end
@@ -0,0 +1,183 @@
1
+ require 'natset'
2
+
3
+ class ABNF
4
+ class Elt
5
+ # A variable is assumed as not empty set.
6
+ def empty_set?
7
+ false
8
+ end
9
+
10
+ # A variable is assumed as not empty sequence.
11
+ def empty_sequence?
12
+ false
13
+ end
14
+
15
+ def +(other)
16
+ Seq.new(self, other)
17
+ end
18
+
19
+ def |(other)
20
+ Alt.new(self, other)
21
+ end
22
+
23
+ def *(n)
24
+ case n
25
+ when Integer
26
+ rep(n, n)
27
+ when Range
28
+ rep(n.first, n.last - (n.exclude_end? ? 1 : 0))
29
+ else
30
+ raise TypeError.new("Integer or Range expected: #{n}")
31
+ end
32
+ end
33
+
34
+ def rep(min=0, max=nil, greedy=true)
35
+ Rep.new(self, min, max, greedy)
36
+ end
37
+ end
38
+
39
+ class Alt < Elt
40
+ class << Alt
41
+ alias _new new
42
+ end
43
+
44
+ def Alt.new(*elts)
45
+ elts2 = []
46
+ elts.each {|e|
47
+ if e.empty_set?
48
+ next
49
+ elsif Alt === e
50
+ elts2.concat e.elts
51
+ elsif Term === e
52
+ if Term === elts2.last
53
+ elts2[-1] = Term.new(elts2.last.natset + e.natset)
54
+ else
55
+ elts2 << e
56
+ end
57
+ else
58
+ elts2 << e
59
+ end
60
+ }
61
+ case elts2.length
62
+ when 0; EmptySet
63
+ when 1; elts2.first
64
+ else; Alt._new(*elts2)
65
+ end
66
+ end
67
+
68
+ def initialize(*elts)
69
+ @elts = elts
70
+ end
71
+ attr_reader :elts
72
+
73
+ def empty_set?
74
+ @elts.empty?
75
+ end
76
+
77
+ def each_var(&block) @elts.each {|elt| elt.each_var(&block)} end
78
+ def subst_var(&block) Alt.new(*@elts.map {|elt| elt.subst_var(&block)}) end
79
+ end
80
+ EmptySet = Alt._new
81
+
82
+ class Seq < Elt
83
+ class << Seq
84
+ alias _new new
85
+ end
86
+
87
+ def Seq.new(*elts)
88
+ elts2 = []
89
+ elts.each {|e|
90
+ if e.empty_sequence?
91
+ next
92
+ elsif Seq === e
93
+ elts2.concat e.elts
94
+ elsif e.empty_set?
95
+ return EmptySet
96
+ else
97
+ elts2 << e
98
+ end
99
+ }
100
+ case elts2.length
101
+ when 0; EmptySequence
102
+ when 1; elts2.first
103
+ else; Seq._new(*elts2)
104
+ end
105
+ end
106
+
107
+ def initialize(*elts)
108
+ @elts = elts
109
+ end
110
+ attr_reader :elts
111
+
112
+ def empty_sequence?
113
+ @elts.empty?
114
+ end
115
+
116
+ def each_var(&block) @elts.each {|elt| elt.each_var(&block)} end
117
+ def subst_var(&block) Seq.new(*@elts.map {|elt| elt.subst_var(&block)}) end
118
+ end
119
+ EmptySequence = Seq._new
120
+
121
+ class Rep < Elt
122
+ class << Rep
123
+ alias _new new
124
+ end
125
+
126
+ def Rep.new(elt, min=0, max=nil, greedy=true)
127
+ return EmptySequence if min == 0 && max == 0
128
+ return elt if min == 1 && max == 1
129
+ return EmptySequence if elt.empty_sequence?
130
+ if elt.empty_set?
131
+ return min == 0 ? EmptySequence : EmptySet
132
+ end
133
+ Rep._new(elt, min, max, greedy)
134
+ end
135
+
136
+ def initialize(elt, min=0, max=nil, greedy=true)
137
+ @elt = elt
138
+ @min = min
139
+ @max = max
140
+ @greedy = greedy
141
+ end
142
+ attr_reader :elt, :min, :max, :greedy
143
+
144
+ def each_var(&block) @elt.each_var(&block) end
145
+ def subst_var(&block) Rep.new(@elt.subst_var(&block), min, max, greedy) end
146
+ end
147
+
148
+ class Var < Elt
149
+ def initialize(name)
150
+ @name = name
151
+ end
152
+ attr_reader :name
153
+
154
+ def each_var(&block) yield @name end
155
+ def subst_var(&block) yield(@name) || self end
156
+ end
157
+
158
+ class Term < Elt
159
+ class << Term
160
+ alias _new new
161
+ end
162
+
163
+ def Term.new(natset)
164
+ if natset.empty?
165
+ EmptySet
166
+ else
167
+ Term._new(natset)
168
+ end
169
+ end
170
+
171
+ def initialize(natset)
172
+ @natset = natset
173
+ end
174
+ attr_reader :natset
175
+
176
+ def empty_set?
177
+ @natset.empty?
178
+ end
179
+
180
+ def each_var(&block) end
181
+ def subst_var(&block) self end
182
+ end
183
+ end
@@ -0,0 +1,348 @@
1
+
2
+
3
+ -------- Grammar --------
4
+
5
+ rule 1 rulelist:
6
+ rule 2 rulelist: rulelist rule
7
+ rule 3 rule: defname assign alt
8
+ rule 4 alt: seq
9
+ rule 5 alt: alt altop seq
10
+ rule 6 seq: rep
11
+ rule 7 seq: seq rep
12
+ rule 8 rep: element
13
+ rule 9 rep: repeat element
14
+ rule 10 repeat: repop
15
+ rule 11 repeat: repop int
16
+ rule 12 repeat: int
17
+ rule 13 repeat: int repop
18
+ rule 14 repeat: int repop int
19
+ rule 15 element: name
20
+ rule 16 element: lparen alt rparen
21
+ rule 17 element: lbracket alt rbracket
22
+ rule 18 element: val
23
+
24
+ ------- Symbols -------
25
+
26
+ **Nonterminals, with rules where they appear
27
+
28
+ $start (13)
29
+ on right:
30
+ on left :
31
+ rulelist (14)
32
+ on right: 2
33
+ on left : 1 2
34
+ rule (15)
35
+ on right: 2
36
+ on left : 3
37
+ alt (16)
38
+ on right: 3 5 16 17
39
+ on left : 4 5
40
+ seq (17)
41
+ on right: 4 5 7
42
+ on left : 6 7
43
+ rep (18)
44
+ on right: 6 7
45
+ on left : 8 9
46
+ element (19)
47
+ on right: 8 9
48
+ on left : 15 16 17 18
49
+ repeat (20)
50
+ on right: 9
51
+ on left : 10 11 12 13 14
52
+
53
+ **Terminals, with rules where they appear
54
+
55
+ $end (0)
56
+ error (1)
57
+ defname (2) 3
58
+ assign (3) 3
59
+ altop (4) 5
60
+ repop (5) 10 11 13 14
61
+ int (6) 11 12 13 14
62
+ name (7) 15
63
+ lparen (8) 16
64
+ rparen (9) 16
65
+ lbracket (10) 17
66
+ rbracket (11) 17
67
+ val (12) 18
68
+
69
+ --------- State ---------
70
+
71
+ state 0
72
+
73
+
74
+ $default reduce using rule 1 (rulelist)
75
+
76
+ rulelist go to state 1
77
+
78
+ state 1
79
+
80
+ 2) rulelist : rulelist _ rule
81
+
82
+ $end shift, and go to state 2
83
+ defname shift, and go to state 4
84
+
85
+ rule go to state 3
86
+
87
+ state 2
88
+
89
+
90
+ $end shift, and go to state 5
91
+
92
+
93
+ state 3
94
+
95
+ 2) rulelist : rulelist rule _
96
+
97
+ $default reduce using rule 2 (rulelist)
98
+
99
+
100
+ state 4
101
+
102
+ 3) rule : defname _ assign alt
103
+
104
+ assign shift, and go to state 6
105
+
106
+
107
+ state 5
108
+
109
+
110
+ $default accept
111
+
112
+
113
+ state 6
114
+
115
+ 3) rule : defname assign _ alt
116
+
117
+ repop shift, and go to state 12
118
+ int shift, and go to state 13
119
+ name shift, and go to state 14
120
+ lparen shift, and go to state 15
121
+ lbracket shift, and go to state 16
122
+ val shift, and go to state 17
123
+
124
+ alt go to state 7
125
+ seq go to state 8
126
+ rep go to state 9
127
+ element go to state 10
128
+ repeat go to state 11
129
+
130
+ state 7
131
+
132
+ 3) rule : defname assign alt _
133
+ 5) alt : alt _ altop seq
134
+
135
+ altop shift, and go to state 18
136
+ $default reduce using rule 3 (rule)
137
+
138
+
139
+ state 8
140
+
141
+ 4) alt : seq _
142
+ 7) seq : seq _ rep
143
+
144
+ repop shift, and go to state 12
145
+ int shift, and go to state 13
146
+ name shift, and go to state 14
147
+ lparen shift, and go to state 15
148
+ lbracket shift, and go to state 16
149
+ val shift, and go to state 17
150
+ $default reduce using rule 4 (alt)
151
+
152
+ rep go to state 19
153
+ element go to state 10
154
+ repeat go to state 11
155
+
156
+ state 9
157
+
158
+ 6) seq : rep _
159
+
160
+ $default reduce using rule 6 (seq)
161
+
162
+
163
+ state 10
164
+
165
+ 8) rep : element _
166
+
167
+ $default reduce using rule 8 (rep)
168
+
169
+
170
+ state 11
171
+
172
+ 9) rep : repeat _ element
173
+
174
+ name shift, and go to state 14
175
+ lparen shift, and go to state 15
176
+ lbracket shift, and go to state 16
177
+ val shift, and go to state 17
178
+
179
+ element go to state 20
180
+
181
+ state 12
182
+
183
+ 10) repeat : repop _
184
+ 11) repeat : repop _ int
185
+
186
+ int shift, and go to state 21
187
+ $default reduce using rule 10 (repeat)
188
+
189
+
190
+ state 13
191
+
192
+ 12) repeat : int _
193
+ 13) repeat : int _ repop
194
+ 14) repeat : int _ repop int
195
+
196
+ repop shift, and go to state 22
197
+ $default reduce using rule 12 (repeat)
198
+
199
+
200
+ state 14
201
+
202
+ 15) element : name _
203
+
204
+ $default reduce using rule 15 (element)
205
+
206
+
207
+ state 15
208
+
209
+ 16) element : lparen _ alt rparen
210
+
211
+ repop shift, and go to state 12
212
+ int shift, and go to state 13
213
+ name shift, and go to state 14
214
+ lparen shift, and go to state 15
215
+ lbracket shift, and go to state 16
216
+ val shift, and go to state 17
217
+
218
+ seq go to state 8
219
+ alt go to state 23
220
+ rep go to state 9
221
+ element go to state 10
222
+ repeat go to state 11
223
+
224
+ state 16
225
+
226
+ 17) element : lbracket _ alt rbracket
227
+
228
+ repop shift, and go to state 12
229
+ int shift, and go to state 13
230
+ name shift, and go to state 14
231
+ lparen shift, and go to state 15
232
+ lbracket shift, and go to state 16
233
+ val shift, and go to state 17
234
+
235
+ seq go to state 8
236
+ alt go to state 24
237
+ rep go to state 9
238
+ element go to state 10
239
+ repeat go to state 11
240
+
241
+ state 17
242
+
243
+ 18) element : val _
244
+
245
+ $default reduce using rule 18 (element)
246
+
247
+
248
+ state 18
249
+
250
+ 5) alt : alt altop _ seq
251
+
252
+ repop shift, and go to state 12
253
+ int shift, and go to state 13
254
+ name shift, and go to state 14
255
+ lparen shift, and go to state 15
256
+ lbracket shift, and go to state 16
257
+ val shift, and go to state 17
258
+
259
+ seq go to state 25
260
+ rep go to state 9
261
+ element go to state 10
262
+ repeat go to state 11
263
+
264
+ state 19
265
+
266
+ 7) seq : seq rep _
267
+
268
+ $default reduce using rule 7 (seq)
269
+
270
+
271
+ state 20
272
+
273
+ 9) rep : repeat element _
274
+
275
+ $default reduce using rule 9 (rep)
276
+
277
+
278
+ state 21
279
+
280
+ 11) repeat : repop int _
281
+
282
+ $default reduce using rule 11 (repeat)
283
+
284
+
285
+ state 22
286
+
287
+ 13) repeat : int repop _
288
+ 14) repeat : int repop _ int
289
+
290
+ int shift, and go to state 26
291
+ $default reduce using rule 13 (repeat)
292
+
293
+
294
+ state 23
295
+
296
+ 5) alt : alt _ altop seq
297
+ 16) element : lparen alt _ rparen
298
+
299
+ altop shift, and go to state 18
300
+ rparen shift, and go to state 27
301
+
302
+
303
+ state 24
304
+
305
+ 5) alt : alt _ altop seq
306
+ 17) element : lbracket alt _ rbracket
307
+
308
+ altop shift, and go to state 18
309
+ rbracket shift, and go to state 28
310
+
311
+
312
+ state 25
313
+
314
+ 5) alt : alt altop seq _
315
+ 7) seq : seq _ rep
316
+
317
+ repop shift, and go to state 12
318
+ int shift, and go to state 13
319
+ name shift, and go to state 14
320
+ lparen shift, and go to state 15
321
+ lbracket shift, and go to state 16
322
+ val shift, and go to state 17
323
+ $default reduce using rule 5 (alt)
324
+
325
+ rep go to state 19
326
+ element go to state 10
327
+ repeat go to state 11
328
+
329
+ state 26
330
+
331
+ 14) repeat : int repop int _
332
+
333
+ $default reduce using rule 14 (repeat)
334
+
335
+
336
+ state 27
337
+
338
+ 16) element : lparen alt rparen _
339
+
340
+ $default reduce using rule 16 (element)
341
+
342
+
343
+ state 28
344
+
345
+ 17) element : lbracket alt rbracket _
346
+
347
+ $default reduce using rule 17 (element)
348
+