parser 2.0.0 → 2.1.0.pre1

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 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.