ruby_parser 3.0.0.a8 → 3.0.0.a9
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.
Potentially problematic release.
This version of ruby_parser might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/.autotest +6 -0
- data/History.txt +40 -0
- data/README.txt +6 -11
- data/Rakefile +5 -0
- data/bin/ruby_parse_extract_error +23 -6
- data/lib/ruby18_parser.rb +18 -8
- data/lib/ruby18_parser.y +18 -8
- data/lib/ruby19_parser.rb +67 -35
- data/lib/ruby19_parser.y +62 -32
- data/lib/ruby_lexer.rb +84 -95
- data/lib/ruby_parser_extras.rb +140 -20
- data/test/test_ruby_lexer.rb +58 -3
- data/test/test_ruby_parser.rb +193 -2
- data/test/test_ruby_parser_extras.rb +109 -0
- metadata +17 -22
- metadata.gz.sig +5 -2
data.tar.gz.sig
CHANGED
Binary file
|
data/.autotest
CHANGED
@@ -13,6 +13,12 @@ Autotest.add_hook :initialize do |at|
|
|
13
13
|
at.add_exception '.diff'
|
14
14
|
at.add_exception 'rubycorpus'
|
15
15
|
|
16
|
+
dirs = Dir["corpus*"] + Dir["gauntlet*"]
|
17
|
+
|
18
|
+
dirs.each do |f|
|
19
|
+
at.add_exception f
|
20
|
+
end
|
21
|
+
|
16
22
|
at.libs << ':../../minitest/dev/lib'
|
17
23
|
at.testlib = "minitest/autorun"
|
18
24
|
|
data/History.txt
CHANGED
@@ -1,3 +1,43 @@
|
|
1
|
+
=== 3.0.0.a9 / 2012-10-22
|
2
|
+
|
3
|
+
Holy crap! I've hit a 99.92% success rate against 558k files! 492
|
4
|
+
failed parses to go. NOW is the time to start testing ruby_parser
|
5
|
+
against your code!
|
6
|
+
|
7
|
+
* 16 minor enhancements:
|
8
|
+
|
9
|
+
* 1.9 parser: Finished magic encoding and utf-8 bom support.
|
10
|
+
* 1.9: Added leading dot support eg "a\n.b".
|
11
|
+
* 1.9: Added partial handling for *arg and opt=val args in block args.
|
12
|
+
* 1.9: OMFG Encoding is the worst thing ever. Overhauled encoding support once again. It is much better at doing last ditch guessing of the encoding of the source file.
|
13
|
+
* 1.9: added String#grep for legacy support.
|
14
|
+
* Added Sexp#block_pass?
|
15
|
+
* Added ability to delete slow files when they timeout.
|
16
|
+
* Added block_dup_check and refactored grammar code to use it for block arg handling.
|
17
|
+
* Added in_lex_state?(*states) to clean up lexer code.
|
18
|
+
* Added tentative support for optional block args. THIS IS SUBJECT TO CHANGE!!
|
19
|
+
* Added toggleable debugging to StackState to make my life easier
|
20
|
+
* All untested uses have not moved but have been laced with poison.
|
21
|
+
* Finally got good tests for most forms of double-block arg errors.
|
22
|
+
* Moved all _known_ uses of SyntaxError to RubyParser::SyntaxError
|
23
|
+
* f_block_optarg now always returns a block node.
|
24
|
+
* ruby_parse_extract_error uses Find.find instead of globbing so dot files aren't missed.
|
25
|
+
|
26
|
+
* 12 bug fixes:
|
27
|
+
|
28
|
+
* 1.9: Completely ignore IndexError in unread_many because... you know... it sucks.
|
29
|
+
* 1.9: Fixed lex state after lexing ? in trinary.
|
30
|
+
* 1.9: Fixed lex state in some ternarys.
|
31
|
+
* 1.9: Fixed parsing of "1 ? b('') : 2\na d: 3"... ARE YOU NOT GLAD?!?!
|
32
|
+
* Fix Timeout differences between 1.8 and 1.9 :(
|
33
|
+
* Fixed emacs-style encodings to deal with no whitespace.
|
34
|
+
* Fixed error message for bad % codes. (whitequark)
|
35
|
+
* Fixed lexing of :a==>b vs :a===b vs :a==>b. P.S. Your space bar is broken. chump.
|
36
|
+
* Fixed lexing of rare numeric formats.
|
37
|
+
* Fixed magic comment encodings on DOS files ... :/
|
38
|
+
* Fixed ruby_parse_extract_error to exit non-zero on errors.
|
39
|
+
* Removed Symbol#is_argument and switch usage to is_arg?
|
40
|
+
|
1
41
|
=== 3.0.0.a8 / 2012-09-26
|
2
42
|
|
3
43
|
* 1 bug fix:
|
data/README.txt
CHANGED
@@ -13,24 +13,19 @@ base types.
|
|
13
13
|
|
14
14
|
As an example:
|
15
15
|
|
16
|
-
def conditional1
|
17
|
-
if arg1 == 0
|
18
|
-
return 1
|
19
|
-
end
|
16
|
+
def conditional1 arg1
|
17
|
+
return 1 if arg1 == 0
|
20
18
|
return 0
|
21
19
|
end
|
22
20
|
|
23
21
|
becomes:
|
24
22
|
|
25
|
-
s(:defn, :conditional1,
|
26
|
-
|
27
|
-
|
28
|
-
s(:block,
|
29
|
-
s(:if,
|
30
|
-
s(:call, s(:lvar, :arg1), :==, s(:arglist, s(:lit, 0))),
|
23
|
+
s(:defn, :conditional1, s(:args, :arg1),
|
24
|
+
s(:if,
|
25
|
+
s(:call, s(:lvar, :arg1), :==, s(:lit, 0)),
|
31
26
|
s(:return, s(:lit, 1)),
|
32
27
|
nil),
|
33
|
-
|
28
|
+
s(:return, s(:lit, 0)))
|
34
29
|
|
35
30
|
== FEATURES/PROBLEMS:
|
36
31
|
|
data/Rakefile
CHANGED
@@ -171,6 +171,11 @@ task :debug => :isolate do
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
174
|
+
task :debug_ruby do
|
175
|
+
file = ENV["F"] || ENV["FILE"]
|
176
|
+
sh "ruby19 -cwy #{file} 2>&1 | ./yuck.rb"
|
177
|
+
end
|
178
|
+
|
174
179
|
task :extract => :isolate do
|
175
180
|
ENV["V"] ||= "19"
|
176
181
|
Rake.application[:parser].invoke # this way we can have DEBUG set
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
$d ||= false
|
4
4
|
$d ||= ENV["DELETE"]
|
5
|
+
$t ||= false
|
6
|
+
$t ||= ENV["DELETE_TIMEOUT"]
|
5
7
|
$q ||= false
|
6
8
|
$q ||= ENV["QUIET"]
|
7
9
|
|
@@ -13,6 +15,9 @@ ARGV.push "-" if ARGV.empty?
|
|
13
15
|
class Racc::Parser
|
14
16
|
def extract_defs
|
15
17
|
ss = lexer.src
|
18
|
+
|
19
|
+
raise "can't access source. possible encoding issue" unless ss
|
20
|
+
|
16
21
|
src = ss.string
|
17
22
|
pre_error = src[0...ss.pos]
|
18
23
|
|
@@ -43,7 +48,15 @@ end
|
|
43
48
|
|
44
49
|
def expand path
|
45
50
|
if File.directory? path then
|
46
|
-
|
51
|
+
require 'find'
|
52
|
+
|
53
|
+
files = []
|
54
|
+
|
55
|
+
Find.find(*Dir[path]) do |f|
|
56
|
+
files << f if File.file? f
|
57
|
+
end
|
58
|
+
|
59
|
+
files
|
47
60
|
else
|
48
61
|
Dir.glob path
|
49
62
|
end
|
@@ -52,8 +65,6 @@ end
|
|
52
65
|
def process_error parser
|
53
66
|
defs = parser.extract_defs
|
54
67
|
|
55
|
-
orig_size = defs.size
|
56
|
-
|
57
68
|
if parser.retest_for_errors defs then
|
58
69
|
warn "Can't reproduce error with just methods, punting..."
|
59
70
|
return
|
@@ -70,7 +81,7 @@ def process_error parser
|
|
70
81
|
end
|
71
82
|
end
|
72
83
|
rescue RuntimeError, Racc::ParseError => e
|
73
|
-
warn "# error: #{e.message.strip}"
|
84
|
+
warn "# process error: #{e.message.strip}"
|
74
85
|
end
|
75
86
|
|
76
87
|
def process file
|
@@ -81,17 +92,21 @@ def process file
|
|
81
92
|
parser.process(ruby, file)
|
82
93
|
warn "good"
|
83
94
|
File.unlink file if $d
|
95
|
+
rescue Timeout::Error
|
96
|
+
$exit = 1
|
97
|
+
warn "TIMEOUT parsing #{file}. Skipping."
|
98
|
+
File.unlink file if $t
|
84
99
|
rescue StandardError, SyntaxError, Racc::ParseError => e
|
100
|
+
$exit = 1
|
85
101
|
warn ""
|
86
102
|
warn "# error: #{e.message.strip}" unless $q
|
87
103
|
warn ""
|
88
104
|
return if $q
|
89
105
|
|
90
106
|
process_error parser
|
91
|
-
rescue Timeout::Error
|
92
|
-
warn "TIMEOUT parsing #{file}. Skipping."
|
93
107
|
end
|
94
108
|
|
109
|
+
$exit = 0
|
95
110
|
$stdout.sync = true
|
96
111
|
|
97
112
|
ARGV.each do |path|
|
@@ -100,3 +115,5 @@ ARGV.each do |path|
|
|
100
115
|
process file
|
101
116
|
end
|
102
117
|
end
|
118
|
+
|
119
|
+
exit $exit
|
data/lib/ruby18_parser.rb
CHANGED
@@ -3345,10 +3345,10 @@ end
|
|
3345
3345
|
|
3346
3346
|
def _reduce_54(val, _values, result)
|
3347
3347
|
result = new_call nil, val[0].to_sym, val[1]
|
3348
|
+
|
3348
3349
|
if val[2] then
|
3349
|
-
|
3350
|
-
|
3351
|
-
end
|
3350
|
+
block_dup_check result, val[2]
|
3351
|
+
|
3352
3352
|
result, operation = val[2], result
|
3353
3353
|
result.insert 1, operation
|
3354
3354
|
end
|
@@ -3364,6 +3364,14 @@ end
|
|
3364
3364
|
|
3365
3365
|
def _reduce_56(val, _values, result)
|
3366
3366
|
result = new_call val[0], val[2].to_sym, val[3]
|
3367
|
+
raise "no2"
|
3368
|
+
|
3369
|
+
if val[4] then
|
3370
|
+
block_dup_check result, val[4]
|
3371
|
+
|
3372
|
+
val[2] << result
|
3373
|
+
result = val[2]
|
3374
|
+
end
|
3367
3375
|
|
3368
3376
|
result
|
3369
3377
|
end
|
@@ -3376,10 +3384,11 @@ end
|
|
3376
3384
|
|
3377
3385
|
def _reduce_58(val, _values, result)
|
3378
3386
|
result = new_call val[0], val[2].to_sym, val[3]
|
3387
|
+
raise "no3"
|
3388
|
+
|
3379
3389
|
if val[4] then
|
3380
|
-
|
3381
|
-
|
3382
|
-
end
|
3390
|
+
block_dup_check result, val[4]
|
3391
|
+
|
3383
3392
|
val[2] << result
|
3384
3393
|
result = val[2]
|
3385
3394
|
end
|
@@ -4497,6 +4506,8 @@ end
|
|
4497
4506
|
|
4498
4507
|
def _reduce_293(val, _values, result)
|
4499
4508
|
call, iter = val[0], val[1]
|
4509
|
+
block_dup_check call, iter
|
4510
|
+
|
4500
4511
|
iter.insert 1, call
|
4501
4512
|
result = iter
|
4502
4513
|
|
@@ -4902,8 +4913,7 @@ def _reduce_361(val, _values, result)
|
|
4902
4913
|
end
|
4903
4914
|
|
4904
4915
|
def _reduce_362(val, _values, result)
|
4905
|
-
|
4906
|
-
val[0] && val[0][0] == :blockpass
|
4916
|
+
block_dup_check val[0], val[1]
|
4907
4917
|
|
4908
4918
|
result = val[1]
|
4909
4919
|
result.insert 1, val[0]
|
data/lib/ruby18_parser.y
CHANGED
@@ -258,10 +258,10 @@ rule
|
|
258
258
|
| operation command_args cmd_brace_block
|
259
259
|
{
|
260
260
|
result = new_call nil, val[0].to_sym, val[1]
|
261
|
+
|
261
262
|
if val[2] then
|
262
|
-
|
263
|
-
|
264
|
-
end
|
263
|
+
block_dup_check result, val[2]
|
264
|
+
|
265
265
|
result, operation = val[2], result
|
266
266
|
result.insert 1, operation
|
267
267
|
end
|
@@ -273,6 +273,14 @@ rule
|
|
273
273
|
| primary_value tDOT operation2 command_args cmd_brace_block
|
274
274
|
{
|
275
275
|
result = new_call val[0], val[2].to_sym, val[3]
|
276
|
+
raise "no2"
|
277
|
+
|
278
|
+
if val[4] then
|
279
|
+
block_dup_check result, val[4]
|
280
|
+
|
281
|
+
val[2] << result
|
282
|
+
result = val[2]
|
283
|
+
end
|
276
284
|
}
|
277
285
|
| primary_value tCOLON2 operation2 command_args =tLOWEST
|
278
286
|
{
|
@@ -281,10 +289,11 @@ rule
|
|
281
289
|
| primary_value tCOLON2 operation2 command_args cmd_brace_block
|
282
290
|
{
|
283
291
|
result = new_call val[0], val[2].to_sym, val[3]
|
292
|
+
raise "no3"
|
293
|
+
|
284
294
|
if val[4] then
|
285
|
-
|
286
|
-
|
287
|
-
end
|
295
|
+
block_dup_check result, val[4]
|
296
|
+
|
288
297
|
val[2] << result
|
289
298
|
result = val[2]
|
290
299
|
end
|
@@ -997,6 +1006,8 @@ rule
|
|
997
1006
|
| method_call brace_block
|
998
1007
|
{
|
999
1008
|
call, iter = val[0], val[1]
|
1009
|
+
block_dup_check call, iter
|
1010
|
+
|
1000
1011
|
iter.insert 1, call
|
1001
1012
|
result = iter
|
1002
1013
|
}
|
@@ -1287,8 +1298,7 @@ rule
|
|
1287
1298
|
|
1288
1299
|
block_call: command do_block
|
1289
1300
|
{
|
1290
|
-
|
1291
|
-
val[0] && val[0][0] == :blockpass
|
1301
|
+
block_dup_check val[0], val[1]
|
1292
1302
|
|
1293
1303
|
result = val[1]
|
1294
1304
|
result.insert 1, val[0]
|
data/lib/ruby19_parser.rb
CHANGED
@@ -2452,7 +2452,7 @@ racc_reduce_table = [
|
|
2452
2452
|
4, 271, :_reduce_386,
|
2453
2453
|
1, 272, :_reduce_none,
|
2454
2454
|
2, 272, :_reduce_388,
|
2455
|
-
1, 273, :
|
2455
|
+
1, 273, :_reduce_389,
|
2456
2456
|
3, 273, :_reduce_390,
|
2457
2457
|
1, 274, :_reduce_none,
|
2458
2458
|
1, 274, :_reduce_none,
|
@@ -2593,7 +2593,7 @@ racc_reduce_table = [
|
|
2593
2593
|
3, 266, :_reduce_527,
|
2594
2594
|
3, 309, :_reduce_528,
|
2595
2595
|
3, 310, :_reduce_529,
|
2596
|
-
1, 267, :
|
2596
|
+
1, 267, :_reduce_530,
|
2597
2597
|
3, 267, :_reduce_531,
|
2598
2598
|
1, 307, :_reduce_532,
|
2599
2599
|
3, 307, :_reduce_533,
|
@@ -3443,9 +3443,8 @@ end
|
|
3443
3443
|
def _reduce_60(val, _values, result)
|
3444
3444
|
result = new_call nil, val[0].to_sym, val[1]
|
3445
3445
|
if val[2] then
|
3446
|
-
|
3447
|
-
|
3448
|
-
end
|
3446
|
+
block_dup_check result, val[2]
|
3447
|
+
|
3449
3448
|
result, operation = val[2], result
|
3450
3449
|
result.insert 1, operation
|
3451
3450
|
end
|
@@ -3460,7 +3459,13 @@ def _reduce_61(val, _values, result)
|
|
3460
3459
|
end
|
3461
3460
|
|
3462
3461
|
def _reduce_62(val, _values, result)
|
3463
|
-
|
3462
|
+
recv, _, msg, args, block = val
|
3463
|
+
call = new_call recv, msg.to_sym, args
|
3464
|
+
|
3465
|
+
block_dup_check call, block
|
3466
|
+
|
3467
|
+
block.insert 1, call
|
3468
|
+
result = block
|
3464
3469
|
|
3465
3470
|
result
|
3466
3471
|
end
|
@@ -3472,14 +3477,13 @@ def _reduce_63(val, _values, result)
|
|
3472
3477
|
end
|
3473
3478
|
|
3474
3479
|
def _reduce_64(val, _values, result)
|
3475
|
-
|
3476
|
-
|
3477
|
-
|
3478
|
-
|
3479
|
-
|
3480
|
-
|
3481
|
-
|
3482
|
-
end
|
3480
|
+
recv, _, msg, args, block = val
|
3481
|
+
call = new_call recv, msg.to_sym, args
|
3482
|
+
|
3483
|
+
block_dup_check call, block
|
3484
|
+
|
3485
|
+
block.insert 1, call
|
3486
|
+
result = block
|
3483
3487
|
|
3484
3488
|
result
|
3485
3489
|
end
|
@@ -4356,7 +4360,7 @@ end
|
|
4356
4360
|
# reduce 257 omitted
|
4357
4361
|
|
4358
4362
|
def _reduce_258(val, _values, result)
|
4359
|
-
result = lexer.cmdarg.stack.dup
|
4363
|
+
result = lexer.cmdarg.stack.dup # TODO: smell?
|
4360
4364
|
lexer.cmdarg.push true
|
4361
4365
|
|
4362
4366
|
result
|
@@ -4546,7 +4550,7 @@ def _reduce_293(val, _values, result)
|
|
4546
4550
|
end
|
4547
4551
|
|
4548
4552
|
def _reduce_294(val, _values, result)
|
4549
|
-
raise "no3
|
4553
|
+
raise "no3\non#{val.inspect}"
|
4550
4554
|
|
4551
4555
|
result
|
4552
4556
|
end
|
@@ -4565,7 +4569,8 @@ end
|
|
4565
4569
|
|
4566
4570
|
def _reduce_297(val, _values, result)
|
4567
4571
|
call, iter = val[0], val[1]
|
4568
|
-
|
4572
|
+
block_dup_check call, iter
|
4573
|
+
iter.insert 1, call # FIX
|
4569
4574
|
result = iter
|
4570
4575
|
|
4571
4576
|
result
|
@@ -4887,49 +4892,49 @@ def _reduce_358(val, _values, result)
|
|
4887
4892
|
end
|
4888
4893
|
|
4889
4894
|
def _reduce_359(val, _values, result)
|
4890
|
-
|
4895
|
+
result = block_var val[0], val[3], nil
|
4891
4896
|
|
4892
4897
|
result
|
4893
4898
|
end
|
4894
4899
|
|
4895
4900
|
def _reduce_360(val, _values, result)
|
4896
|
-
raise "no10: #{val.inspect}"
|
4901
|
+
raise "no10\non: #{val.inspect}"
|
4897
4902
|
|
4898
4903
|
result
|
4899
4904
|
end
|
4900
4905
|
|
4901
4906
|
def _reduce_361(val, _values, result)
|
4902
|
-
raise "no11: #{val.inspect}"
|
4907
|
+
raise "no11\non: #{val.inspect}"
|
4903
4908
|
|
4904
4909
|
result
|
4905
4910
|
end
|
4906
4911
|
|
4907
4912
|
def _reduce_362(val, _values, result)
|
4908
|
-
raise "no12: #{val.inspect}"
|
4913
|
+
raise "no12\non: #{val.inspect}"
|
4909
4914
|
|
4910
4915
|
result
|
4911
4916
|
end
|
4912
4917
|
|
4913
4918
|
def _reduce_363(val, _values, result)
|
4914
|
-
raise "no13: #{val.inspect}"
|
4919
|
+
raise "no13\non: #{val.inspect}"
|
4915
4920
|
|
4916
4921
|
result
|
4917
4922
|
end
|
4918
4923
|
|
4919
4924
|
def _reduce_364(val, _values, result)
|
4920
|
-
raise "no14: #{val.inspect}"
|
4925
|
+
raise "no14\non: #{val.inspect}"
|
4921
4926
|
|
4922
4927
|
result
|
4923
4928
|
end
|
4924
4929
|
|
4925
4930
|
def _reduce_365(val, _values, result)
|
4926
|
-
raise "no15: #{val.inspect}"
|
4931
|
+
raise "no15\non: #{val.inspect}"
|
4927
4932
|
|
4928
4933
|
result
|
4929
4934
|
end
|
4930
4935
|
|
4931
4936
|
def _reduce_366(val, _values, result)
|
4932
|
-
raise "no16: #{val.inspect}"
|
4937
|
+
raise "no16\non: #{val.inspect}"
|
4933
4938
|
|
4934
4939
|
result
|
4935
4940
|
end
|
@@ -4947,7 +4952,12 @@ def _reduce_368(val, _values, result)
|
|
4947
4952
|
end
|
4948
4953
|
|
4949
4954
|
def _reduce_369(val, _values, result)
|
4950
|
-
|
4955
|
+
arg, _, opt, block = val
|
4956
|
+
|
4957
|
+
result = arg
|
4958
|
+
result.concat opt[1..-1].map { |s| s[1] }
|
4959
|
+
result << "&#{block.last}".to_sym if block
|
4960
|
+
result << opt
|
4951
4961
|
|
4952
4962
|
result
|
4953
4963
|
end
|
@@ -4995,7 +5005,12 @@ def _reduce_376(val, _values, result)
|
|
4995
5005
|
end
|
4996
5006
|
|
4997
5007
|
def _reduce_377(val, _values, result)
|
4998
|
-
|
5008
|
+
opt, block = val
|
5009
|
+
|
5010
|
+
result = s(:args)
|
5011
|
+
result.concat opt[1..-1].map { |s| s[1] }
|
5012
|
+
result << "&#{block.last}".to_sym if block
|
5013
|
+
result << opt
|
4999
5014
|
|
5000
5015
|
result
|
5001
5016
|
end
|
@@ -5013,7 +5028,11 @@ def _reduce_379(val, _values, result)
|
|
5013
5028
|
end
|
5014
5029
|
|
5015
5030
|
def _reduce_380(val, _values, result)
|
5016
|
-
|
5031
|
+
rest, _, args, block = val
|
5032
|
+
|
5033
|
+
result = args
|
5034
|
+
result[1,0] = rest
|
5035
|
+
result << "&#{block.last}".to_sym if block
|
5017
5036
|
|
5018
5037
|
result
|
5019
5038
|
end
|
@@ -5056,11 +5075,15 @@ def _reduce_388(val, _values, result)
|
|
5056
5075
|
result
|
5057
5076
|
end
|
5058
5077
|
|
5059
|
-
|
5078
|
+
def _reduce_389(val, _values, result)
|
5079
|
+
result = [val[0]]
|
5080
|
+
|
5081
|
+
result
|
5082
|
+
end
|
5060
5083
|
|
5061
5084
|
def _reduce_390(val, _values, result)
|
5062
|
-
result = val[0]
|
5063
|
-
raise "no18: #{val.inspect}"
|
5085
|
+
result = val[0].concat val[2]
|
5086
|
+
raise "no18\non: #{val.inspect}"
|
5064
5087
|
|
5065
5088
|
result
|
5066
5089
|
end
|
@@ -5135,8 +5158,12 @@ def _reduce_400(val, _values, result)
|
|
5135
5158
|
end
|
5136
5159
|
|
5137
5160
|
def _reduce_401(val, _values, result)
|
5138
|
-
|
5139
|
-
|
5161
|
+
# TODO:
|
5162
|
+
# if (nd_type($1) == NODE_YIELD) {
|
5163
|
+
# compile_error(PARSER_ARG "block given to yield");
|
5164
|
+
|
5165
|
+
syntax_error "Both block arg and actual block given." if
|
5166
|
+
val[0].block_pass?
|
5140
5167
|
|
5141
5168
|
result = val[1]
|
5142
5169
|
result.insert 1, val[0]
|
@@ -5886,10 +5913,15 @@ def _reduce_529(val, _values, result)
|
|
5886
5913
|
result
|
5887
5914
|
end
|
5888
5915
|
|
5889
|
-
|
5916
|
+
def _reduce_530(val, _values, result)
|
5917
|
+
result = s(:block, val[0])
|
5918
|
+
|
5919
|
+
result
|
5920
|
+
end
|
5890
5921
|
|
5891
5922
|
def _reduce_531(val, _values, result)
|
5892
|
-
|
5923
|
+
result = val[0]
|
5924
|
+
result << val[2]
|
5893
5925
|
|
5894
5926
|
result
|
5895
5927
|
end
|