parser 0.9.1 → 0.9.2
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Rakefile +2 -1
- data/TODO.md +20 -0
- data/bin/explain-parse +1 -1
- data/lib/parser/all.rb +1 -0
- data/lib/parser/builders/default.rb +30 -2
- data/lib/parser/lexer/literal.rb +41 -20
- data/lib/parser/lexer/stack_state.rb +4 -0
- data/lib/parser/lexer.rb +2585 -2545
- data/lib/parser/lexer.rl +61 -38
- data/lib/parser/ruby18.rb +3133 -3171
- data/lib/parser/ruby18.y +16 -30
- data/lib/parser/ruby19.rb +3319 -3388
- data/lib/parser/ruby19.y +35 -50
- data/lib/parser/ruby20.rb +6961 -0
- data/lib/parser/ruby20.y +2190 -0
- data/lib/parser.rb +0 -1
- data/parse.y.diff +12201 -0
- data/parser.gemspec +2 -1
- data/test/helper.rb +1 -1
- data/test/parse_helper.rb +2 -2
- data/test/test_lexer.rb +95 -5
- data/test/test_lexer_stack_state.rb +7 -0
- data/test/test_parser.rb +138 -5
- metadata +6 -2
data/parser.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'parser'
|
5
|
-
spec.version = '0.9.
|
5
|
+
spec.version = '0.9.2'
|
6
6
|
spec.authors = ['Peter Zotov']
|
7
7
|
spec.email = ['whitequark@whitequark.org']
|
8
8
|
spec.description = %q{A Ruby parser written in pure Ruby.}
|
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
lib/parser/lexer.rb
|
15
15
|
lib/parser/ruby18.rb
|
16
16
|
lib/parser/ruby19.rb
|
17
|
+
lib/parser/ruby20.rb
|
17
18
|
)
|
18
19
|
spec.executables = %w()
|
19
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
data/test/helper.rb
CHANGED
@@ -7,7 +7,7 @@ if SimpleCov.usable?
|
|
7
7
|
if defined?(TracePoint)
|
8
8
|
require_relative 'racc_coverage_helper'
|
9
9
|
|
10
|
-
RaccCoverage.start(%w(ruby18.y ruby19.y),
|
10
|
+
RaccCoverage.start(%w(ruby18.y ruby19.y ruby20.y),
|
11
11
|
File.expand_path('../../lib/parser', __FILE__))
|
12
12
|
|
13
13
|
# Report results faster.
|
data/test/parse_helper.rb
CHANGED
@@ -3,7 +3,7 @@ require 'parser/all'
|
|
3
3
|
module ParseHelper
|
4
4
|
include AST::Sexp
|
5
5
|
|
6
|
-
ALL_VERSIONS = %w(1.8 1.9)
|
6
|
+
ALL_VERSIONS = %w(1.8 1.9 2.0)
|
7
7
|
|
8
8
|
def setup
|
9
9
|
@diagnostics = []
|
@@ -15,7 +15,7 @@ module ParseHelper
|
|
15
15
|
case version
|
16
16
|
when '1.8'; parser = Parser::Ruby18.new
|
17
17
|
when '1.9'; parser = Parser::Ruby19.new
|
18
|
-
|
18
|
+
when '2.0'; parser = Parser::Ruby20.new
|
19
19
|
else raise "Unrecognized Ruby version #{version}"
|
20
20
|
end
|
21
21
|
|
data/test/test_lexer.rb
CHANGED
@@ -1640,6 +1640,13 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1640
1640
|
assert_equal :expr_beg, @lex.state
|
1641
1641
|
end
|
1642
1642
|
|
1643
|
+
def test_star2_beg
|
1644
|
+
util_lex_token("** ",
|
1645
|
+
:tDSTAR, "**")
|
1646
|
+
|
1647
|
+
assert_equal :expr_beg, @lex.state
|
1648
|
+
end
|
1649
|
+
|
1643
1650
|
def test_star_arg
|
1644
1651
|
@lex.state = :expr_arg
|
1645
1652
|
|
@@ -1785,6 +1792,16 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1785
1792
|
:tSTRING_END, "\"")
|
1786
1793
|
end
|
1787
1794
|
|
1795
|
+
def test_string_double_interp_label
|
1796
|
+
util_lex_token('"#{foo:bar}"',
|
1797
|
+
:tSTRING_BEG, '"',
|
1798
|
+
:tSTRING_DBEG, '#{',
|
1799
|
+
:tIDENTIFIER, 'foo',
|
1800
|
+
:tSYMBOL, 'bar',
|
1801
|
+
:tRCURLY, '}',
|
1802
|
+
:tSTRING_END, '"')
|
1803
|
+
end
|
1804
|
+
|
1788
1805
|
def test_string_double_nested_curlies
|
1789
1806
|
util_lex_token('%{nest{one{two}one}nest}',
|
1790
1807
|
:tSTRING, "nest{one{two}one}nest")
|
@@ -1809,7 +1826,7 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1809
1826
|
end
|
1810
1827
|
|
1811
1828
|
def test_string_pct_W
|
1812
|
-
util_lex_token("%W[s1 s2\ns3]",
|
1829
|
+
util_lex_token("%W[s1 s2\ns3]",
|
1813
1830
|
:tWORDS_BEG, "%W[",
|
1814
1831
|
:tSTRING_CONTENT, "s1",
|
1815
1832
|
:tSPACE, nil,
|
@@ -1821,7 +1838,7 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1821
1838
|
end
|
1822
1839
|
|
1823
1840
|
def test_string_pct_W_bs_nl
|
1824
|
-
util_lex_token("%W[s1 \\\ns2]",
|
1841
|
+
util_lex_token("%W[s1 \\\ns2]",
|
1825
1842
|
:tWORDS_BEG, "%W[",
|
1826
1843
|
:tSTRING_CONTENT, "s1",
|
1827
1844
|
:tSPACE, nil,
|
@@ -1830,6 +1847,32 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1830
1847
|
:tSTRING_END, ']')
|
1831
1848
|
end
|
1832
1849
|
|
1850
|
+
def test_string_pct_W_interp
|
1851
|
+
util_lex_token('%W[#{1}#{2} #@a]',
|
1852
|
+
:tWORDS_BEG, '%W[',
|
1853
|
+
:tSTRING_DBEG, '#{',
|
1854
|
+
:tINTEGER, 1,
|
1855
|
+
:tRCURLY, '}',
|
1856
|
+
:tSTRING_DBEG, '#{',
|
1857
|
+
:tINTEGER, 2,
|
1858
|
+
:tRCURLY, '}',
|
1859
|
+
:tSPACE, nil,
|
1860
|
+
:tSTRING_DVAR, nil,
|
1861
|
+
:tIVAR, '@a',
|
1862
|
+
:tSPACE, nil,
|
1863
|
+
:tSTRING_END, ']')
|
1864
|
+
end
|
1865
|
+
|
1866
|
+
def test_string_pct_I
|
1867
|
+
util_lex_token("%I(s1 s2)",
|
1868
|
+
:tSYMBOLS_BEG, "%I(",
|
1869
|
+
:tSTRING_CONTENT, "s1",
|
1870
|
+
:tSPACE, nil,
|
1871
|
+
:tSTRING_CONTENT, "s2",
|
1872
|
+
:tSPACE, nil,
|
1873
|
+
:tSTRING_END, ')')
|
1874
|
+
end
|
1875
|
+
|
1833
1876
|
def test_string_pct_angle
|
1834
1877
|
util_lex_token("%<blah>",
|
1835
1878
|
:tSTRING, "blah")
|
@@ -1841,12 +1884,20 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1841
1884
|
end
|
1842
1885
|
|
1843
1886
|
def test_string_pct_w
|
1844
|
-
|
1887
|
+
util_lex_token("%w[s1 s2 ]",
|
1845
1888
|
:tQWORDS_BEG, "%w[",
|
1846
1889
|
:tSTRING_CONTENT, "s1",
|
1847
|
-
:tSPACE,
|
1890
|
+
:tSPACE, nil,
|
1848
1891
|
:tSTRING_CONTENT, "s2",
|
1849
|
-
:tSPACE,
|
1892
|
+
:tSPACE, nil,
|
1893
|
+
:tSTRING_END, "]")
|
1894
|
+
end
|
1895
|
+
|
1896
|
+
def test_string_pct_w_incomplete
|
1897
|
+
util_bad_token("%w[s1 ",
|
1898
|
+
:tQWORDS_BEG, "%w[",
|
1899
|
+
:tSTRING_CONTENT, "s1",
|
1900
|
+
:tSPACE, nil)
|
1850
1901
|
end
|
1851
1902
|
|
1852
1903
|
def test_string_pct_w_bs_nl
|
@@ -1879,6 +1930,16 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1879
1930
|
:tSTRING_END, ']')
|
1880
1931
|
end
|
1881
1932
|
|
1933
|
+
def test_string_pct_i
|
1934
|
+
util_lex_token("%i(s1 s2)",
|
1935
|
+
:tQSYMBOLS_BEG, "%i(",
|
1936
|
+
:tSTRING_CONTENT, "s1",
|
1937
|
+
:tSPACE, nil,
|
1938
|
+
:tSTRING_CONTENT, "s2",
|
1939
|
+
:tSPACE, nil,
|
1940
|
+
:tSTRING_END, ')')
|
1941
|
+
end
|
1942
|
+
|
1882
1943
|
def test_string_single
|
1883
1944
|
util_lex_token("'string'",
|
1884
1945
|
:tSTRING, "string")
|
@@ -1996,10 +2057,29 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
1996
2057
|
:kEND, "end")
|
1997
2058
|
end
|
1998
2059
|
|
2060
|
+
def test_sclass_label
|
2061
|
+
setup_lexer 20
|
2062
|
+
util_lex_token("class << a:b",
|
2063
|
+
:kCLASS, 'class',
|
2064
|
+
:tLSHFT, '<<',
|
2065
|
+
:tIDENTIFIER, 'a',
|
2066
|
+
:tSYMBOL, 'b')
|
2067
|
+
end
|
2068
|
+
|
1999
2069
|
def test_static_env
|
2000
2070
|
env = Parser::StaticEnvironment.new
|
2001
2071
|
env.declare "a"
|
2002
2072
|
|
2073
|
+
setup_lexer(18)
|
2074
|
+
@lex.static_env = env
|
2075
|
+
|
2076
|
+
util_lex_token("a [42]",
|
2077
|
+
:tIDENTIFIER, "a",
|
2078
|
+
:tLBRACK, "[",
|
2079
|
+
:tINTEGER, 42,
|
2080
|
+
:tRBRACK, "]")
|
2081
|
+
|
2082
|
+
setup_lexer(19)
|
2003
2083
|
@lex.static_env = env
|
2004
2084
|
|
2005
2085
|
util_lex_token("a [42]",
|
@@ -2204,6 +2284,16 @@ class TestLexer < MiniTest::Unit::TestCase
|
|
2204
2284
|
:tNL, nil)
|
2205
2285
|
end
|
2206
2286
|
|
2287
|
+
def test_bug_expr_beg_heredoc
|
2288
|
+
util_lex_token("<<EOL % [\nfoo\nEOL\n]",
|
2289
|
+
:tSTRING_BEG, '"',
|
2290
|
+
:tSTRING_CONTENT, "foo\n",
|
2291
|
+
:tSTRING_END, 'EOL',
|
2292
|
+
:tPERCENT, '%',
|
2293
|
+
:tLBRACK, '[',
|
2294
|
+
:tRBRACK, ']')
|
2295
|
+
end
|
2296
|
+
|
2207
2297
|
def test_bug_ragel_stack
|
2208
2298
|
util_lex_token("\"\#{$2 ? $2 : 1}\"",
|
2209
2299
|
:tSTRING_BEG, "\"",
|
data/test/test_parser.rb
CHANGED
@@ -323,6 +323,12 @@ class TestParser < MiniTest::Unit::TestCase
|
|
323
323
|
| ~~~ expression (str)
|
324
324
|
| ~~~ expression (lvar)
|
325
325
|
|~~~~~~~~~~~~~~ expression})
|
326
|
+
|
327
|
+
assert_parses(
|
328
|
+
s(:array,
|
329
|
+
s(:str, "foo"),
|
330
|
+
s(:dstr, s(:lvar, :bar), s(:str, 'foo'), s(:ivar, :@baz))),
|
331
|
+
%q{%W[foo #{bar}foo#@baz]})
|
326
332
|
end
|
327
333
|
|
328
334
|
def test_array_words_empty
|
@@ -338,6 +344,51 @@ class TestParser < MiniTest::Unit::TestCase
|
|
338
344
|
%q{%W()})
|
339
345
|
end
|
340
346
|
|
347
|
+
def test_array_symbols
|
348
|
+
assert_parses(
|
349
|
+
s(:array, s(:sym, :foo), s(:sym, :bar)),
|
350
|
+
%q{%i[foo bar]},
|
351
|
+
%q{^^^ begin
|
352
|
+
| ^ end
|
353
|
+
| ~~~ expression (sym)
|
354
|
+
|~~~~~~~~~~~ expression},
|
355
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
356
|
+
end
|
357
|
+
|
358
|
+
def test_array_symbols_interp
|
359
|
+
assert_parses(
|
360
|
+
s(:array, s(:sym, :foo), s(:lvar, :bar)),
|
361
|
+
%q{%I[foo #{bar}]},
|
362
|
+
%q{^^^ begin
|
363
|
+
| ^ end
|
364
|
+
| ~~~ expression (sym)
|
365
|
+
| ~~~ expression (lvar)
|
366
|
+
|~~~~~~~~~~~~~~ expression},
|
367
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
368
|
+
|
369
|
+
assert_parses(
|
370
|
+
s(:array, s(:dsym, s(:str, "foo"), s(:lvar, :bar))),
|
371
|
+
%q{%I[foo#{bar}]},
|
372
|
+
%q{},
|
373
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_array_symbols_empty
|
377
|
+
assert_parses(
|
378
|
+
s(:array),
|
379
|
+
%q{%i[]},
|
380
|
+
%q{^^^ begin
|
381
|
+
| ^ end
|
382
|
+
|~~~~ expression},
|
383
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
384
|
+
|
385
|
+
assert_parses(
|
386
|
+
s(:array),
|
387
|
+
%q{%I()},
|
388
|
+
%q{},
|
389
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
390
|
+
end
|
391
|
+
|
341
392
|
# Hashes
|
342
393
|
|
343
394
|
def test_hash_empty
|
@@ -1233,6 +1284,18 @@ class TestParser < MiniTest::Unit::TestCase
|
|
1233
1284
|
| ~~~ end})
|
1234
1285
|
end
|
1235
1286
|
|
1287
|
+
def test_class_super_label
|
1288
|
+
assert_parses(
|
1289
|
+
s(:class,
|
1290
|
+
s(:const, nil, :Foo),
|
1291
|
+
s(:send, nil, :a,
|
1292
|
+
s(:sym, :b)),
|
1293
|
+
s(:nil)),
|
1294
|
+
%q{class Foo < a:b; end},
|
1295
|
+
%q{},
|
1296
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
1297
|
+
end
|
1298
|
+
|
1236
1299
|
def test_class_invalid
|
1237
1300
|
assert_diagnoses(
|
1238
1301
|
[:error, :class_in_def],
|
@@ -1666,6 +1729,11 @@ class TestParser < MiniTest::Unit::TestCase
|
|
1666
1729
|
%q{|;a|},
|
1667
1730
|
ALL_VERSIONS - %w(1.8))
|
1668
1731
|
|
1732
|
+
assert_parses_blockargs(
|
1733
|
+
s(:args, s(:shadowarg, :a)),
|
1734
|
+
%Q{|;\na\n|},
|
1735
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
1736
|
+
|
1669
1737
|
# tOROP
|
1670
1738
|
assert_parses_blockargs(
|
1671
1739
|
s(:args),
|
@@ -1915,6 +1983,32 @@ class TestParser < MiniTest::Unit::TestCase
|
|
1915
1983
|
%q{ ~~~~~ location})
|
1916
1984
|
end
|
1917
1985
|
|
1986
|
+
def test_arg_label
|
1987
|
+
assert_parses(
|
1988
|
+
s(:def, :foo, s(:args),
|
1989
|
+
s(:send, nil, :a, s(:sym, :b))),
|
1990
|
+
%q{def foo() a:b end},
|
1991
|
+
%q{},
|
1992
|
+
ALL_VERSIONS - %w(1.8))
|
1993
|
+
|
1994
|
+
assert_parses(
|
1995
|
+
s(:def, :foo, s(:args),
|
1996
|
+
s(:send, nil, :a, s(:sym, :b))),
|
1997
|
+
%Q{def foo\n a:b end},
|
1998
|
+
%q{},
|
1999
|
+
ALL_VERSIONS - %w(1.8))
|
2000
|
+
|
2001
|
+
assert_parses(
|
2002
|
+
s(:block,
|
2003
|
+
s(:send, nil, :f),
|
2004
|
+
s(:args),
|
2005
|
+
s(:send, nil, :a,
|
2006
|
+
s(:sym, :b))),
|
2007
|
+
%Q{f { || a:b }},
|
2008
|
+
%q{},
|
2009
|
+
ALL_VERSIONS - %w(1.8))
|
2010
|
+
end
|
2011
|
+
|
1918
2012
|
# def test_kwoptarg
|
1919
2013
|
# flunk
|
1920
2014
|
# end
|
@@ -2372,6 +2466,15 @@ class TestParser < MiniTest::Unit::TestCase
|
|
2372
2466
|
| ^ end
|
2373
2467
|
|~~~~~ expression},
|
2374
2468
|
ALL_VERSIONS - %w(1.8))
|
2469
|
+
|
2470
|
+
assert_parses(
|
2471
|
+
s(:block, s(:send, nil, :lambda),
|
2472
|
+
s(:args,
|
2473
|
+
s(:arg, :a)),
|
2474
|
+
s(:nil)),
|
2475
|
+
%q{-> (a) { }},
|
2476
|
+
%q{},
|
2477
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
2375
2478
|
end
|
2376
2479
|
|
2377
2480
|
def test_send_lambda_args_shadow
|
@@ -2651,11 +2754,6 @@ class TestParser < MiniTest::Unit::TestCase
|
|
2651
2754
|
s(:send, nil, :fun,
|
2652
2755
|
s(:send, s(:int, 1), :to_i)),
|
2653
2756
|
%q{fun (1).to_i})
|
2654
|
-
|
2655
|
-
assert_diagnoses(
|
2656
|
-
[:warning, :grouped_expression],
|
2657
|
-
%q{fun (1).to_i},
|
2658
|
-
%q{ ~~~ location})
|
2659
2757
|
end
|
2660
2758
|
|
2661
2759
|
def test_space_args_block_pass
|
@@ -2895,6 +2993,15 @@ class TestParser < MiniTest::Unit::TestCase
|
|
2895
2993
|
%q{ ^ begin (send)
|
2896
2994
|
| ^ end (send)},
|
2897
2995
|
%w(1.8))
|
2996
|
+
|
2997
|
+
assert_parses(
|
2998
|
+
s(:block,
|
2999
|
+
s(:send, nil, :fun,
|
3000
|
+
s(:nil)),
|
3001
|
+
s(:args), s(:nil)),
|
3002
|
+
%q{fun () {}},
|
3003
|
+
%q{ ~~ expression (send.nil)},
|
3004
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
2898
3005
|
end
|
2899
3006
|
|
2900
3007
|
#
|
@@ -2931,6 +3038,16 @@ class TestParser < MiniTest::Unit::TestCase
|
|
2931
3038
|
|~~~~~~~~~~ expression})
|
2932
3039
|
end
|
2933
3040
|
|
3041
|
+
def test_and_or_masgn_invalid
|
3042
|
+
assert_diagnoses(
|
3043
|
+
[:error, :masgn_as_condition],
|
3044
|
+
%q{foo && (a, b = bar)})
|
3045
|
+
|
3046
|
+
assert_diagnoses(
|
3047
|
+
[:error, :masgn_as_condition],
|
3048
|
+
%q{foo || (a, b = bar)})
|
3049
|
+
end
|
3050
|
+
|
2934
3051
|
# Branching
|
2935
3052
|
|
2936
3053
|
def test_if
|
@@ -3621,6 +3738,22 @@ class TestParser < MiniTest::Unit::TestCase
|
|
3621
3738
|
%q{ ~~~ location})
|
3622
3739
|
end
|
3623
3740
|
|
3741
|
+
#
|
3742
|
+
# Miscellanea
|
3743
|
+
#
|
3744
|
+
|
3745
|
+
def test_begin_cmdarg
|
3746
|
+
assert_parses(
|
3747
|
+
s(:send, nil, :p,
|
3748
|
+
s(:block,
|
3749
|
+
s(:send, s(:int, 1), :times),
|
3750
|
+
s(:args),
|
3751
|
+
s(:int, 1))),
|
3752
|
+
%q{p begin 1.times do 1 end end},
|
3753
|
+
%{},
|
3754
|
+
ALL_VERSIONS - %w(1.8 1.9))
|
3755
|
+
end
|
3756
|
+
|
3624
3757
|
#
|
3625
3758
|
# Error recovery
|
3626
3759
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Zotov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -150,6 +150,7 @@ files:
|
|
150
150
|
- LICENSE.txt
|
151
151
|
- README.md
|
152
152
|
- Rakefile
|
153
|
+
- TODO.md
|
153
154
|
- bin/benchmark
|
154
155
|
- bin/explain-parse
|
155
156
|
- bin/parse
|
@@ -168,6 +169,7 @@ files:
|
|
168
169
|
- lib/parser/lexer/stack_state.rb
|
169
170
|
- lib/parser/ruby18.y
|
170
171
|
- lib/parser/ruby19.y
|
172
|
+
- lib/parser/ruby20.y
|
171
173
|
- lib/parser/source/buffer.rb
|
172
174
|
- lib/parser/source/map.rb
|
173
175
|
- lib/parser/source/map/operator.rb
|
@@ -175,6 +177,7 @@ files:
|
|
175
177
|
- lib/parser/source/range.rb
|
176
178
|
- lib/parser/static_environment.rb
|
177
179
|
- lib/parser/syntax_error.rb
|
180
|
+
- parse.y.diff
|
178
181
|
- parser.gemspec
|
179
182
|
- test/helper.rb
|
180
183
|
- test/parse_helper.rb
|
@@ -191,6 +194,7 @@ files:
|
|
191
194
|
- lib/parser/lexer.rb
|
192
195
|
- lib/parser/ruby18.rb
|
193
196
|
- lib/parser/ruby19.rb
|
197
|
+
- lib/parser/ruby20.rb
|
194
198
|
homepage: http://github.com/whitequark/parser
|
195
199
|
licenses:
|
196
200
|
- MIT
|