racc 1.5.2 → 1.6.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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/README.ja.rdoc +0 -1
  3. data/README.rdoc +6 -7
  4. data/{rdoc → doc}/en/NEWS.en.rdoc +0 -0
  5. data/{rdoc → doc}/en/grammar.en.rdoc +27 -31
  6. data/doc/en/grammar2.en.rdoc +219 -0
  7. data/{rdoc → doc}/ja/NEWS.ja.rdoc +0 -0
  8. data/{rdoc → doc}/ja/command.ja.html +0 -0
  9. data/{rdoc → doc}/ja/debug.ja.rdoc +0 -0
  10. data/{rdoc → doc}/ja/grammar.ja.rdoc +0 -0
  11. data/{rdoc → doc}/ja/index.ja.html +0 -0
  12. data/{rdoc → doc}/ja/parser.ja.rdoc +0 -0
  13. data/{rdoc → doc}/ja/usage.ja.html +0 -0
  14. data/ext/racc/cparse/cparse.c +1 -1
  15. data/ext/racc/cparse/extconf.rb +1 -0
  16. data/lib/racc/info.rb +1 -1
  17. data/lib/racc/parser-text.rb +1 -1
  18. data/lib/racc/parser.rb +1 -1
  19. data/lib/racc/parserfilegenerator.rb +0 -44
  20. data/lib/racc/statetransitiontable.rb +2 -8
  21. metadata +15 -121
  22. data/Rakefile +0 -79
  23. data/ext/racc/com/headius/racc/Cparse.java +0 -849
  24. data/lib/racc/pre-setup +0 -13
  25. data/sample/array.y +0 -67
  26. data/sample/array2.y +0 -59
  27. data/sample/calc-ja.y +0 -66
  28. data/sample/calc.y +0 -65
  29. data/sample/conflict.y +0 -15
  30. data/sample/hash.y +0 -60
  31. data/sample/lalr.y +0 -17
  32. data/sample/lists.y +0 -57
  33. data/sample/syntax.y +0 -46
  34. data/sample/yyerr.y +0 -46
  35. data/test/assets/cadenza.y +0 -170
  36. data/test/assets/cast.y +0 -926
  37. data/test/assets/chk.y +0 -126
  38. data/test/assets/conf.y +0 -16
  39. data/test/assets/csspool.y +0 -729
  40. data/test/assets/digraph.y +0 -29
  41. data/test/assets/echk.y +0 -118
  42. data/test/assets/edtf.y +0 -583
  43. data/test/assets/err.y +0 -60
  44. data/test/assets/error_recovery.y +0 -35
  45. data/test/assets/expect.y +0 -7
  46. data/test/assets/firstline.y +0 -4
  47. data/test/assets/huia.y +0 -318
  48. data/test/assets/ichk.y +0 -102
  49. data/test/assets/intp.y +0 -546
  50. data/test/assets/journey.y +0 -47
  51. data/test/assets/liquor.y +0 -313
  52. data/test/assets/machete.y +0 -423
  53. data/test/assets/macruby.y +0 -2197
  54. data/test/assets/mailp.y +0 -437
  55. data/test/assets/mediacloth.y +0 -599
  56. data/test/assets/mof.y +0 -649
  57. data/test/assets/namae.y +0 -302
  58. data/test/assets/nasl.y +0 -626
  59. data/test/assets/newsyn.y +0 -25
  60. data/test/assets/noend.y +0 -4
  61. data/test/assets/nokogiri-css.y +0 -255
  62. data/test/assets/nonass.y +0 -41
  63. data/test/assets/normal.y +0 -27
  64. data/test/assets/norule.y +0 -4
  65. data/test/assets/nullbug1.y +0 -25
  66. data/test/assets/nullbug2.y +0 -15
  67. data/test/assets/opal.y +0 -1807
  68. data/test/assets/opt.y +0 -123
  69. data/test/assets/percent.y +0 -35
  70. data/test/assets/php_serialization.y +0 -98
  71. data/test/assets/recv.y +0 -97
  72. data/test/assets/riml.y +0 -665
  73. data/test/assets/rrconf.y +0 -14
  74. data/test/assets/ruby18.y +0 -1943
  75. data/test/assets/ruby19.y +0 -2174
  76. data/test/assets/ruby20.y +0 -2350
  77. data/test/assets/ruby21.y +0 -2359
  78. data/test/assets/ruby22.y +0 -2381
  79. data/test/assets/scan.y +0 -72
  80. data/test/assets/syntax.y +0 -50
  81. data/test/assets/tp_plus.y +0 -622
  82. data/test/assets/twowaysql.y +0 -278
  83. data/test/assets/unterm.y +0 -5
  84. data/test/assets/useless.y +0 -12
  85. data/test/assets/yyerr.y +0 -46
  86. data/test/bench.y +0 -36
  87. data/test/helper.rb +0 -115
  88. data/test/infini.y +0 -8
  89. data/test/regress/cadenza +0 -796
  90. data/test/regress/cast +0 -3428
  91. data/test/regress/csspool +0 -2314
  92. data/test/regress/edtf +0 -1794
  93. data/test/regress/huia +0 -1392
  94. data/test/regress/journey +0 -222
  95. data/test/regress/liquor +0 -885
  96. data/test/regress/machete +0 -833
  97. data/test/regress/mediacloth +0 -1463
  98. data/test/regress/mof +0 -1368
  99. data/test/regress/namae +0 -634
  100. data/test/regress/nasl +0 -2058
  101. data/test/regress/nokogiri-css +0 -836
  102. data/test/regress/opal +0 -6431
  103. data/test/regress/php_serialization +0 -336
  104. data/test/regress/riml +0 -3283
  105. data/test/regress/ruby18 +0 -6344
  106. data/test/regress/ruby22 +0 -7460
  107. data/test/regress/tp_plus +0 -1933
  108. data/test/regress/twowaysql +0 -556
  109. data/test/scandata/brace +0 -7
  110. data/test/scandata/gvar +0 -1
  111. data/test/scandata/normal +0 -4
  112. data/test/scandata/percent +0 -18
  113. data/test/scandata/slash +0 -10
  114. data/test/src.intp +0 -34
  115. data/test/start.y +0 -20
  116. data/test/test_chk_y.rb +0 -52
  117. data/test/test_grammar_file_parser.rb +0 -15
  118. data/test/test_racc_command.rb +0 -339
  119. data/test/test_scan_y.rb +0 -52
  120. data/test/testscanner.rb +0 -51
  121. data/web/racc.en.rhtml +0 -42
  122. data/web/racc.ja.rhtml +0 -51
data/test/assets/intp.y DELETED
@@ -1,546 +0,0 @@
1
- #
2
- # intp
3
- #
4
-
5
- class Intp::Parser
6
-
7
- prechigh
8
- nonassoc UMINUS
9
- left '*' '/'
10
- left '+' '-'
11
- nonassoc EQ
12
- preclow
13
-
14
- rule
15
-
16
- program : stmt_list
17
- {
18
- result = RootNode.new( val[0] )
19
- }
20
-
21
- stmt_list :
22
- {
23
- result = []
24
- }
25
- | stmt_list stmt EOL
26
- {
27
- result.push val[1]
28
- }
29
- | stmt_list EOL
30
-
31
- stmt : expr
32
- | assign
33
- | IDENT realprim
34
- {
35
- result = FuncallNode.new( @fname, val[0][0],
36
- val[0][1], [val[1]] )
37
- }
38
- | if_stmt
39
- | while_stmt
40
- | defun
41
-
42
- if_stmt : IF stmt THEN EOL stmt_list else_stmt END
43
- {
44
- result = IfNode.new( @fname, val[0][0],
45
- val[1], val[4], val[5] )
46
- }
47
-
48
- else_stmt : ELSE EOL stmt_list
49
- {
50
- result = val[2]
51
- }
52
- |
53
- {
54
- result = nil
55
- }
56
-
57
- while_stmt: WHILE stmt DO EOL stmt_list END
58
- {
59
- result = WhileNode.new(@fname, val[0][0],
60
- val[1], val[4])
61
- }
62
-
63
- defun : DEF IDENT param EOL stmt_list END
64
- {
65
- result = DefNode.new(@fname, val[0][0], val[1][1],
66
- Function.new(@fname, val[0][0], val[2], val[4]))
67
- }
68
-
69
- param : '(' name_list ')'
70
- {
71
- result = val[1]
72
- }
73
- | '(' ')'
74
- {
75
- result = []
76
- }
77
- |
78
- {
79
- result = []
80
- }
81
-
82
- name_list : IDENT
83
- {
84
- result = [ val[0][1] ]
85
- }
86
- | name_list ',' IDENT
87
- {
88
- result.push val[2][1]
89
- }
90
-
91
- assign : IDENT '=' expr
92
- {
93
- result = AssignNode.new(@fname, val[0][0], val[0][1], val[2])
94
- }
95
-
96
- expr : expr '+' expr
97
- {
98
- result = FuncallNode.new(@fname, val[0].lineno, '+', [val[0], val[2]])
99
- }
100
- | expr '-' expr
101
- {
102
- result = FuncallNode.new(@fname, val[0].lineno, '-', [val[0], val[2]])
103
- }
104
- | expr '*' expr
105
- {
106
- result = FuncallNode.new(@fname, val[0].lineno, '*', [val[0], val[2]])
107
- }
108
- | expr '/' expr
109
- {
110
- result = FuncallNode.new(@fname, val[0].lineno,
111
- '/', [val[0], val[2]])
112
- }
113
- | expr EQ expr
114
- {
115
- result = FuncallNode.new(@fname, val[0].lineno, '==', [val[0], val[2]])
116
- }
117
- | primary
118
-
119
- primary : realprim
120
- | '(' expr ')'
121
- {
122
- result = val[1]
123
- }
124
- | '-' expr =UMINUS
125
- {
126
- result = FuncallNode.new(@fname, val[0][0], '-@', [val[1]])
127
- }
128
-
129
- realprim : IDENT
130
- {
131
- result = VarRefNode.new(@fname, val[0][0],
132
- val[0][1])
133
- }
134
- | NUMBER
135
- {
136
- result = LiteralNode.new(@fname, *val[0])
137
- }
138
- | STRING
139
- {
140
- result = StringNode.new(@fname, *val[0])
141
- }
142
- | TRUE
143
- {
144
- result = LiteralNode.new(@fname, *val[0])
145
- }
146
- | FALSE
147
- {
148
- result = LiteralNode.new(@fname, *val[0])
149
- }
150
- | NIL
151
- {
152
- result = LiteralNode.new(@fname, *val[0])
153
- }
154
- | funcall
155
-
156
- funcall : IDENT '(' args ')'
157
- {
158
- result = FuncallNode.new(@fname, val[0][0], val[0][1], val[2])
159
- }
160
- | IDENT '(' ')'
161
- {
162
- result = FuncallNode.new(@fname, val[0][0], val[0][1], [])
163
- }
164
-
165
- args : expr
166
- {
167
- result = val
168
- }
169
- | args ',' expr
170
- {
171
- result.push val[2]
172
- }
173
-
174
- end
175
-
176
- ---- header
177
- #
178
- # intp/parser.rb
179
- #
180
-
181
- ---- inner
182
-
183
- def initialize
184
- @scope = {}
185
- end
186
-
187
- RESERVED = {
188
- 'if' => :IF,
189
- 'else' => :ELSE,
190
- 'while' => :WHILE,
191
- 'then' => :THEN,
192
- 'do' => :DO,
193
- 'def' => :DEF,
194
- 'true' => :TRUE,
195
- 'false' => :FALSE,
196
- 'nil' => :NIL,
197
- 'end' => :END
198
- }
199
-
200
- RESERVED_V = {
201
- 'true' => true,
202
- 'false' => false,
203
- 'nil' => nil
204
- }
205
-
206
- def parse(f, fname)
207
- @q = []
208
- @fname = fname
209
- lineno = 1
210
- f.each do |line|
211
- line.strip!
212
- until line.empty?
213
- case line
214
- when /\A\s+/, /\A\#.*/
215
- ;
216
- when /\A[a-zA-Z_]\w*/
217
- word = $&
218
- @q.push [(RESERVED[word] || :IDENT),
219
- [lineno, RESERVED_V.key?(word) ? RESERVED_V[word] : word.intern]]
220
- when /\A\d+/
221
- @q.push [:NUMBER, [lineno, $&.to_i]]
222
- when /\A"(?:[^"\\]+|\\.)*"/, /\A'(?:[^'\\]+|\\.)*'/
223
- @q.push [:STRING, [lineno, eval($&)]]
224
- when /\A==/
225
- @q.push [:EQ, [lineno, '==']]
226
- when /\A./
227
- @q.push [$&, [lineno, $&]]
228
- else
229
- raise RuntimeError, 'must not happen'
230
- end
231
- line = $'
232
- end
233
- @q.push [:EOL, [lineno, nil]]
234
- lineno += 1
235
- end
236
- @q.push [false, '$']
237
- do_parse
238
- end
239
-
240
- def next_token
241
- @q.shift
242
- end
243
-
244
- def on_error(t, v, values)
245
- if v
246
- line = v[0]
247
- v = v[1]
248
- else
249
- line = 'last'
250
- end
251
- raise Racc::ParseError, "#{@fname}:#{line}: syntax error on #{v.inspect}"
252
- end
253
-
254
- ---- footer
255
- # intp/node.rb
256
-
257
- module Intp
258
-
259
- class IntpError < StandardError; end
260
- class IntpArgumentError < IntpError; end
261
-
262
- class Core
263
-
264
- def initialize
265
- @ftab = {}
266
- @obj = Object.new
267
- @stack = []
268
- @stack.push Frame.new '(toplevel)'
269
- end
270
-
271
- def frame
272
- @stack[-1]
273
- end
274
-
275
- def define_function(fname, node)
276
- raise IntpError, "function #{fname} defined twice" if @ftab.key?(fname)
277
- @ftab[fname] = node
278
- end
279
-
280
- def call_function_or(fname, args)
281
- call_intp_function_or(fname, args) {
282
- call_ruby_toplevel_or(fname, args) {
283
- yield
284
- }
285
- }
286
- end
287
-
288
- def call_intp_function_or(fname, args)
289
- if func = @ftab[fname]
290
- frame = Frame.new(fname)
291
- @stack.push frame
292
- func.call self, frame, args
293
- @stack.pop
294
- else
295
- yield
296
- end
297
- end
298
-
299
- def call_ruby_toplevel_or(fname, args)
300
- if @obj.respond_to? fname, true
301
- @obj.send fname, *args
302
- else
303
- yield
304
- end
305
- end
306
-
307
- end
308
-
309
- class Frame
310
-
311
- def initialize(fname)
312
- @fname = fname
313
- @lvars = {}
314
- end
315
-
316
- attr :fname
317
-
318
- def lvar?(name)
319
- @lvars.key? name
320
- end
321
-
322
- def [](key)
323
- @lvars[key]
324
- end
325
-
326
- def []=(key, val)
327
- @lvars[key] = val
328
- end
329
-
330
- end
331
-
332
-
333
- class Node
334
-
335
- def initialize(fname, lineno)
336
- @filename = fname
337
- @lineno = lineno
338
- end
339
-
340
- attr_reader :filename
341
- attr_reader :lineno
342
-
343
- def exec_list(intp, nodes)
344
- v = nil
345
- nodes.each {|i| v = i.evaluate(intp) }
346
- v
347
- end
348
-
349
- def intp_error!(msg)
350
- raise IntpError, "in #{filename}:#{lineno}: #{msg}"
351
- end
352
-
353
- def inspect
354
- "#{self.class.name}/#{lineno}"
355
- end
356
-
357
- end
358
-
359
-
360
- class RootNode < Node
361
-
362
- def initialize(tree)
363
- super nil, nil
364
- @tree = tree
365
- end
366
-
367
- def evaluate
368
- exec_list Core.new, @tree
369
- end
370
-
371
- end
372
-
373
-
374
- class DefNode < Node
375
-
376
- def initialize(file, lineno, fname, func)
377
- super file, lineno
378
- @funcname = fname
379
- @funcobj = func
380
- end
381
-
382
- def evaluate(intp)
383
- intp.define_function @funcname, @funcobj
384
- end
385
-
386
- end
387
-
388
- class FuncallNode < Node
389
-
390
- def initialize(file, lineno, func, args)
391
- super file, lineno
392
- @funcname = func
393
- @args = args
394
- end
395
-
396
- def evaluate(intp)
397
- args = @args.map {|i| i.evaluate intp }
398
- begin
399
- intp.call_intp_function_or(@funcname, args) {
400
- if args.empty? or not args[0].respond_to?(@funcname)
401
- intp.call_ruby_toplevel_or(@funcname, args) {
402
- intp_error! "undefined function #{@funcname.id2name}"
403
- }
404
- else
405
- recv = args.shift
406
- recv.send @funcname, *args
407
- end
408
- }
409
- rescue IntpArgumentError, ArgumentError
410
- intp_error! $!.message
411
- end
412
- end
413
-
414
- end
415
-
416
- class Function < Node
417
-
418
- def initialize(file, lineno, params, body)
419
- super file, lineno
420
- @params = params
421
- @body = body
422
- end
423
-
424
- def call(intp, frame, args)
425
- unless args.size == @params.size
426
- raise IntpArgumentError,
427
- "wrong # of arg for #{frame.fname}() (#{args.size} for #{@params.size})"
428
- end
429
- args.each_with_index do |v,i|
430
- frame[@params[i]] = v
431
- end
432
- exec_list intp, @body
433
- end
434
-
435
- end
436
-
437
-
438
- class IfNode < Node
439
-
440
- def initialize(fname, lineno, cond, tstmt, fstmt)
441
- super fname, lineno
442
- @condition = cond
443
- @tstmt = tstmt
444
- @fstmt = fstmt
445
- end
446
-
447
- def evaluate(intp)
448
- if @condition.evaluate(intp)
449
- exec_list intp, @tstmt
450
- else
451
- exec_list intp, @fstmt if @fstmt
452
- end
453
- end
454
-
455
- end
456
-
457
- class WhileNode < Node
458
-
459
- def initialize(fname, lineno, cond, body)
460
- super fname, lineno
461
- @condition = cond
462
- @body = body
463
- end
464
-
465
- def evaluate(intp)
466
- while @condition.evaluate(intp)
467
- exec_list intp, @body
468
- end
469
- end
470
-
471
- end
472
-
473
-
474
- class AssignNode < Node
475
-
476
- def initialize(fname, lineno, vname, val)
477
- super fname, lineno
478
- @vname = vname
479
- @val = val
480
- end
481
-
482
- def evaluate(intp)
483
- intp.frame[@vname] = @val.evaluate(intp)
484
- end
485
-
486
- end
487
-
488
- class VarRefNode < Node
489
-
490
- def initialize(fname, lineno, vname)
491
- super fname, lineno
492
- @vname = vname
493
- end
494
-
495
- def evaluate(intp)
496
- if intp.frame.lvar?(@vname)
497
- intp.frame[@vname]
498
- else
499
- intp.call_function_or(@vname, []) {
500
- intp_error! "unknown method or local variable #{@vname.id2name}"
501
- }
502
- end
503
- end
504
-
505
- end
506
-
507
- class StringNode < Node
508
-
509
- def initialize(fname, lineno, str)
510
- super fname, lineno
511
- @val = str
512
- end
513
-
514
- def evaluate(intp)
515
- @val.dup
516
- end
517
-
518
- end
519
-
520
- class LiteralNode < Node
521
-
522
- def initialize(fname, lineno, val)
523
- super fname, lineno
524
- @val = val
525
- end
526
-
527
- def evaluate(intp)
528
- @val
529
- end
530
-
531
- end
532
-
533
- end # module Intp
534
-
535
- begin
536
- tree = nil
537
- fname = 'src.intp'
538
- File.open(fname) {|f|
539
- tree = Intp::Parser.new.parse(f, fname)
540
- }
541
- tree.evaluate
542
- rescue Racc::ParseError, Intp::IntpError, Errno::ENOENT
543
- raise ####
544
- $stderr.puts "#{File.basename $0}: #{$!}"
545
- exit 1
546
- end
@@ -1,47 +0,0 @@
1
- class Journey::Parser
2
-
3
- token SLASH LITERAL SYMBOL LPAREN RPAREN DOT STAR OR
4
-
5
- rule
6
- expressions
7
- : expressions expression { result = Cat.new(val.first, val.last) }
8
- | expression { result = val.first }
9
- | or
10
- ;
11
- expression
12
- : terminal
13
- | group
14
- | star
15
- ;
16
- group
17
- : LPAREN expressions RPAREN { result = Group.new(val[1]) }
18
- ;
19
- or
20
- : expressions OR expression { result = Or.new([val.first, val.last]) }
21
- ;
22
- star
23
- : STAR { result = Star.new(Symbol.new(val.last)) }
24
- ;
25
- terminal
26
- : symbol
27
- | literal
28
- | slash
29
- | dot
30
- ;
31
- slash
32
- : SLASH { result = Slash.new('/') }
33
- ;
34
- symbol
35
- : SYMBOL { result = Symbol.new(val.first) }
36
- ;
37
- literal
38
- : LITERAL { result = Literal.new(val.first) }
39
- dot
40
- : DOT { result = Dot.new(val.first) }
41
- ;
42
-
43
- end
44
-
45
- ---- header
46
-
47
- require 'journey/parser_extras'