parser 2.0.0 → 2.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf0b6a5c97a393fd82aae713e9a10d4aa2108a0f
4
- data.tar.gz: cf126c874ffc8d2430ccec47583b9dfca2afc7a1
3
+ metadata.gz: 85ff1f420d063d29c4d333d54a120569fd0429e9
4
+ data.tar.gz: f7fbd9186d41a3e8ca2561cbb590f8bde8067a6e
5
5
  SHA512:
6
- metadata.gz: 07a91a9884e3f0a22010c7cf60089de7b4bd4e0285df85771b9f0b52317d3b6930ba6bea44fa57c4c168723a92a3ccf4602b354a9e9e55ed7461e1009fa8431b
7
- data.tar.gz: c95ab5caef72d3c0f936def4dd0dcb28298fbc335c9558d9d642edcfb9398a7f2b6479983cd5406ca62512f07c864b1884f4d0269bb34fb7fe75182a5086984c
6
+ metadata.gz: 40f6351913140cd1b73bf9b2d2ada48dd56ce29dad4e7c08bb347762b5d36a9bac95aa5b2b59c9f46155d35fa2db7e6e3400da72ceabe6d847381d932886e030
7
+ data.tar.gz: d1f1581bffe9ebecbd6fa02eaac2125db6ce329203d2d28061361588101b8442ace659f1b53e9a09189a6430506bc3662f323d7bebadef3cf41c2b98eb43634c
data/CHANGELOG.md CHANGED
@@ -1,6 +1,17 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ v2.1.0.pre1 (2013-11-12)
5
+ ------------------------
6
+
7
+ API modifications:
8
+ * lexer.rl: correctly handle __END__ with non-whitespace after it (Peter Zotov)
9
+ * lexer.rl: handle \r in middle of a line as mere whitespace (Peter Zotov)
10
+ * ruby{18,19,20,21}.y, builders/default: precisely point to tUMINUS_NUM. (Peter Zotov)
11
+
12
+ Features implemented:
13
+ * lexer.rl, ruby21.y, builders/default: rational/complex literals. (Peter Zotov)
14
+
4
15
  v2.0.0 (2013-10-06)
5
16
  -------------------
6
17
 
@@ -26,6 +37,7 @@ v2.0.0.pre7 (2013-09-10)
26
37
 
27
38
  Features implemented:
28
39
  * Parser::Base: add #parse_with_comments, #parse_file_with_comments. (Trent Ogren)
40
+ * lexer.rl (Ruby 2.1): "1end": lex non-exponent `e' separate from number. (Peter Zotov)
29
41
 
30
42
  Bugs fixed:
31
43
  * lexer.rl: "->*{}": tLAMBEG at expr_beg (fixes #103). (Peter Zotov)
data/README.md CHANGED
@@ -15,7 +15,7 @@ Sponsored by [Evil Martians](http://evilmartians.com).
15
15
 
16
16
  ## Installation
17
17
 
18
- $ gem install parser -v=2.0
18
+ $ gem install parser
19
19
 
20
20
  ## Usage
21
21
 
@@ -31,11 +31,11 @@ Parse a chunk of code:
31
31
  Access the AST's source map:
32
32
 
33
33
  p Parser::CurrentRuby.parse("2 + 2").loc
34
- # #<Parser::Source::Map::Send:0x007fe5a1ac2388
35
- # @dot=nil,
36
- # @begin=nil,
37
- # @end=nil,
38
- # @selector=#<Source::Range (string) 2...3>,
34
+ # #<Parser::Source::Map::Send:0x007fe5a1ac2388
35
+ # @dot=nil,
36
+ # @begin=nil,
37
+ # @end=nil,
38
+ # @selector=#<Source::Range (string) 2...3>,
39
39
  # @expression=#<Source::Range (string) 0...5>>
40
40
 
41
41
  p Parser::CurrentRuby.parse("2 + 2").loc.selector.source
@@ -98,6 +98,7 @@ with Parser:
98
98
  * A simple interface and a powerful, tweakable one.
99
99
  * Parses 1.8, 1.9, 2.0 and 2.1 (preliminary) syntax with backwards-compatible
100
100
  AST formats.
101
+ * [Rewriting][rewriting] support.
101
102
  * Parsing error recovery.
102
103
  * Improved [clang-like][] diagnostic messages with location information.
103
104
  * Written in pure Ruby, runs on MRI 1.8.7 or >=1.9.2, JRuby and Rubinius in 1.8
@@ -111,6 +112,7 @@ with Parser:
111
112
  [ast]: http://rubygems.org/gems/ast
112
113
  [slop]: http://rubygems.org/gems/slop
113
114
  [insane-lexer]: http://whitequark.org/blog/2013/04/01/ruby-hacking-guide-ch-11-finite-state-lexer/
115
+ [rewriting]: http://whitequark.org/blog/2013/04/26/lets-play-with-ruby-code/
114
116
 
115
117
  ## Documentation
116
118
 
@@ -224,7 +226,7 @@ As of 2013-07-25, affected gems are: activerdf, activerdf_net7, fastreader, gkel
224
226
 
225
227
  ### Invalid Unicode escape sequences
226
228
 
227
- Ruby MRI 1.9+ permits to specify invalid UTF-8 sequences in Unicode escape sequences, such as `\u{d800}`.
229
+ Ruby MRI 1.9+ permits to specify invalid Unicode codepoints in Unicode escape sequences, such as `\u{d800}`.
228
230
 
229
231
  As of 2013-07-25, affected gems are: aws_cloud_search.
230
232
 
data/Rakefile CHANGED
@@ -65,7 +65,7 @@ task :changelog do
65
65
  end
66
66
  end
67
67
 
68
- IO.popen("git log --pretty='#{format}' HEAD", 'r') do |io|
68
+ IO.popen("git log --pretty='#{format}' 2.0 master", 'r') do |io|
69
69
  current_version = nil
70
70
 
71
71
  io.each_line do |line|
@@ -102,7 +102,7 @@ task :changelog do
102
102
  next unless commits[sigil].any?
103
103
 
104
104
  io.puts description
105
- commits[sigil].each do |commit|
105
+ commits[sigil].uniq.each do |commit|
106
106
  io.puts " * #{commit.gsub('<', '\<').lstrip}"
107
107
  end
108
108
  io.puts
data/doc/AST_FORMAT.md CHANGED
@@ -29,6 +29,11 @@ Format:
29
29
  (int 123)
30
30
  "123"
31
31
  ~~~ expression
32
+
33
+ (int -123)
34
+ "-123"
35
+ ^ operator
36
+ ~~~ expression
32
37
  ~~~
33
38
 
34
39
  ### Float
@@ -39,6 +44,11 @@ Format:
39
44
  (float 1.0)
40
45
  "1.0"
41
46
  ~~~ expression
47
+
48
+ (float -1.0)
49
+ "-1.0"
50
+ ^ operator
51
+ ~~~~ expression
42
52
  ~~~
43
53
 
44
54
  ### String
data/lib/parser.rb CHANGED
@@ -17,8 +17,10 @@ end
17
17
  module Parser
18
18
  require 'parser/version'
19
19
 
20
- require 'parser/ast/node'
21
- require 'parser/ast/processor'
20
+ module AST
21
+ require 'parser/ast/node'
22
+ require 'parser/ast/processor'
23
+ end
22
24
 
23
25
  module Source
24
26
  require 'parser/source/buffer'
@@ -21,8 +21,6 @@ module Parser
21
21
  alias on_erange process_regular_node
22
22
 
23
23
  def on_var(node)
24
- name, = *node
25
-
26
24
  node
27
25
  end
28
26
 
@@ -53,25 +53,42 @@ module Parser
53
53
 
54
54
  # Numerics
55
55
 
56
- def integer(integer_t, negate=false)
57
- val = value(integer_t)
58
- val = -val if negate
56
+ def integer(integer_t)
57
+ numeric(:int, integer_t)
58
+ end
59
59
 
60
- n(:int, [ val ],
61
- numeric_map(integer_t, negate))
60
+ def float(float_t)
61
+ numeric(:float, float_t)
62
62
  end
63
63
 
64
- def __LINE__(__LINE__t)
65
- n0(:__LINE__,
66
- token_map(__LINE__t))
64
+ def rational(rational_t)
65
+ numeric(:rational, rational_t)
67
66
  end
68
67
 
69
- def float(float_t, negate=false)
70
- val = value(float_t)
71
- val = -val if negate
68
+ def complex(complex_t)
69
+ numeric(:complex, complex_t)
70
+ end
71
+
72
+ def numeric(kind, token)
73
+ n(kind, [ value(token) ],
74
+ Source::Map::Operator.new(nil, loc(token)))
75
+ end
76
+ private :numeric
77
+
78
+ def negate(uminus_t, numeric)
79
+ value, = *numeric
80
+ operator_loc = loc(uminus_t)
81
+
82
+ numeric.updated(nil, [ -value ],
83
+ :location =>
84
+ Source::Map::Operator.new(
85
+ operator_loc,
86
+ operator_loc.join(numeric.loc.expression)))
87
+ end
72
88
 
73
- n(:float, [ val ],
74
- numeric_map(float_t, negate))
89
+ def __LINE__(__LINE__t)
90
+ n0(:__LINE__,
91
+ token_map(__LINE__t))
75
92
  end
76
93
 
77
94
  # Strings
@@ -1017,19 +1034,6 @@ module Parser
1017
1034
  Source::Map.new(loc(token))
1018
1035
  end
1019
1036
 
1020
- def numeric_map(num_t, negate)
1021
- if negate
1022
- num_range = loc(num_t)
1023
- range = Source::Range.new(num_range.source_buffer,
1024
- num_range.begin_pos - 1,
1025
- num_range.end_pos)
1026
-
1027
- Source::Map.new(range)
1028
- else
1029
- token_map(num_t)
1030
- end
1031
- end
1032
-
1033
1037
  def delimited_string_map(string_t)
1034
1038
  str_range = loc(string_t)
1035
1039
 
@@ -28,6 +28,10 @@ module Parser
28
28
  require 'parser/ruby20'
29
29
  CurrentRuby = Ruby20
30
30
 
31
+ when /^2\.1\./
32
+ require 'parser/ruby21'
33
+ CurrentRuby = Ruby21
34
+
31
35
  else # :nocov:
32
36
  raise NotImplementedError, "Parser does not support parsing Ruby #{RUBY_VERSION}"
33
37
  end
data/lib/parser/lexer.rl CHANGED
@@ -134,6 +134,8 @@ class Parser::Lexer
134
134
 
135
135
  @num_base = nil # last numeric base
136
136
  @num_digits_s = nil # starting position of numeric digits
137
+ @num_suffix_s = nil # starting position of numeric suffix
138
+ @num_xfrm = nil # numeric suffix-induced transformation
137
139
 
138
140
  @escape_s = nil # starting position of current sequence
139
141
  @escape = nil # last escaped sequence, as string
@@ -500,8 +502,7 @@ class Parser::Lexer
500
502
 
501
503
  # A list of operators which can occur within an assignment shortcut (+ → +=).
502
504
  operator_arithmetic = '&' | '|' | '&&' | '||' | '^' | '+' | '-' |
503
- '*' | '/' | '**' | '~' | '**' | '<<' | '>>' |
504
- '%' ;
505
+ '*' | '/' | '**' | '~' | '<<' | '>>' | '%' ;
505
506
 
506
507
  # A list of all user-definable operators not covered by groups above.
507
508
  operator_rest = '=~' | '!~' | '==' | '!=' | '!' | '===' |
@@ -570,6 +571,33 @@ class Parser::Lexer
570
571
 
571
572
  label = bareword [?!]? ':';
572
573
 
574
+ #
575
+ # === NUMERIC PARSING ===
576
+ #
577
+
578
+ int_hex = ( xdigit+ '_' )* xdigit* '_'? ;
579
+ int_dec = ( digit+ '_' )* digit* '_'? ;
580
+ int_bin = ( [01]+ '_' )* [01]* '_'? ;
581
+
582
+ flo_int = [1-9] [0-9]* ( '_' digit+ )* | '0';
583
+ flo_frac = '.' ( digit+ '_' )* digit+;
584
+ flo_pow = [eE] [+\-]? ( digit+ '_' )* digit+;
585
+
586
+ int_suffix =
587
+ '' % { @num_xfrm = lambda { |value| emit(:tINTEGER, value) } }
588
+ | 'r' % { @num_xfrm = lambda { |value| emit(:tRATIONAL, Rational(value)) } }
589
+ | 'i' % { @num_xfrm = lambda { |value| emit(:tIMAGINARY, Complex(0, value)) } }
590
+ | 'ri' % { @num_xfrm = lambda { |value| emit(:tIMAGINARY, Complex(0, Rational(value))) } };
591
+
592
+ flo_pow_suffix =
593
+ '' % { @num_xfrm = lambda { |digits| emit(:tFLOAT, Float(digits)) } }
594
+ | 'i' % { @num_xfrm = lambda { |digits| emit(:tIMAGINARY, Complex(0, Float(digits))) } };
595
+
596
+ flo_suffix =
597
+ flo_pow_suffix
598
+ | 'r' % { @num_xfrm = lambda { |digits| emit(:tRATIONAL, Rational(digits)) } }
599
+ | 'ri' % { @num_xfrm = lambda { |digits| emit(:tIMAGINARY, Complex(0, Rational(digits))) } };
600
+
573
601
  #
574
602
  # === ESCAPE SEQUENCE PARSING ===
575
603
  #
@@ -835,6 +863,11 @@ class Parser::Lexer
835
863
  if literal.heredoc?
836
864
  line = tok(@herebody_s, @ts).gsub(/\r+$/, '')
837
865
 
866
+ if version?(18, 19, 20)
867
+ # See ruby:c48b4209c
868
+ line = line.gsub(/\r.*$/, '')
869
+ end
870
+
838
871
  # Try ending the heredoc with the complete most recently
839
872
  # scanned line. @herebody_s always refers to the start of such line.
840
873
  if literal.nest_and_try_closing(line, @herebody_s, @ts)
@@ -1870,23 +1903,15 @@ class Parser::Lexer
1870
1903
  # NUMERIC LITERALS
1871
1904
  #
1872
1905
 
1873
- ( '0' [Xx] %{ @num_base = 16; @num_digits_s = p }
1874
- ( xdigit+ '_' )* xdigit* '_'?
1875
- | '0' [Dd] %{ @num_base = 10; @num_digits_s = p }
1876
- ( digit+ '_' )* digit* '_'?
1877
- | '0' [Oo] %{ @num_base = 8; @num_digits_s = p }
1878
- ( digit+ '_' )* digit* '_'?
1879
- | '0' [Bb] %{ @num_base = 2; @num_digits_s = p }
1880
- ( [01]+ '_' )* [01]* '_'?
1881
- | [1-9] digit*
1882
- %{ @num_base = 10; @num_digits_s = @ts }
1883
- ( '_' digit+ )* digit* '_'?
1884
- | '0' digit*
1885
- %{ @num_base = 8; @num_digits_s = @ts }
1886
- ( '_' digit+ )* digit* '_'?
1887
- )
1906
+ ( '0' [Xx] %{ @num_base = 16; @num_digits_s = p } int_hex
1907
+ | '0' [Dd] %{ @num_base = 10; @num_digits_s = p } int_dec
1908
+ | '0' [Oo] %{ @num_base = 8; @num_digits_s = p } int_dec
1909
+ | '0' [Bb] %{ @num_base = 2; @num_digits_s = p } int_bin
1910
+ | [1-9] digit* '_'? %{ @num_base = 10; @num_digits_s = @ts } int_dec
1911
+ | '0' digit* '_'? %{ @num_base = 8; @num_digits_s = @ts } int_dec
1912
+ ) %{ @num_suffix_s = p } int_suffix
1888
1913
  => {
1889
- digits = tok(@num_digits_s)
1914
+ digits = tok(@num_digits_s, @num_suffix_s)
1890
1915
 
1891
1916
  if digits.end_with? '_'
1892
1917
  diagnostic :error, Parser::ERRORS[:trailing_in_number] % { :character => '_' },
@@ -1902,27 +1927,57 @@ class Parser::Lexer
1902
1927
  range(invalid_s, invalid_s + 1)
1903
1928
  end
1904
1929
 
1905
- emit(:tINTEGER, digits.to_i(@num_base))
1930
+ if version?(18, 19, 20)
1931
+ emit(:tINTEGER, digits.to_i(@num_base))
1932
+ p = @num_suffix_s - 1
1933
+ else
1934
+ @num_xfrm.call(digits.to_i(@num_base))
1935
+ end
1906
1936
  fbreak;
1907
1937
  };
1908
1938
 
1909
- '.' ( digit+ '_' )* digit+
1939
+ flo_frac flo_pow?
1910
1940
  => {
1911
1941
  diagnostic :error, Parser::ERRORS[:no_dot_digit_literal]
1912
1942
  };
1913
1943
 
1914
- (
1915
- ( [1-9] [0-9]* ( '_' digit+ )* | '0' )
1916
- ( '.' ( digit+ '_' )* digit+ )?
1917
- ( [eE] [+\-]? ( digit+ '_' )* digit* )?
1918
- )
1944
+ flo_int [eE]
1919
1945
  => {
1920
- if tok.end_with? 'e'
1921
- diagnostic :error, Parser::ERRORS[:trailing_in_number] % { :character => 'e' },
1946
+ if version?(18, 19, 20)
1947
+ diagnostic :error,
1948
+ Parser::ERRORS[:trailing_in_number] % { :character => tok(@te - 1, @te) },
1922
1949
  range(@te - 1, @te)
1950
+ else
1951
+ emit(:tINTEGER, tok(@ts, @te - 1).to_i)
1952
+ fhold; fbreak;
1923
1953
  end
1954
+ };
1924
1955
 
1925
- emit(:tFLOAT, tok.to_f)
1956
+ flo_int flo_frac [eE]
1957
+ => {
1958
+ if version?(18, 19, 20)
1959
+ diagnostic :error,
1960
+ Parser::ERRORS[:trailing_in_number] % { :character => tok(@te - 1, @te) },
1961
+ range(@te - 1, @te)
1962
+ else
1963
+ emit(:tFLOAT, tok(@ts, @te - 1).to_f)
1964
+ fhold; fbreak;
1965
+ end
1966
+ };
1967
+
1968
+ flo_int
1969
+ ( flo_frac? flo_pow %{ @num_suffix_s = p } flo_pow_suffix
1970
+ | flo_frac %{ @num_suffix_s = p } flo_suffix
1971
+ )
1972
+ => {
1973
+ digits = tok(@ts, @num_suffix_s)
1974
+
1975
+ if version?(18, 19, 20)
1976
+ emit(:tFLOAT, Float(digits))
1977
+ p = @num_suffix_s - 1
1978
+ else
1979
+ @num_xfrm.call(digits)
1980
+ end
1926
1981
  fbreak;
1927
1982
  };
1928
1983
 
@@ -2077,8 +2132,8 @@ class Parser::Lexer
2077
2132
  => { @eq_begin_s = @ts
2078
2133
  fgoto line_comment; };
2079
2134
 
2080
- '__END__' c_nl_zlen
2081
- => { p = pe - 1 };
2135
+ '__END__' ( c_eol - zlen )
2136
+ => { p = pe - 3 };
2082
2137
 
2083
2138
  c_any
2084
2139
  => { fhold; fgoto expr_value; };
data/lib/parser/ruby18.y CHANGED
@@ -1619,11 +1619,13 @@ xstring_contents: # nothing
1619
1619
  }
1620
1620
  | tUMINUS_NUM tINTEGER =tLOWEST
1621
1621
  {
1622
- result = @builder.integer(val[1], true)
1622
+ result = @builder.negate(val[0],
1623
+ @builder.integer(val[1]))
1623
1624
  }
1624
1625
  | tUMINUS_NUM tFLOAT =tLOWEST
1625
1626
  {
1626
- result = @builder.float(val[1], true)
1627
+ result = @builder.negate(val[0],
1628
+ @builder.float(val[1]))
1627
1629
  }
1628
1630
 
1629
1631
  variable: tIDENTIFIER
data/lib/parser/ruby19.y CHANGED
@@ -1749,11 +1749,13 @@ regexp_contents: # nothing
1749
1749
  }
1750
1750
  | tUMINUS_NUM tINTEGER =tLOWEST
1751
1751
  {
1752
- result = @builder.integer(val[1], true)
1752
+ result = @builder.negate(val[0],
1753
+ @builder.integer(val[1]))
1753
1754
  }
1754
1755
  | tUMINUS_NUM tFLOAT =tLOWEST
1755
1756
  {
1756
- result = @builder.float(val[1], true)
1757
+ result = @builder.negate(val[0],
1758
+ @builder.float(val[1]))
1757
1759
  }
1758
1760
 
1759
1761
  user_variable: tIDENTIFIER
data/lib/parser/ruby20.y CHANGED
@@ -1842,11 +1842,13 @@ regexp_contents: # nothing
1842
1842
  }
1843
1843
  | tUMINUS_NUM tINTEGER =tLOWEST
1844
1844
  {
1845
- result = @builder.integer(val[1], true)
1845
+ result = @builder.negate(val[0],
1846
+ @builder.integer(val[1]))
1846
1847
  }
1847
1848
  | tUMINUS_NUM tFLOAT =tLOWEST
1848
1849
  {
1849
- result = @builder.float(val[1], true)
1850
+ result = @builder.negate(val[0],
1851
+ @builder.float(val[1]))
1850
1852
  }
1851
1853
 
1852
1854
  user_variable: tIDENTIFIER
data/lib/parser/ruby21.y CHANGED
@@ -17,6 +17,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
17
17
  tWORDS_BEG tQWORDS_BEG tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DBEG
18
18
  tSTRING_DVAR tSTRING_END tSTRING_DEND tSTRING tSYMBOL
19
19
  tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG tCHARACTER
20
+ tRATIONAL tIMAGINARY
20
21
 
21
22
  prechigh
22
23
  right tBANG tTILDE tUPLUS
@@ -689,19 +690,11 @@ rule
689
690
  {
690
691
  result = @builder.binary_op(val[0], val[1], val[2])
691
692
  }
692
- | tUMINUS_NUM tINTEGER tPOW arg
693
+ | tUMINUS_NUM simple_numeric tPOW arg
693
694
  {
694
695
  result = @builder.unary_op(val[0],
695
696
  @builder.binary_op(
696
- @builder.integer(val[1]),
697
- val[2], val[3]))
698
- }
699
- | tUMINUS_NUM tFLOAT tPOW arg
700
- {
701
- result = @builder.unary_op(val[0],
702
- @builder.binary_op(
703
- @builder.float(val[1]),
704
- val[2], val[3]))
697
+ val[1], val[2], val[3]))
705
698
  }
706
699
  | tUPLUS arg
707
700
  {
@@ -1235,8 +1228,6 @@ rule
1235
1228
 
1236
1229
  f_marg: f_norm_arg
1237
1230
  {
1238
- @static_env.declare val[0][0]
1239
-
1240
1231
  result = @builder.arg(val[0])
1241
1232
  }
1242
1233
  | tLPAREN f_margs rparen
@@ -1256,15 +1247,11 @@ rule
1256
1247
  f_margs: f_marg_list
1257
1248
  | f_marg_list tCOMMA tSTAR f_norm_arg
1258
1249
  {
1259
- @static_env.declare val[3][0]
1260
-
1261
1250
  result = val[0].
1262
1251
  push(@builder.restarg(val[2], val[3]))
1263
1252
  }
1264
1253
  | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1265
1254
  {
1266
- @static_env.declare val[3][0]
1267
-
1268
1255
  result = val[0].
1269
1256
  push(@builder.restarg(val[2], val[3])).
1270
1257
  concat(val[5])
@@ -1282,14 +1269,10 @@ rule
1282
1269
  }
1283
1270
  | tSTAR f_norm_arg
1284
1271
  {
1285
- @static_env.declare val[1][0]
1286
-
1287
1272
  result = [ @builder.restarg(val[0], val[1]) ]
1288
1273
  }
1289
1274
  | tSTAR f_norm_arg tCOMMA f_marg_list
1290
1275
  {
1291
- @static_env.declare val[1][0]
1292
-
1293
1276
  result = [ @builder.restarg(val[0], val[1]),
1294
1277
  *val[3] ]
1295
1278
  }
@@ -1829,7 +1812,16 @@ regexp_contents: # nothing
1829
1812
  result = @builder.symbol_compose(val[0], val[1], val[2])
1830
1813
  }
1831
1814
 
1832
- numeric: tINTEGER
1815
+ numeric: simple_numeric
1816
+ {
1817
+ result = val[0]
1818
+ }
1819
+ | tUMINUS_NUM simple_numeric =tLOWEST
1820
+ {
1821
+ result = @builder.negate(val[0], val[1])
1822
+ }
1823
+
1824
+ simple_numeric: tINTEGER
1833
1825
  {
1834
1826
  result = @builder.integer(val[0])
1835
1827
  }
@@ -1837,13 +1829,13 @@ regexp_contents: # nothing
1837
1829
  {
1838
1830
  result = @builder.float(val[0])
1839
1831
  }
1840
- | tUMINUS_NUM tINTEGER =tLOWEST
1832
+ | tRATIONAL
1841
1833
  {
1842
- result = @builder.integer(val[1], true)
1834
+ result = @builder.rational(val[0])
1843
1835
  }
1844
- | tUMINUS_NUM tFLOAT =tLOWEST
1836
+ | tIMAGINARY
1845
1837
  {
1846
- result = @builder.float(val[1], true)
1838
+ result = @builder.complex(val[0])
1847
1839
  }
1848
1840
 
1849
1841
  user_variable: tIDENTIFIER
@@ -2087,11 +2079,14 @@ keyword_variable: kNIL
2087
2079
 
2088
2080
  f_norm_arg: f_bad_arg
2089
2081
  | tIDENTIFIER
2090
-
2091
- f_arg_item: f_norm_arg
2092
2082
  {
2093
2083
  @static_env.declare val[0][0]
2094
2084
 
2085
+ result = val[0]
2086
+ }
2087
+
2088
+ f_arg_item: f_norm_arg
2089
+ {
2095
2090
  result = @builder.arg(val[0])
2096
2091
  }
2097
2092
  | tLPAREN f_margs rparen
@@ -2108,37 +2103,30 @@ keyword_variable: kNIL
2108
2103
  result = val[0] << val[2]
2109
2104
  }
2110
2105
 
2111
- f_kw: tLABEL arg_value
2106
+ f_label: tLABEL
2112
2107
  {
2113
2108
  check_kwarg_name(val[0])
2114
2109
 
2115
2110
  @static_env.declare val[0][0]
2116
2111
 
2112
+ result = val[0]
2113
+ }
2114
+
2115
+ f_kw: f_label arg_value
2116
+ {
2117
2117
  result = @builder.kwoptarg(val[0], val[1])
2118
2118
  }
2119
- | tLABEL
2119
+ | f_label
2120
2120
  {
2121
- check_kwarg_name(val[0])
2122
-
2123
- @static_env.declare val[0][0]
2124
-
2125
2121
  result = @builder.kwarg(val[0])
2126
2122
  }
2127
2123
 
2128
- f_block_kw: tLABEL primary_value
2124
+ f_block_kw: f_label primary_value
2129
2125
  {
2130
- check_kwarg_name(val[0])
2131
-
2132
- @static_env.declare val[0][0]
2133
-
2134
2126
  result = @builder.kwoptarg(val[0], val[1])
2135
2127
  }
2136
- | tLABEL
2128
+ | f_label
2137
2129
  {
2138
- check_kwarg_name(val[0])
2139
-
2140
- @static_env.declare val[0][0]
2141
-
2142
2130
  result = @builder.kwarg(val[0])
2143
2131
  }
2144
2132
 
@@ -2173,17 +2161,13 @@ keyword_variable: kNIL
2173
2161
  result = [ @builder.kwrestarg(val[0]) ]
2174
2162
  }
2175
2163
 
2176
- f_opt: tIDENTIFIER tEQL arg_value
2164
+ f_opt: f_norm_arg tEQL arg_value
2177
2165
  {
2178
- @static_env.declare val[0][0]
2179
-
2180
2166
  result = @builder.optarg(val[0], val[1], val[2])
2181
2167
  }
2182
2168
 
2183
- f_block_opt: tIDENTIFIER tEQL primary_value
2169
+ f_block_opt: f_norm_arg tEQL primary_value
2184
2170
  {
2185
- @static_env.declare val[0][0]
2186
-
2187
2171
  result = @builder.optarg(val[0], val[1], val[2])
2188
2172
  }
2189
2173
 
@@ -1,3 +1,3 @@
1
1
  module Parser
2
- VERSION = '2.0.0'
2
+ VERSION = '2.1.0.pre1'
3
3
  end
data/parser.gemspec CHANGED
@@ -29,18 +29,19 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_development_dependency 'bundler', '~> 1.2'
31
31
  spec.add_development_dependency 'rake', '~> 0.9'
32
- spec.add_development_dependency 'racc'
32
+ spec.add_development_dependency 'racc', '= 1.4.9' # update to 1.4.11 when it's done
33
+ spec.add_development_dependency 'cliver', '~> 0.3.0'
34
+
35
+ spec.add_development_dependency 'yard'
36
+ spec.add_development_dependency 'kramdown'
33
37
 
34
38
  spec.add_development_dependency 'minitest', '~> 5.0'
35
39
  spec.add_development_dependency 'simplecov', '~> 0.7'
36
40
  spec.add_development_dependency 'coveralls'
37
41
  spec.add_development_dependency 'json_pure' # for coveralls on 1.9.2
38
- spec.add_development_dependency 'cliver', '~> 0.2.2' # executable version detection
42
+ spec.add_development_dependency 'mime-types', '~> 1.25' # for coveralls on 1.8.7
39
43
 
40
44
  spec.add_development_dependency 'simplecov-sublime-ruby-coverage'
41
45
 
42
- spec.add_development_dependency 'yard'
43
- spec.add_development_dependency 'kramdown'
44
-
45
46
  spec.add_development_dependency 'gauntlet'
46
47
  end
data/test/test_current.rb CHANGED
@@ -10,6 +10,8 @@ class TestCurrent < Minitest::Test
10
10
  assert_equal Parser::Ruby19, Parser::CurrentRuby
11
11
  when '2.0.0'
12
12
  assert_equal Parser::Ruby20, Parser::CurrentRuby
13
+ when '2.1.0'
14
+ assert_equal Parser::Ruby21, Parser::CurrentRuby
13
15
  else
14
16
  flunk "Update test_parser_current for #{RUBY_VERSION}"
15
17
  end
data/test/test_lexer.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
3
  require 'helper'
4
+ require 'complex'
4
5
 
5
6
  class TestLexer < Minitest::Test
6
7
  def setup_lexer(version)
@@ -86,7 +87,7 @@ class TestLexer < Minitest::Test
86
87
 
87
88
  lex_token, (lex_value, *) = @lex.advance
88
89
  assert lex_token, 'no more tokens'
89
- assert_equal [token, value], [lex_token, lex_value], input
90
+ assert_operator [lex_token, lex_value], :eql?, [token, value], input
90
91
  end
91
92
 
92
93
  lex_token, (lex_value, *) = @lex.advance
@@ -646,6 +647,24 @@ class TestLexer < Minitest::Test
646
647
  assert_scanned "0e0", :tFLOAT, 0e0
647
648
  end
648
649
 
650
+ def test_float_e_nothing
651
+ [18, 19, 20].each do |version|
652
+ setup_lexer version
653
+
654
+ refute_scanned "1end"
655
+ refute_scanned "1.1end"
656
+ end
657
+
658
+ setup_lexer 21
659
+
660
+ assert_scanned("1end",
661
+ :tINTEGER, 1,
662
+ :kEND, 'end')
663
+ assert_scanned("1.1end",
664
+ :tFLOAT, 1.1,
665
+ :kEND, 'end')
666
+ end
667
+
649
668
  def test_float_neg
650
669
  assert_scanned("-1.0",
651
670
  :tUMINUS_NUM, "-",
@@ -2109,13 +2128,14 @@ class TestLexer < Minitest::Test
2109
2128
  end
2110
2129
 
2111
2130
  def test_underscore_end
2112
- source_buffer = Parser::Source::Buffer.new('(underscore_end)')
2113
- source_buffer.source = "__END__\n"
2114
-
2115
- @lex.source_buffer = source_buffer
2116
-
2117
- tok, = @lex.advance
2118
- refute tok
2131
+ assert_scanned("__END__\n")
2132
+ assert_scanned("__END__")
2133
+ assert_scanned("__END__ foo",
2134
+ :tIDENTIFIER, '__END__',
2135
+ :tIDENTIFIER, 'foo')
2136
+ assert_scanned("__END__\rfoo",
2137
+ :tIDENTIFIER, '__END__',
2138
+ :tIDENTIFIER, 'foo')
2119
2139
  end
2120
2140
 
2121
2141
  def test_uplus
@@ -2163,6 +2183,71 @@ class TestLexer < Minitest::Test
2163
2183
  :tRBRACK, "]")
2164
2184
  end
2165
2185
 
2186
+ def test_int_suffix
2187
+ [18, 19, 20].each do |version|
2188
+ setup_lexer version
2189
+
2190
+ assert_scanned("42r",
2191
+ :tINTEGER, 42,
2192
+ :tIDENTIFIER, 'r')
2193
+
2194
+ assert_scanned("42if",
2195
+ :tINTEGER, 42,
2196
+ :kIF_MOD, 'if')
2197
+ end
2198
+
2199
+ setup_lexer 21
2200
+
2201
+ assert_scanned("42r", :tRATIONAL, Rational(42))
2202
+ assert_scanned("42i", :tIMAGINARY, Complex(0, 42))
2203
+ assert_scanned("42ri", :tIMAGINARY, Complex(0, Rational(42)))
2204
+ end
2205
+
2206
+ def test_float_suffix
2207
+ [18, 19, 20].each do |version|
2208
+ setup_lexer version
2209
+
2210
+ assert_scanned("42.1r",
2211
+ :tFLOAT, 42.1,
2212
+ :tIDENTIFIER, 'r')
2213
+
2214
+ assert_scanned("42.1if",
2215
+ :tFLOAT, 42.1,
2216
+ :kIF_MOD, 'if')
2217
+
2218
+ assert_scanned("1e1r",
2219
+ :tFLOAT, 1e1,
2220
+ :tIDENTIFIER, 'r')
2221
+ end
2222
+
2223
+ begin
2224
+ # Feature-check.
2225
+ Rational("10")
2226
+
2227
+ setup_lexer 21
2228
+
2229
+ assert_scanned("42.1r", :tRATIONAL, Rational(421, 10))
2230
+ assert_scanned("42.1i", :tIMAGINARY, Complex(0, 42.1))
2231
+ assert_scanned("42.1ri", :tIMAGINARY, Complex(0, Rational(421, 10)))
2232
+ assert_scanned("42.1ir",
2233
+ :tIMAGINARY, Complex(0, 42.1),
2234
+ :tIDENTIFIER, 'r')
2235
+
2236
+ assert_scanned("1e1i", :tIMAGINARY, Complex(0, 1e1))
2237
+ assert_scanned("1e1r",
2238
+ :tFLOAT, 1e1,
2239
+ :tIDENTIFIER, 'r')
2240
+ assert_scanned("1e1ri",
2241
+ :tFLOAT, 1e1,
2242
+ :tIDENTIFIER, 'ri')
2243
+ assert_scanned("1e1ir",
2244
+ :tIMAGINARY, Complex(0, 1e1),
2245
+ :tIDENTIFIER, 'r')
2246
+ rescue NoMethodError
2247
+ # Ruby not modern enough
2248
+ end
2249
+ end
2250
+
2166
2251
  #
2167
2252
  # Tests for whitespace.
2168
2253
  #
@@ -2407,6 +2492,19 @@ class TestLexer < Minitest::Test
2407
2492
  :tINTEGER, 1)
2408
2493
  end
2409
2494
 
2495
+ def test_whitespace_cr
2496
+ setup_lexer(20)
2497
+ assert_scanned("<<E\nfoo\nE\rO",
2498
+ :tSTRING_BEG, '"',
2499
+ :tSTRING_CONTENT, "foo\n",
2500
+ :tSTRING_END, 'E',
2501
+ :tNL, nil)
2502
+
2503
+ setup_lexer(21)
2504
+ refute_scanned("<<E\nfoo\nE\rO",
2505
+ :tSTRING_BEG, '"',
2506
+ :tSTRING_CONTENT, "foo\n")
2507
+ end
2410
2508
 
2411
2509
  #
2412
2510
  # Tests for bugs.
data/test/test_parser.rb CHANGED
@@ -92,7 +92,8 @@ class TestParser < Minitest::Test
92
92
  assert_parses(
93
93
  s(:int, -42),
94
94
  %q{-42},
95
- %q{~~~ expression})
95
+ %q{^ operator
96
+ |~~~ expression})
96
97
  end
97
98
 
98
99
  def test_int___LINE__
@@ -111,7 +112,48 @@ class TestParser < Minitest::Test
111
112
  assert_parses(
112
113
  s(:float, -1.33),
113
114
  %q{-1.33},
114
- %q{~~~~~ expression})
115
+ %q{^ operator
116
+ |~~~~~ expression})
117
+ end
118
+
119
+ def test_rational
120
+ assert_parses(
121
+ s(:rational, Rational(42)),
122
+ %q{42r},
123
+ %q{~~~ expression},
124
+ ALL_VERSIONS - %w(1.8 1.9 2.0))
125
+
126
+ assert_parses(
127
+ s(:rational, Rational(421, 10)),
128
+ %q{42.1r},
129
+ %q{~~~~~ expression},
130
+ ALL_VERSIONS - %w(1.8 1.9 2.0))
131
+ end
132
+
133
+ def test_complex
134
+ assert_parses(
135
+ s(:complex, Complex(0, 42)),
136
+ %q{42i},
137
+ %q{~~~ expression},
138
+ ALL_VERSIONS - %w(1.8 1.9 2.0))
139
+
140
+ assert_parses(
141
+ s(:complex, Complex(0, Rational(42))),
142
+ %q{42ri},
143
+ %q{~~~~ expression},
144
+ ALL_VERSIONS - %w(1.8 1.9 2.0))
145
+
146
+ assert_parses(
147
+ s(:complex, Complex(0, 42.1)),
148
+ %q{42.1i},
149
+ %q{~~~~~ expression},
150
+ ALL_VERSIONS - %w(1.8 1.9 2.0))
151
+
152
+ assert_parses(
153
+ s(:complex, Complex(0, Rational(421, 10))),
154
+ %q{42.1ri},
155
+ %q{~~~~~~ expression},
156
+ ALL_VERSIONS - %w(1.8 1.9 2.0))
115
157
  end
116
158
 
117
159
  # Strings
metadata CHANGED
@@ -1,215 +1,229 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0.pre1
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-10-05 00:00:00.000000000 Z
11
+ date: 2013-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ast
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: slop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '3.4'
34
- - - '>='
34
+ - - ">="
35
35
  - !ruby/object:Gem::Version
36
36
  version: 3.4.5
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - ~>
41
+ - - "~>"
42
42
  - !ruby/object:Gem::Version
43
43
  version: '3.4'
44
- - - '>='
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 3.4.5
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ~>
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '1.2'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ~>
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '1.2'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rake
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ~>
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
67
  version: '0.9'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ~>
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0.9'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: racc
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - '>='
79
+ - - '='
80
80
  - !ruby/object:Gem::Version
81
- version: '0'
81
+ version: 1.4.9
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - '>='
86
+ - - '='
87
87
  - !ruby/object:Gem::Version
88
- version: '0'
88
+ version: 1.4.9
89
89
  - !ruby/object:Gem::Dependency
90
- name: minitest
90
+ name: cliver
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - ~>
93
+ - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '5.0'
95
+ version: 0.3.0
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - ~>
100
+ - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '5.0'
102
+ version: 0.3.0
103
103
  - !ruby/object:Gem::Dependency
104
- name: simplecov
104
+ name: yard
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - ~>
107
+ - - ">="
108
108
  - !ruby/object:Gem::Version
109
- version: '0.7'
109
+ version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
- - - ~>
114
+ - - ">="
115
115
  - !ruby/object:Gem::Version
116
- version: '0.7'
116
+ version: '0'
117
117
  - !ruby/object:Gem::Dependency
118
- name: coveralls
118
+ name: kramdown
119
119
  requirement: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - '>='
121
+ - - ">="
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0'
124
124
  type: :development
125
125
  prerelease: false
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - '>='
128
+ - - ">="
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0'
131
131
  - !ruby/object:Gem::Dependency
132
- name: json_pure
132
+ name: minitest
133
133
  requirement: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - '>='
135
+ - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: '0'
137
+ version: '5.0'
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
- - - '>='
142
+ - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: '0'
144
+ version: '5.0'
145
145
  - !ruby/object:Gem::Dependency
146
- name: cliver
146
+ name: simplecov
147
147
  requirement: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - ~>
149
+ - - "~>"
150
150
  - !ruby/object:Gem::Version
151
- version: 0.2.2
151
+ version: '0.7'
152
152
  type: :development
153
153
  prerelease: false
154
154
  version_requirements: !ruby/object:Gem::Requirement
155
155
  requirements:
156
- - - ~>
156
+ - - "~>"
157
157
  - !ruby/object:Gem::Version
158
- version: 0.2.2
158
+ version: '0.7'
159
159
  - !ruby/object:Gem::Dependency
160
- name: simplecov-sublime-ruby-coverage
160
+ name: coveralls
161
161
  requirement: !ruby/object:Gem::Requirement
162
162
  requirements:
163
- - - '>='
163
+ - - ">="
164
164
  - !ruby/object:Gem::Version
165
165
  version: '0'
166
166
  type: :development
167
167
  prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  requirements:
170
- - - '>='
170
+ - - ">="
171
171
  - !ruby/object:Gem::Version
172
172
  version: '0'
173
173
  - !ruby/object:Gem::Dependency
174
- name: yard
174
+ name: json_pure
175
175
  requirement: !ruby/object:Gem::Requirement
176
176
  requirements:
177
- - - '>='
177
+ - - ">="
178
178
  - !ruby/object:Gem::Version
179
179
  version: '0'
180
180
  type: :development
181
181
  prerelease: false
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
- - - '>='
184
+ - - ">="
185
185
  - !ruby/object:Gem::Version
186
186
  version: '0'
187
187
  - !ruby/object:Gem::Dependency
188
- name: kramdown
188
+ name: mime-types
189
189
  requirement: !ruby/object:Gem::Requirement
190
190
  requirements:
191
- - - '>='
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '1.25'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '1.25'
201
+ - !ruby/object:Gem::Dependency
202
+ name: simplecov-sublime-ruby-coverage
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
192
206
  - !ruby/object:Gem::Version
193
207
  version: '0'
194
208
  type: :development
195
209
  prerelease: false
196
210
  version_requirements: !ruby/object:Gem::Requirement
197
211
  requirements:
198
- - - '>='
212
+ - - ">="
199
213
  - !ruby/object:Gem::Version
200
214
  version: '0'
201
215
  - !ruby/object:Gem::Dependency
202
216
  name: gauntlet
203
217
  requirement: !ruby/object:Gem::Requirement
204
218
  requirements:
205
- - - '>='
219
+ - - ">="
206
220
  - !ruby/object:Gem::Version
207
221
  version: '0'
208
222
  type: :development
209
223
  prerelease: false
210
224
  version_requirements: !ruby/object:Gem::Requirement
211
225
  requirements:
212
- - - '>='
226
+ - - ">="
213
227
  - !ruby/object:Gem::Version
214
228
  version: '0'
215
229
  description: A Ruby parser written in pure Ruby.
@@ -221,10 +235,10 @@ executables:
221
235
  extensions: []
222
236
  extra_rdoc_files: []
223
237
  files:
224
- - .gitignore
225
- - .rubocop.yml
226
- - .travis.yml
227
- - .yardopts
238
+ - ".gitignore"
239
+ - ".rubocop.yml"
240
+ - ".travis.yml"
241
+ - ".yardopts"
228
242
  - CHANGELOG.md
229
243
  - CONTRIBUTING.md
230
244
  - Gemfile
@@ -250,14 +264,19 @@ files:
250
264
  - lib/parser/current.rb
251
265
  - lib/parser/diagnostic.rb
252
266
  - lib/parser/diagnostic/engine.rb
267
+ - lib/parser/lexer.rb
253
268
  - lib/parser/lexer.rl
254
269
  - lib/parser/lexer/explanation.rb
255
270
  - lib/parser/lexer/literal.rb
256
271
  - lib/parser/lexer/stack_state.rb
257
272
  - lib/parser/rewriter.rb
273
+ - lib/parser/ruby18.rb
258
274
  - lib/parser/ruby18.y
275
+ - lib/parser/ruby19.rb
259
276
  - lib/parser/ruby19.y
277
+ - lib/parser/ruby20.rb
260
278
  - lib/parser/ruby20.y
279
+ - lib/parser/ruby21.rb
261
280
  - lib/parser/ruby21.y
262
281
  - lib/parser/runner.rb
263
282
  - lib/parser/runner/ruby_parse.rb
@@ -302,11 +321,6 @@ files:
302
321
  - test/test_source_rewriter.rb
303
322
  - test/test_source_rewriter_action.rb
304
323
  - test/test_static_environment.rb
305
- - lib/parser/lexer.rb
306
- - lib/parser/ruby18.rb
307
- - lib/parser/ruby19.rb
308
- - lib/parser/ruby20.rb
309
- - lib/parser/ruby21.rb
310
324
  homepage: http://github.com/whitequark/parser
311
325
  licenses:
312
326
  - MIT
@@ -317,17 +331,17 @@ require_paths:
317
331
  - lib
318
332
  required_ruby_version: !ruby/object:Gem::Requirement
319
333
  requirements:
320
- - - '>='
334
+ - - ">="
321
335
  - !ruby/object:Gem::Version
322
336
  version: '0'
323
337
  required_rubygems_version: !ruby/object:Gem::Requirement
324
338
  requirements:
325
- - - '>='
339
+ - - ">"
326
340
  - !ruby/object:Gem::Version
327
- version: '0'
341
+ version: 1.3.1
328
342
  requirements: []
329
343
  rubyforge_project:
330
- rubygems_version: 2.0.0
344
+ rubygems_version: 2.2.0.preview.1
331
345
  signing_key:
332
346
  specification_version: 4
333
347
  summary: A Ruby parser written in pure Ruby.