ruby_parser 3.15.1 → 3.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +19 -0
- data/Manifest.txt +2 -0
- data/Rakefile +28 -12
- data/compare/normalize.rb +2 -2
- data/debugging.md +133 -0
- data/lib/ruby20_parser.rb +2392 -2384
- data/lib/ruby20_parser.y +6 -1
- data/lib/ruby21_parser.rb +2553 -2550
- data/lib/ruby21_parser.y +6 -1
- data/lib/ruby22_parser.rb +2491 -2471
- data/lib/ruby22_parser.y +6 -1
- data/lib/ruby23_parser.rb +2422 -2403
- data/lib/ruby23_parser.y +6 -1
- data/lib/ruby24_parser.rb +2460 -2450
- data/lib/ruby24_parser.y +6 -1
- data/lib/ruby25_parser.rb +2450 -2441
- data/lib/ruby25_parser.y +6 -1
- data/lib/ruby26_parser.rb +2444 -2433
- data/lib/ruby26_parser.y +7 -1
- data/lib/ruby27_parser.rb +3372 -3286
- data/lib/ruby27_parser.y +21 -1
- data/lib/ruby30_parser.rb +7310 -0
- data/lib/ruby30_parser.y +2677 -0
- data/lib/ruby_lexer.rb +19 -0
- data/lib/ruby_lexer.rex +1 -1
- data/lib/ruby_lexer.rex.rb +1 -1
- data/lib/ruby_parser.rb +2 -0
- data/lib/ruby_parser.yy +27 -1
- data/lib/ruby_parser_extras.rb +2 -2
- data/test/test_ruby_lexer.rb +32 -0
- data/test/test_ruby_parser.rb +37 -0
- data/tools/munge.rb +2 -2
- metadata +35 -21
- metadata.gz.sig +0 -0
data/lib/ruby_lexer.rb
CHANGED
@@ -25,6 +25,11 @@ class RubyLexer
|
|
25
25
|
|
26
26
|
HAS_ENC = "".respond_to? :encoding
|
27
27
|
|
28
|
+
BTOKENS = {
|
29
|
+
".." => :tBDOT2,
|
30
|
+
"..." => :tBDOT3,
|
31
|
+
}
|
32
|
+
|
28
33
|
TOKENS = {
|
29
34
|
"!" => :tBANG,
|
30
35
|
"!=" => :tNEQ,
|
@@ -131,6 +136,10 @@ class RubyLexer
|
|
131
136
|
ss.eos?
|
132
137
|
end
|
133
138
|
|
139
|
+
def expr_beg?
|
140
|
+
lex_state =~ EXPR_BEG
|
141
|
+
end
|
142
|
+
|
134
143
|
def expr_dot?
|
135
144
|
lex_state =~ EXPR_DOT
|
136
145
|
end
|
@@ -580,6 +589,12 @@ class RubyLexer
|
|
580
589
|
end
|
581
590
|
end
|
582
591
|
|
592
|
+
def process_dots text
|
593
|
+
tokens = ruby27plus? && expr_beg? ? BTOKENS : TOKENS
|
594
|
+
|
595
|
+
result EXPR_BEG, tokens[text], text
|
596
|
+
end
|
597
|
+
|
583
598
|
def process_float text
|
584
599
|
rb_compile_error "Invalid numeric format" if text =~ /__/
|
585
600
|
|
@@ -1136,6 +1151,10 @@ class RubyLexer
|
|
1136
1151
|
parser.class.version <= 24
|
1137
1152
|
end
|
1138
1153
|
|
1154
|
+
def ruby27plus?
|
1155
|
+
parser.class.version >= 27
|
1156
|
+
end
|
1157
|
+
|
1139
1158
|
def scan re
|
1140
1159
|
ss.scan re
|
1141
1160
|
end
|
data/lib/ruby_lexer.rex
CHANGED
@@ -48,7 +48,7 @@ rule
|
|
48
48
|
| /\![=~]?/ { result :arg_state, TOKENS[text], text }
|
49
49
|
|
50
50
|
: /\./
|
51
|
-
| /\.\.\.?/
|
51
|
+
| /\.\.\.?/ process_dots
|
52
52
|
| /\.\d/ { rb_compile_error "no .<digit> floating literal anymore put 0 before dot" }
|
53
53
|
| /\./ { self.lex_state = EXPR_BEG; result EXPR_DOT, :tDOT, "." }
|
54
54
|
|
data/lib/ruby_lexer.rex.rb
CHANGED
@@ -138,7 +138,7 @@ class RubyLexer
|
|
138
138
|
when ss.match?(/\./) then
|
139
139
|
case
|
140
140
|
when text = ss.scan(/\.\.\.?/) then
|
141
|
-
|
141
|
+
process_dots text
|
142
142
|
when ss.skip(/\.\d/) then
|
143
143
|
action { rb_compile_error "no .<digit> floating literal anymore put 0 before dot" }
|
144
144
|
when ss.skip(/\./) then
|
data/lib/ruby_parser.rb
CHANGED
@@ -79,10 +79,12 @@ require "ruby24_parser"
|
|
79
79
|
require "ruby25_parser"
|
80
80
|
require "ruby26_parser"
|
81
81
|
require "ruby27_parser"
|
82
|
+
require "ruby30_parser"
|
82
83
|
|
83
84
|
class RubyParser # HACK
|
84
85
|
VERSIONS.clear # also a HACK caused by racc namespace issues
|
85
86
|
|
87
|
+
class V30 < ::Ruby30Parser; end
|
86
88
|
class V27 < ::Ruby27Parser; end
|
87
89
|
class V26 < ::Ruby26Parser; end
|
88
90
|
class V25 < ::Ruby25Parser; end
|
data/lib/ruby_parser.yy
CHANGED
@@ -16,6 +16,8 @@ class Ruby25Parser
|
|
16
16
|
class Ruby26Parser
|
17
17
|
#elif V == 27
|
18
18
|
class Ruby27Parser
|
19
|
+
#elif V == 30
|
20
|
+
class Ruby30Parser
|
19
21
|
#else
|
20
22
|
fail "version not specified or supported on code generation"
|
21
23
|
#endif
|
@@ -46,6 +48,9 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
46
48
|
#if V >= 23
|
47
49
|
tLONELY
|
48
50
|
#endif
|
51
|
+
#if V >= 26
|
52
|
+
tBDOT2 tBDOT3
|
53
|
+
#endif
|
49
54
|
|
50
55
|
preclow
|
51
56
|
nonassoc tLOWEST
|
@@ -57,7 +62,7 @@ preclow
|
|
57
62
|
right tEQL tOP_ASGN
|
58
63
|
left kRESCUE_MOD
|
59
64
|
right tEH tCOLON
|
60
|
-
nonassoc tDOT2 tDOT3
|
65
|
+
nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3
|
61
66
|
left tOROP
|
62
67
|
left tANDOP
|
63
68
|
nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
|
@@ -80,6 +85,9 @@ rule
|
|
80
85
|
top_compstmt
|
81
86
|
{
|
82
87
|
result = new_compstmt val
|
88
|
+
|
89
|
+
lexer.cond.pop # local_pop
|
90
|
+
lexer.cmdarg.pop
|
83
91
|
}
|
84
92
|
|
85
93
|
top_compstmt: top_stmts opt_terms
|
@@ -856,6 +864,24 @@ rule
|
|
856
864
|
result = s(:dot3, v1, v2).line v1.line
|
857
865
|
}
|
858
866
|
#endif
|
867
|
+
|
868
|
+
#if V >= 27
|
869
|
+
| tBDOT2 arg
|
870
|
+
{
|
871
|
+
_, v2, = val
|
872
|
+
v1 = nil
|
873
|
+
|
874
|
+
result = s(:dot2, v1, v2).line v2.line
|
875
|
+
}
|
876
|
+
| tBDOT3 arg
|
877
|
+
{
|
878
|
+
_, v2 = val
|
879
|
+
v1 = nil
|
880
|
+
|
881
|
+
result = s(:dot3, v1, v2).line v2.line
|
882
|
+
}
|
883
|
+
#endif
|
884
|
+
|
859
885
|
| arg tPLUS arg
|
860
886
|
{
|
861
887
|
result = new_call val[0], :+, argl(val[2])
|
data/lib/ruby_parser_extras.rb
CHANGED
@@ -29,7 +29,7 @@ class Sexp
|
|
29
29
|
end
|
30
30
|
|
31
31
|
module RubyParserStuff
|
32
|
-
VERSION = "3.
|
32
|
+
VERSION = "3.16.0"
|
33
33
|
|
34
34
|
attr_accessor :lexer, :in_def, :in_single, :file
|
35
35
|
attr_accessor :in_kwarg
|
@@ -115,7 +115,7 @@ module RubyParserStuff
|
|
115
115
|
def initialize(options = {})
|
116
116
|
super()
|
117
117
|
|
118
|
-
v = self.class.name[/
|
118
|
+
v = self.class.name[/[23]\d/]
|
119
119
|
raise "Bad Class name #{self.class}" unless v
|
120
120
|
|
121
121
|
self.lexer = RubyLexer.new v && v.to_i
|
data/test/test_ruby_lexer.rb
CHANGED
@@ -478,6 +478,22 @@ class TestRubyLexer < Minitest::Test
|
|
478
478
|
assert_lex3("!~", nil, :tNMATCH, "!~", EXPR_BEG)
|
479
479
|
end
|
480
480
|
|
481
|
+
def test_yylex_bdot2
|
482
|
+
assert_lex3("..42",
|
483
|
+
nil, # TODO: s(:dot2, nil, s(:lit, 42)),
|
484
|
+
|
485
|
+
:tBDOT2, "..", EXPR_BEG,
|
486
|
+
:tINTEGER, 42, EXPR_END|EXPR_ENDARG)
|
487
|
+
end
|
488
|
+
|
489
|
+
def test_yylex_bdot3
|
490
|
+
assert_lex3("...42",
|
491
|
+
nil, # TODO: s(:dot2, nil, s(:lit, 42)),
|
492
|
+
|
493
|
+
:tBDOT3, "...", EXPR_BEG,
|
494
|
+
:tINTEGER, 42, EXPR_END|EXPR_ENDARG)
|
495
|
+
end
|
496
|
+
|
481
497
|
def test_yylex_block_bug_1
|
482
498
|
assert_lex3("a do end",
|
483
499
|
s(:iter, s(:call, nil, :a), 0),
|
@@ -749,10 +765,26 @@ class TestRubyLexer < Minitest::Test
|
|
749
765
|
end
|
750
766
|
|
751
767
|
def test_yylex_dot2
|
768
|
+
assert_lex3("1..2",
|
769
|
+
s(:lit, 1..2),
|
770
|
+
|
771
|
+
:tINTEGER, 1, EXPR_END|EXPR_ENDARG,
|
772
|
+
:tDOT2, "..", EXPR_BEG,
|
773
|
+
:tINTEGER, 2, EXPR_END|EXPR_ENDARG)
|
774
|
+
|
775
|
+
self.lex_state = EXPR_END|EXPR_ENDARG
|
752
776
|
assert_lex3("..", nil, :tDOT2, "..", EXPR_BEG)
|
753
777
|
end
|
754
778
|
|
755
779
|
def test_yylex_dot3
|
780
|
+
assert_lex3("1...2",
|
781
|
+
s(:lit, 1...2),
|
782
|
+
|
783
|
+
:tINTEGER, 1, EXPR_END|EXPR_ENDARG,
|
784
|
+
:tDOT3, "...", EXPR_BEG,
|
785
|
+
:tINTEGER, 2, EXPR_END|EXPR_ENDARG)
|
786
|
+
|
787
|
+
self.lex_state = EXPR_END|EXPR_ENDARG
|
756
788
|
assert_lex3("...", nil, :tDOT3, "...", EXPR_BEG)
|
757
789
|
end
|
758
790
|
|
data/test/test_ruby_parser.rb
CHANGED
@@ -3080,6 +3080,8 @@ module TestRubyParserShared19Plus
|
|
3080
3080
|
end
|
3081
3081
|
|
3082
3082
|
def test_motherfuckin_leading_dots
|
3083
|
+
skip if processor.class.version >= 27
|
3084
|
+
|
3083
3085
|
rb = "a\n.b"
|
3084
3086
|
pt = s(:call, s(:call, nil, :a), :b)
|
3085
3087
|
|
@@ -3087,6 +3089,8 @@ module TestRubyParserShared19Plus
|
|
3087
3089
|
end
|
3088
3090
|
|
3089
3091
|
def test_motherfuckin_leading_dots2
|
3092
|
+
skip if processor.class.version >= 27
|
3093
|
+
|
3090
3094
|
rb = "a\n..b"
|
3091
3095
|
|
3092
3096
|
assert_parse_error rb, '(string):2 :: parse error on value ".." (tDOT2)'
|
@@ -4136,6 +4140,10 @@ module TestRubyParserShared27Plus
|
|
4136
4140
|
include TestRubyParserShared26Plus
|
4137
4141
|
end
|
4138
4142
|
|
4143
|
+
module TestRubyParserShared30Plus
|
4144
|
+
include TestRubyParserShared27Plus
|
4145
|
+
end
|
4146
|
+
|
4139
4147
|
class TestRubyParser < Minitest::Test
|
4140
4148
|
def test_cls_version
|
4141
4149
|
assert_equal 23, RubyParser::V23.version
|
@@ -4440,8 +4448,37 @@ class TestRubyParserV27 < RubyParserTestCase
|
|
4440
4448
|
|
4441
4449
|
self.processor = RubyParser::V27.new
|
4442
4450
|
end
|
4451
|
+
|
4452
|
+
def test_bdot2
|
4453
|
+
rb = "..10\n; ..a\n; c"
|
4454
|
+
pt = s(:block,
|
4455
|
+
s(:dot2, nil, s(:lit, 10).line(1)).line(1),
|
4456
|
+
s(:dot2, nil, s(:call, nil, :a).line(2)).line(2),
|
4457
|
+
s(:call, nil, :c).line(3)).line(1)
|
4458
|
+
|
4459
|
+
assert_parse_line rb, pt, 1
|
4460
|
+
end
|
4461
|
+
|
4462
|
+
def test_bdot3
|
4463
|
+
rb = "...10\n; ...a\n; c"
|
4464
|
+
pt = s(:block,
|
4465
|
+
s(:dot3, nil, s(:lit, 10).line(1)).line(1),
|
4466
|
+
s(:dot3, nil, s(:call, nil, :a).line(2)).line(2),
|
4467
|
+
s(:call, nil, :c).line(3)).line(1)
|
4468
|
+
|
4469
|
+
assert_parse_line rb, pt, 1
|
4470
|
+
end
|
4443
4471
|
end
|
4444
4472
|
|
4473
|
+
class TestRubyParserV30 < RubyParserTestCase
|
4474
|
+
include TestRubyParserShared30Plus
|
4475
|
+
|
4476
|
+
def setup
|
4477
|
+
super
|
4478
|
+
|
4479
|
+
self.processor = RubyParser::V30.new
|
4480
|
+
end
|
4481
|
+
end
|
4445
4482
|
|
4446
4483
|
RubyParser::VERSIONS.each do |klass|
|
4447
4484
|
v = klass.version
|
data/tools/munge.rb
CHANGED
@@ -197,8 +197,8 @@ ARGF.each_line do |line|
|
|
197
197
|
puts line.gsub("true", "1").gsub("false", "0")
|
198
198
|
when /^lex_state: :?([\w|]+) -> :?([\w|]+)(?: (?:at|from) (.*))?/ then
|
199
199
|
a, b, c = $1.upcase, $2.upcase, $3
|
200
|
-
a.gsub!
|
201
|
-
b.gsub!
|
200
|
+
a.gsub!(/EXPR_/, "")
|
201
|
+
b.gsub!(/EXPR_/, "")
|
202
202
|
if c && $v then
|
203
203
|
puts "lex_state: #{a} -> #{b} at #{c}"
|
204
204
|
else
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -29,7 +29,7 @@ cert_chain:
|
|
29
29
|
d/AHw/kcnU6iuMUoJEcGiJd4gVCTn1l3cDcIvxakGslCA88Jubw0Sqatan0TnC9g
|
30
30
|
KToW560QIey7SPfHWduzFJnV
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date: 2021-
|
32
|
+
date: 2021-05-15 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: sexp_processor
|
@@ -37,28 +37,40 @@ dependencies:
|
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '4.
|
40
|
+
version: '4.15'
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 4.15.1
|
41
44
|
type: :runtime
|
42
45
|
prerelease: false
|
43
46
|
version_requirements: !ruby/object:Gem::Requirement
|
44
47
|
requirements:
|
45
48
|
- - "~>"
|
46
49
|
- !ruby/object:Gem::Version
|
47
|
-
version: '4.
|
50
|
+
version: '4.15'
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 4.15.1
|
48
54
|
- !ruby/object:Gem::Dependency
|
49
55
|
name: rake
|
50
56
|
requirement: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '10'
|
52
61
|
- - "<"
|
53
62
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
63
|
+
version: '15'
|
55
64
|
type: :development
|
56
65
|
prerelease: false
|
57
66
|
version_requirements: !ruby/object:Gem::Requirement
|
58
67
|
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '10'
|
59
71
|
- - "<"
|
60
72
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
73
|
+
version: '15'
|
62
74
|
- !ruby/object:Gem::Dependency
|
63
75
|
name: oedipus_lex
|
64
76
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,6 +85,20 @@ dependencies:
|
|
73
85
|
- - "~>"
|
74
86
|
- !ruby/object:Gem::Version
|
75
87
|
version: '2.5'
|
88
|
+
- !ruby/object:Gem::Dependency
|
89
|
+
name: racc
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '1.5'
|
95
|
+
type: :development
|
96
|
+
prerelease: false
|
97
|
+
version_requirements: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.5'
|
76
102
|
- !ruby/object:Gem::Dependency
|
77
103
|
name: rdoc
|
78
104
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,20 +119,6 @@ dependencies:
|
|
93
119
|
- - "<"
|
94
120
|
- !ruby/object:Gem::Version
|
95
121
|
version: '7'
|
96
|
-
- !ruby/object:Gem::Dependency
|
97
|
-
name: racc
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - "~>"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: 1.4.6
|
103
|
-
type: :development
|
104
|
-
prerelease: false
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 1.4.6
|
110
122
|
- !ruby/object:Gem::Dependency
|
111
123
|
name: hoe
|
112
124
|
requirement: !ruby/object:Gem::Requirement
|
@@ -188,6 +200,8 @@ files:
|
|
188
200
|
- lib/ruby26_parser.y
|
189
201
|
- lib/ruby27_parser.rb
|
190
202
|
- lib/ruby27_parser.y
|
203
|
+
- lib/ruby30_parser.rb
|
204
|
+
- lib/ruby30_parser.y
|
191
205
|
- lib/ruby_lexer.rb
|
192
206
|
- lib/ruby_lexer.rex
|
193
207
|
- lib/ruby_lexer.rex.rb
|
@@ -225,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
239
|
- !ruby/object:Gem::Version
|
226
240
|
version: '0'
|
227
241
|
requirements: []
|
228
|
-
rubygems_version: 3.
|
242
|
+
rubygems_version: 3.2.16
|
229
243
|
signing_key:
|
230
244
|
specification_version: 4
|
231
245
|
summary: ruby_parser (RP) is a ruby parser written in pure ruby (utilizing racc--which
|
metadata.gz.sig
CHANGED
Binary file
|