racc 1.4.6

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.
Files changed (109) hide show
  1. data/.gitattributes +2 -0
  2. data/.gitignore +7 -0
  3. data/COPYING +515 -0
  4. data/ChangeLog +846 -0
  5. data/DEPENDS +4 -0
  6. data/README.en.rdoc +86 -0
  7. data/README.ja.rdoc +96 -0
  8. data/Rakefile +15 -0
  9. data/TODO +5 -0
  10. data/bin/racc +308 -0
  11. data/bin/racc2y +195 -0
  12. data/bin/y2racc +339 -0
  13. data/doc/en/NEWS.en.rdoc +282 -0
  14. data/doc/en/command.en.html +78 -0
  15. data/doc/en/debug.en.rdoc +20 -0
  16. data/doc/en/grammar.en.rdoc +230 -0
  17. data/doc/en/index.en.html +10 -0
  18. data/doc/en/parser.en.rdoc +74 -0
  19. data/doc/en/usage.en.html +92 -0
  20. data/doc/ja/NEWS.ja.rdoc +307 -0
  21. data/doc/ja/command.ja.html +94 -0
  22. data/doc/ja/debug.ja.rdoc +36 -0
  23. data/doc/ja/grammar.ja.rdoc +348 -0
  24. data/doc/ja/index.ja.html +10 -0
  25. data/doc/ja/parser.ja.rdoc +125 -0
  26. data/doc/ja/usage.ja.html +414 -0
  27. data/ext/racc/cparse/MANIFEST +4 -0
  28. data/ext/racc/cparse/cparse.c +824 -0
  29. data/ext/racc/cparse/depend +1 -0
  30. data/ext/racc/cparse/extconf.rb +7 -0
  31. data/fastcache/extconf.rb +2 -0
  32. data/fastcache/fastcache.c +185 -0
  33. data/lib/racc.rb +6 -0
  34. data/lib/racc/compat.rb +40 -0
  35. data/lib/racc/debugflags.rb +59 -0
  36. data/lib/racc/exception.rb +15 -0
  37. data/lib/racc/grammar.rb +1115 -0
  38. data/lib/racc/grammarfileparser.rb +559 -0
  39. data/lib/racc/info.rb +16 -0
  40. data/lib/racc/iset.rb +91 -0
  41. data/lib/racc/logfilegenerator.rb +214 -0
  42. data/lib/racc/parser.rb +439 -0
  43. data/lib/racc/parserfilegenerator.rb +511 -0
  44. data/lib/racc/pre-setup +13 -0
  45. data/lib/racc/sourcetext.rb +34 -0
  46. data/lib/racc/state.rb +971 -0
  47. data/lib/racc/statetransitiontable.rb +316 -0
  48. data/lib/racc/static.rb +5 -0
  49. data/misc/dist.sh +31 -0
  50. data/sample/array.y +67 -0
  51. data/sample/array2.y +59 -0
  52. data/sample/calc-ja.y +66 -0
  53. data/sample/calc.y +65 -0
  54. data/sample/conflict.y +15 -0
  55. data/sample/hash.y +60 -0
  56. data/sample/lalr.y +17 -0
  57. data/sample/lists.y +57 -0
  58. data/sample/syntax.y +46 -0
  59. data/sample/yyerr.y +46 -0
  60. data/setup.rb +1587 -0
  61. data/tasks/doc.rb +12 -0
  62. data/tasks/email.rb +55 -0
  63. data/tasks/file.rb +37 -0
  64. data/tasks/gem.rb +37 -0
  65. data/tasks/test.rb +16 -0
  66. data/test/assets/chk.y +126 -0
  67. data/test/assets/conf.y +16 -0
  68. data/test/assets/digraph.y +29 -0
  69. data/test/assets/echk.y +118 -0
  70. data/test/assets/err.y +60 -0
  71. data/test/assets/expect.y +7 -0
  72. data/test/assets/firstline.y +4 -0
  73. data/test/assets/ichk.y +102 -0
  74. data/test/assets/intp.y +546 -0
  75. data/test/assets/mailp.y +437 -0
  76. data/test/assets/newsyn.y +25 -0
  77. data/test/assets/noend.y +4 -0
  78. data/test/assets/nonass.y +41 -0
  79. data/test/assets/normal.y +27 -0
  80. data/test/assets/norule.y +4 -0
  81. data/test/assets/nullbug1.y +25 -0
  82. data/test/assets/nullbug2.y +15 -0
  83. data/test/assets/opt.y +123 -0
  84. data/test/assets/percent.y +35 -0
  85. data/test/assets/recv.y +97 -0
  86. data/test/assets/rrconf.y +14 -0
  87. data/test/assets/scan.y +72 -0
  88. data/test/assets/syntax.y +50 -0
  89. data/test/assets/unterm.y +5 -0
  90. data/test/assets/useless.y +12 -0
  91. data/test/assets/yyerr.y +46 -0
  92. data/test/bench.y +36 -0
  93. data/test/helper.rb +88 -0
  94. data/test/infini.y +8 -0
  95. data/test/scandata/brace +7 -0
  96. data/test/scandata/gvar +1 -0
  97. data/test/scandata/normal +4 -0
  98. data/test/scandata/percent +18 -0
  99. data/test/scandata/slash +10 -0
  100. data/test/src.intp +34 -0
  101. data/test/start.y +20 -0
  102. data/test/test_chk_y.rb +51 -0
  103. data/test/test_grammar_file_parser.rb +15 -0
  104. data/test/test_racc_command.rb +155 -0
  105. data/test/test_scan_y.rb +51 -0
  106. data/test/testscanner.rb +51 -0
  107. data/web/racc.en.rhtml +42 -0
  108. data/web/racc.ja.rhtml +51 -0
  109. metadata +166 -0
@@ -0,0 +1,437 @@
1
+ #
2
+ # mailp for test
3
+ #
4
+
5
+ class Testp
6
+
7
+ rule
8
+
9
+ content : DateH datetime { @field.date = val[1] }
10
+ | RecvH received
11
+ | RetpathH returnpath
12
+ | MaddrH addrs { @field.addrs.replace val[1] }
13
+ | SaddrH addr { @field.addr = val[1] }
14
+ | MmboxH mboxes { @field.addrs.replace val[1] }
15
+ | SmboxH mbox { @field.addr = val[1] }
16
+ | MsgidH msgid { @field.msgid = val[1] }
17
+ | KeyH keys { @field.keys.replace val[1] }
18
+ | EncH enc
19
+ | VersionH version
20
+ | CTypeH ctype
21
+ | CEncodingH cencode
22
+ | CDispositionH cdisp
23
+ | Mbox mbox
24
+ {
25
+ mb = val[1]
26
+ @field.phrase = mb.phrase
27
+ @field.setroute mb.route
28
+ @field.local = mb.local
29
+ @field.domain = mb.domain
30
+ }
31
+ | Spec spec
32
+ {
33
+ mb = val[1]
34
+ @field.local = mb.local
35
+ @field.domain = mb.domain
36
+ }
37
+ ;
38
+
39
+ datetime : day DIGIT ATOM DIGIT hour zone
40
+ # 0 1 2 3 4 5
41
+ # day month year
42
+ {
43
+ t = Time.gm( val[3].to_i, val[2], val[1].to_i, 0, 0, 0 )
44
+ result = (t + val[4] - val[5]).localtime
45
+ }
46
+ ;
47
+
48
+ day : /* none */
49
+ | ATOM ','
50
+ ;
51
+
52
+ hour : DIGIT ':' DIGIT
53
+ {
54
+ result = (result.to_i * 60 * 60) + (val[2].to_i * 60)
55
+ }
56
+ | DIGIT ':' DIGIT ':' DIGIT
57
+ {
58
+ result = (result.to_i * 60 * 60) +
59
+ (val[2].to_i * 60)
60
+ + val[4].to_i
61
+ }
62
+ ;
63
+
64
+ zone : ATOM
65
+ {
66
+ result = ::TMail.zonestr2i( val[0] ) * 60
67
+ }
68
+ ;
69
+
70
+ received : from by via with id for recvdatetime
71
+ ;
72
+
73
+ from : /* none */
74
+ | FROM domain
75
+ {
76
+ @field.from = Address.join( val[1] )
77
+ }
78
+ | FROM domain '@' domain
79
+ {
80
+ @field.from = Address.join( val[3] )
81
+ }
82
+ | FROM domain DOMLIT
83
+ {
84
+ @field.from = Address.join( val[1] )
85
+ }
86
+ ;
87
+
88
+ by : /* none */
89
+ | BY domain
90
+ {
91
+ @field.by = Address.join( val[1] )
92
+ }
93
+ ;
94
+
95
+ via : /* none */
96
+ | VIA ATOM
97
+ {
98
+ @field.via = val[1]
99
+ }
100
+ ;
101
+
102
+ with : /* none */
103
+ | WITH ATOM
104
+ {
105
+ @field.with.push val[1]
106
+ }
107
+ ;
108
+
109
+ id : /* none */
110
+ | ID msgid
111
+ {
112
+ @field.msgid = val[1]
113
+ }
114
+ | ID ATOM
115
+ {
116
+ @field.msgid = val[1]
117
+ }
118
+ ;
119
+
120
+ for : /* none */
121
+ | FOR addr
122
+ {
123
+ @field.for_ = val[1].address
124
+ }
125
+ ;
126
+
127
+ recvdatetime
128
+ : /* none */
129
+ | ';' datetime
130
+ {
131
+ @field.date = val[1]
132
+ }
133
+ ;
134
+
135
+ returnpath: '<' '>'
136
+ | routeaddr
137
+ {
138
+ @field.route.replace result.route
139
+ @field.addr = result.addr
140
+ }
141
+ ;
142
+
143
+ addrs : addr { result = val }
144
+ | addrs ',' addr { result.push val[2] }
145
+ ;
146
+
147
+ addr : mbox
148
+ | group
149
+ ;
150
+
151
+ mboxes : mbox
152
+ {
153
+ result = val
154
+ }
155
+ | mboxes ',' mbox
156
+ {
157
+ result.push val[2]
158
+ }
159
+ ;
160
+
161
+ mbox : spec
162
+ | routeaddr
163
+ | phrase routeaddr
164
+ {
165
+ val[1].phrase = HFdecoder.decode( result )
166
+ result = val[1]
167
+ }
168
+ ;
169
+
170
+ group : phrase ':' mboxes ';'
171
+ {
172
+ result = AddressGroup.new( result, val[2] )
173
+ }
174
+ # | phrase ':' ';' { result = AddressGroup.new( result ) }
175
+ ;
176
+
177
+ routeaddr : '<' route spec '>'
178
+ {
179
+ result = val[2]
180
+ result.route = val[1]
181
+ }
182
+ | '<' spec '>'
183
+ {
184
+ result = val[1]
185
+ }
186
+ ;
187
+
188
+ route : at_domains ':'
189
+ ;
190
+
191
+ at_domains: '@' domain { result = [ val[1] ] }
192
+ | at_domains ',' '@' domain { result.push val[3] }
193
+ ;
194
+
195
+ spec : local '@' domain { result = Address.new( val[0], val[2] ) }
196
+ | local { result = Address.new( result, nil ) }
197
+ ;
198
+
199
+ local : word { result = val }
200
+ | local '.' word { result.push val[2] }
201
+ ;
202
+
203
+ domain : domword { result = val }
204
+ | domain '.' domword { result.push val[2] }
205
+ ;
206
+
207
+ domword : atom
208
+ | DOMLIT
209
+ | DIGIT
210
+ ;
211
+
212
+ msgid : '<' spec '>'
213
+ {
214
+ val[1] = val[1].addr
215
+ result = val.join('')
216
+ }
217
+ ;
218
+
219
+ phrase : word
220
+ | phrase word { result << ' ' << val[1] }
221
+ ;
222
+
223
+ word : atom
224
+ | QUOTED
225
+ | DIGIT
226
+ ;
227
+
228
+ keys : phrase
229
+ | keys ',' phrase
230
+ ;
231
+
232
+ enc : word
233
+ {
234
+ @field.encrypter = val[0]
235
+ }
236
+ | word word
237
+ {
238
+ @field.encrypter = val[0]
239
+ @field.keyword = val[1]
240
+ }
241
+ ;
242
+
243
+ version : DIGIT '.' DIGIT
244
+ {
245
+ @field.major = val[0].to_i
246
+ @field.minor = val[2].to_i
247
+ }
248
+ ;
249
+
250
+ ctype : TOKEN '/' TOKEN params
251
+ {
252
+ @field.main = val[0]
253
+ @field.sub = val[2]
254
+ }
255
+ | TOKEN params
256
+ {
257
+ @field.main = val[0]
258
+ @field.sub = ''
259
+ }
260
+ ;
261
+
262
+ params : /* none */
263
+ | params ';' TOKEN '=' value
264
+ {
265
+ @field.params[ val[2].downcase ] = val[4]
266
+ }
267
+ ;
268
+
269
+ value : TOKEN
270
+ | QUOTED
271
+ ;
272
+
273
+ cencode : TOKEN
274
+ {
275
+ @field.encoding = val[0]
276
+ }
277
+ ;
278
+
279
+ cdisp : TOKEN disp_params
280
+ {
281
+ @field.disposition = val[0]
282
+ }
283
+ ;
284
+
285
+ disp_params
286
+ : /* none */
287
+ | disp_params ';' disp_param
288
+ ;
289
+
290
+ disp_param: /* none */
291
+ | TOKEN '=' value
292
+ {
293
+ @field.params[ val[0].downcase ] = val[2]
294
+ }
295
+ ;
296
+
297
+ atom : ATOM
298
+ | FROM
299
+ | BY
300
+ | VIA
301
+ | WITH
302
+ | ID
303
+ | FOR
304
+ ;
305
+
306
+ end
307
+
308
+
309
+ ---- header
310
+ #
311
+ # mailp for test
312
+ #
313
+
314
+ require 'tmail/mails'
315
+
316
+
317
+ module TMail
318
+
319
+ ---- inner
320
+
321
+ MAILP_DEBUG = false
322
+
323
+ def initialize
324
+ self.debug = MAILP_DEBUG
325
+ end
326
+
327
+ def debug=( flag )
328
+ @yydebug = flag && Racc_debug_parser
329
+ @scanner_debug = flag
330
+ end
331
+
332
+ def debug
333
+ @yydebug
334
+ end
335
+
336
+
337
+ def Mailp.parse( str, obj, ident )
338
+ new.parse( str, obj, ident )
339
+ end
340
+
341
+
342
+ NATIVE_ROUTINE = {
343
+ 'TMail::MsgidH' => :msgid_parse,
344
+ 'TMail::RefH' => :refs_parse
345
+ }
346
+
347
+ def parse( str, obj, ident )
348
+ return if /\A\s*\z/ === str
349
+
350
+ @field = obj
351
+
352
+ if mid = NATIVE_ROUTINE[ obj.type.name ] then
353
+ send mid, str
354
+ else
355
+ unless ident then
356
+ ident = obj.type.name.split('::')[-1].to_s
357
+ cmt = []
358
+ obj.comments.replace cmt
359
+ else
360
+ cmt = nil
361
+ end
362
+
363
+ @scanner = MailScanner.new( str, ident, cmt )
364
+ @scanner.debug = @scanner_debug
365
+ @first = [ ident.intern, ident ]
366
+ @pass_array = [nil, nil]
367
+
368
+ do_parse
369
+ end
370
+ end
371
+
372
+
373
+ private
374
+
375
+
376
+ def next_token
377
+ if @first then
378
+ ret = @first
379
+ @first = nil
380
+ ret
381
+ else
382
+ @scanner.scan @pass_array
383
+ end
384
+ end
385
+
386
+ def on_error( tok, val, vstack )
387
+ raise ParseError,
388
+ "\nparse error in '#{@field.name}' header, on token #{val.inspect}"
389
+ end
390
+
391
+
392
+
393
+ def refs_parse( str )
394
+ arr = []
395
+
396
+ while mdata = ::TMail::MSGID.match( str ) do
397
+ str = mdata.post_match
398
+
399
+ pre = mdata.pre_match
400
+ pre.strip!
401
+ proc_phrase pre, arr unless pre.empty?
402
+ arr.push mdata.to_s
403
+ end
404
+ str.strip!
405
+ proc_phrase str, arr if not pre or pre.empty?
406
+
407
+ @field.refs.replace arr
408
+ end
409
+
410
+ def proc_phrase( str, arr )
411
+ while mdata = /"([^\\]*(?:\\.[^"\\]*)*)"/.match( str ) do
412
+ str = mdata.post_match
413
+
414
+ pre = mdata.pre_match
415
+ pre.strip!
416
+ arr.push pre unless pre.empty?
417
+ arr.push mdata[1]
418
+ end
419
+ str.strip!
420
+ arr.push unless str.empty?
421
+ end
422
+
423
+
424
+ def msgid_parse( str )
425
+ if mdata = ::TMail::MSGID.match( str ) then
426
+ @field.msgid = mdata.to_s
427
+ else
428
+ raise ParseError, "wrong Message-ID format: #{str}"
429
+ end
430
+ end
431
+
432
+ ---- footer
433
+
434
+ end # module TMail
435
+
436
+ mp = TMail::Testp.new
437
+ mp.parse
@@ -0,0 +1,25 @@
1
+
2
+ class A
3
+
4
+ preclow
5
+ left preclow prechigh right left nonassoc token
6
+ right preclow prechigh right left nonassoc token
7
+ nonassoc preclow prechigh right left nonassoc token
8
+ prechigh
9
+
10
+ convert
11
+ left 'a'
12
+ right 'b'
13
+ preclow 'c'
14
+ nonassoc 'd'
15
+ preclow 'e'
16
+ prechigh 'f'
17
+ end
18
+
19
+ rule
20
+
21
+ left: right nonassoc preclow prechigh
22
+
23
+ right: A B C
24
+
25
+ end