antlr3 1.8.2 → 1.8.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,21 @@
1
+ === 1.8.5 / 10-21-10
2
+
3
+ * 1 Bug Fix
4
+ - fixed ANTLR3::InteractiveStringStream to work with Ruby 1.9. The lexer main script
5
+ should function in interactive mode for Ruby 1.9 now.
6
+
7
+ === 1.8.4 / 10-08-10
8
+
9
+ * 1 Bug Fix
10
+ - removed directory dependency from tasks created by ANTLR3::Task, which caused
11
+ compilation to be performed twice in some situations
12
+
13
+ === 1.8.3 / 10-08-10
14
+
15
+ * 2 Bug Fixes
16
+ - fixed typo in TokenRewriteStream#cast_range
17
+ - added work-around code to handle the lack of support for StopIteration in Rubinius
18
+
1
19
  === 1.8.2 / 10-02-10
2
20
 
3
21
  * Bug Fix: removed references to Parser#token_stream
data/lib/antlr3/error.rb CHANGED
@@ -36,6 +36,12 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
36
  # - ported from the ANTLR3 Python Runtime library by
37
37
  # Kyle Yetter (kcy5b@yahoo.com)
38
38
  module ANTLR3
39
+
40
+ # for compatibility with rubinius, which does not implement StopIteration yet
41
+ unless defined?( StopIteration )
42
+ StopIteration = Class.new( StandardError )
43
+ end
44
+
39
45
  module Error
40
46
 
41
47
  =begin rdoc ANTLR3::Error::BacktrackingFailed
data/lib/antlr3/main.rb CHANGED
@@ -382,6 +382,7 @@ class ParserMain < Main
382
382
  @port = options.fetch( :port, ANTLR3::Debug::DEFAULT_PORT )
383
383
  @log = options.fetch( :log, @error )
384
384
  end
385
+ @profile = ( @parser_class.profile? rescue false )
385
386
  end
386
387
 
387
388
  def setup_options( opt )
@@ -456,6 +457,7 @@ class ParserMain < Main
456
457
  # token_stream = CommonTokenStream.new( lexer )
457
458
  parser = @parser_class.new( lexer, parser_options )
458
459
  result = parser.send( @parser_rule ) and present( result )
460
+ @profile and puts( parser.generate_report )
459
461
  end
460
462
 
461
463
  def present( return_value )
@@ -44,6 +44,15 @@ switch.
44
44
  module ParserEvents
45
45
  include ANTLR3::Debug::ParserEvents
46
46
 
47
+ def self.included( klass )
48
+ super
49
+ if klass.is_a?( ::Class )
50
+ def klass.profile?
51
+ true
52
+ end
53
+ end
54
+ end
55
+
47
56
  def initialize( stream, options = {} )
48
57
  options[ :debug_listener ] ||= Profiler.new( self )
49
58
  super( stream, options )
@@ -319,7 +328,7 @@ class Profiler
319
328
  @profile.hidden_characters_matched = hidden_tokens.inject( 0 ) do |count, token|
320
329
  count + token.text.length rescue count
321
330
  end
322
- @profile.characters_matched = ( @last_token || input.tokens.last ).stop + 1
331
+ @profile.characters_matched = ( @last_token || input.tokens.last ).stop + 1 rescue 0
323
332
  write_report
324
333
  end
325
334
 
@@ -307,6 +307,10 @@ class Recognizer
307
307
  return false
308
308
  end
309
309
 
310
+ def profile?
311
+ return false
312
+ end
313
+
310
314
  def Scope( *declarations, &body )
311
315
  Scope.new( *declarations, &body )
312
316
  end
@@ -11,17 +11,82 @@ uses Readline (if available) or standard IO#gets to fetch data on demand.
11
11
  =end
12
12
 
13
13
  class InteractiveStringStream < StringStream
14
- def initialize( options = {}, &block )
15
- @data = ''
16
- @position = @column = @mark_depth = 0
17
- @line = 1
18
- @markers = []
19
- mark
20
- @initialized = @eof = false
21
- @readline = block or raise( ArgumentError, "no line-reading block was provided" )
22
- @name = options.fetch( :name, '(interactive)' )
14
+
15
+ if RUBY_VERSION =~ /^1\.9/
16
+
17
+ # creates a new StringStream object where +data+ is the string data to stream.
18
+ # accepts the following options in a symbol-to-value hash:
19
+ #
20
+ # [:file or :name] the (file) name to associate with the stream; default: <tt>'(string)'</tt>
21
+ # [:line] the initial line number; default: +1+
22
+ # [:column] the initial column number; default: +0+
23
+ #
24
+ def initialize( options = {}, &block ) # for 1.9
25
+ @string = ''
26
+ @data = []
27
+ @position = options.fetch :position, 0
28
+ @line = options.fetch :line, 1
29
+ @column = options.fetch :column, 0
30
+ @markers = []
31
+ mark
32
+ @initialized = @eof = false
33
+ @readline = block or raise( ArgumentError, "no line-reading block was provided" )
34
+ @name ||= options[ :file ] || options[ :name ] || '(interactive)'
35
+ end
36
+
37
+ def readline
38
+ @initialized = true
39
+ unless @eof
40
+ if line = @readline.call
41
+ line = line.to_s.encode( Encoding::UTF_8 )
42
+ @string << line
43
+ @data.concat( line.codepoints.to_a )
44
+ return true
45
+ else
46
+ @eof = true
47
+ return false
48
+ end
49
+ end
50
+ end
51
+
52
+ else
53
+
54
+ # creates a new StringStream object where +data+ is the string data to stream.
55
+ # accepts the following options in a symbol-to-value hash:
56
+ #
57
+ # [:file or :name] the (file) name to associate with the stream; default: <tt>'(string)'</tt>
58
+ # [:line] the initial line number; default: +1+
59
+ # [:column] the initial column number; default: +0+
60
+ #
61
+ def initialize( options = {}, &block )
62
+ @string = @data = ''
63
+ @position = options.fetch :position, 0
64
+ @line = options.fetch :line, 1
65
+ @column = options.fetch :column, 0
66
+ @markers = []
67
+ mark
68
+ @initialized = @eof = false
69
+ @readline = block or raise( ArgumentError, "no line-reading block was provided" )
70
+ @name ||= options[ :file ] || options[ :name ] || '(interactive)'
71
+ end
72
+
73
+ def readline
74
+ @initialized = true
75
+ unless @eof
76
+ if line = @readline.call
77
+ @data << line.to_s
78
+ return true
79
+ else
80
+ @eof = true
81
+ return false
82
+ end
83
+ end
84
+ end
85
+
23
86
  end
24
87
 
88
+ private :readline
89
+
25
90
  def consume
26
91
  @position < @data.size and return( super )
27
92
  unless @eof
@@ -50,28 +115,15 @@ class InteractiveStringStream < StringStream
50
115
 
51
116
  def substring( start, stop )
52
117
  fill_through( stop )
53
- @data[ start..stop ]
118
+ @string[ start .. stop ]
54
119
  end
55
120
 
56
121
  private
57
122
 
58
123
  def fill_through( position )
59
124
  @eof and return
60
- if position < 0 then fill_out
61
- else readline until ( @data.size > position or @eof )
62
- end
63
- end
64
-
65
- def readline
66
- @initialized = true
67
- unless @eof
68
- if line = @readline.call
69
- @data << line.to_s
70
- return true
71
- else
72
- @eof = true
73
- return false
74
- end
125
+ if @position < 0 then fill_out
126
+ else readline until ( @data.size > @position or @eof )
75
127
  end
76
128
  end
77
129
 
@@ -323,7 +323,7 @@ and do not add any text to the rewrite buffer
323
323
 
324
324
  if loc.is_a?( Range )
325
325
  first, last = loc.first.to_i, loc.last.to_i
326
- loc.exlude_end? and last -= 1
326
+ loc.exclude_end? and last -= 1
327
327
  return cast_range( args.unshift( first, last ), extra )
328
328
  else
329
329
  loc = loc.to_i
data/lib/antlr3/task.rb CHANGED
@@ -158,11 +158,10 @@ class GrammarSet
158
158
  end
159
159
 
160
160
  def define_tasks
161
- directory( @output_directory )
162
161
  file( @antlr_jar )
163
162
 
164
163
  for grammar in @grammars
165
- deps = [ @output_directory, @antlr_jar ]
164
+ deps = [ @antlr_jar ]
166
165
  if vocab = grammar.token_vocab and
167
166
  tfile = find_tokens_file( vocab, grammar )
168
167
  file( tfile )
@@ -200,6 +199,8 @@ class GrammarSet
200
199
  end
201
200
 
202
201
  def compile( grammar )
202
+ dir = output_directory
203
+ test( ?d, dir ) or FileUtils.mkpath( dir )
203
204
  sh( build_command( grammar ) )
204
205
  end
205
206
 
@@ -376,7 +377,7 @@ class GrammarFile
376
377
  depends = shared_depends + depends
377
378
 
378
379
  target_files.each do | target |
379
- file( target => depends ) do
380
+ file( target => ( depends - [ target ] ) ) do # prevents recursive .tokens file dependencies
380
381
  @group.compile( self )
381
382
  end
382
383
  end
data/lib/antlr3/token.rb CHANGED
@@ -316,6 +316,14 @@ module TokenSource
316
316
  return token
317
317
  end
318
318
 
319
+ def each
320
+ block_given? or return enum_for( :each )
321
+ while token = next_token and token.type != EOF
322
+ yield( token )
323
+ end
324
+ return self
325
+ end
326
+
319
327
  def to_stream( options = {} )
320
328
  if block_given?
321
329
  CommonTokenStream.new( self, options ) { | t, stream | yield( t, stream ) }
@@ -323,13 +331,6 @@ module TokenSource
323
331
  CommonTokenStream.new( self, options )
324
332
  end
325
333
  end
326
-
327
- def each
328
- block_given? or return enum_for( :each )
329
- loop { yield( self.next ) }
330
- rescue StopIteration
331
- return self
332
- end
333
334
  end
334
335
 
335
336
 
data/lib/antlr3/tree.rb CHANGED
@@ -219,6 +219,7 @@ throughout the AST library:
219
219
  =end
220
220
 
221
221
  module Tree
222
+
222
223
  #attr_accessor :parent
223
224
  attr_accessor :start_index
224
225
  attr_accessor :stop_index
@@ -20,7 +20,7 @@ module ANTLR3
20
20
  #
21
21
  MAJOR_VERSION = 1
22
22
  MINOR_VERSION = 8
23
- PATCH_VERSION = 2
23
+ PATCH_VERSION = 5
24
24
  VERSION = [ MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION ]
25
25
  VERSION_STRING = VERSION.join( '.' ).freeze
26
26
 
data/samples/JavaScript.g CHANGED
@@ -1,108 +1,64 @@
1
- /**
2
- [The "BSD licence"]
3
- Copyright (c) 2010 Kyle Yetter
4
- All rights reserved.
5
-
6
- Redistribution and use in source and binary forms, with or without
7
- modification, are permitted provided that the following conditions
8
- are met:
9
-
10
- 1. Redistributions of source code must retain the above copyright
11
- notice, this list of conditions and the following disclaimer.
12
- 2. Redistributions in binary form must reproduce the above copyright
13
- notice, this list of conditions and the following disclaimer in the
14
- documentation and/or other materials provided with the distribution.
15
- 3. The name of the author may not be used to endorse or promote products
16
- derived from this software without specific prior written permission.
17
-
18
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
-
29
- **/
30
-
31
1
  grammar JavaScript;
32
2
 
33
- options
34
- {
3
+ options {
35
4
  language = Ruby;
36
- output = AST;
5
+ output = AST;
37
6
  }
38
7
 
39
8
  tokens {
40
- ABSTRACT='abstract'; GET='get'; POST_DECR;
41
- AMP='&'; GOTO='goto'; POST_INCR;
42
- AMP_ASGN='&='; GREATER='>'; PRIVATE='private';
43
- AND='&&'; HAT='^'; PROGRAM;
44
- AREF; HAT_ASGN='^='; PROTECTED='protected';
45
- ARGUMENTS; IF='if'; PUBLIC='public';
46
- ARRAY; IMPLEMENTS='implements'; QMARK='?';
47
- AS='as'; IMPORT='import'; RBRACE='}';
48
- ASGN='='; IN='in'; RBRACK=']';
49
- BLOCK; INCR='++'; REGEX;
50
- BOOLEAN='boolean'; INSTANCEOF='instanceof'; RETURN='return';
51
- BREAK='break'; INT='int'; RPAREN=')';
52
- BYTE='byte'; INTERFACE='interface'; RSHIFT3='>>>';
53
- CALL; IS='is'; RSHIFT3_ASGN='>>>=';
54
- CASE='case'; LABEL; RSHIFT='>>';
55
- CATCH='catch'; LBRACE='{'; RSHIFT_ASGN='>>=';
56
- CHAR='char'; LBRACK='['; SEMI=';'; //]
57
- CLASS='class'; LEQ='<='; SET='set';
58
- COLON=':'; LESS='<'; SHORT='short';
59
- COMMA=','; LET='let'; SLASH;
60
- COMMENT; LINE_COMMENT; SLASH_ASGN;
61
- CONST='const'; LITERAL; STAR='*';
62
- CONTINUE='continue'; LONG='long'; STAR_ASGN='*=';
63
- DEBUGGER='debugger'; LPAREN='('; STATIC='static';
64
- DECR='--'; LSHIFT='<<'; SUPER='super';
65
- DEFAULT='default'; LSHIFT_ASGN='<<='; SWITCH='switch';
66
- DELETE='delete'; MINUS='-'; SYNCHRONIZED='synchronized';
67
- DO='do'; MINUS_ASGN='-='; THIS='this';
68
- DOT='.'; MOD='%'; THROW='throw';
69
- DOUBLE='double'; MOD_ASGN='%='; THROWS='throws';
70
- EACH='each'; NAMESPACE='namespace'; TILDE='~';
71
- ELSE='else'; NATIVE='native'; TRANSIENT='transient';
72
- ENUM='enum'; NEQ='!='; TRUE='true';
73
- EQ='=='; NEQQ='!=='; TRY='try';
74
- EQQ='==='; NEW='new'; TYPEOF='typeof';
75
- EXPORT='export'; NOT='!'; UNDEFINED='undefined';
76
- EXTENDS='extends'; NULL='null'; USE='use';
77
- FALSE='false'; OBJECT; VAR='var';
78
- FINAL='final'; OR='||'; VOID='void';
79
- FINALLY='finally'; PACKAGE='package'; VOLATILE='volatile';
80
- FLOAT='float'; PARAMS; WHILE='while';
81
- FOR='for'; PIPE='|'; WITH='with';
82
- FOR_IN; PIPE_ASGN='|='; YIELD='yield';
83
- FUNCTION='function'; PLUS='+';
84
- GEQ='>='; PLUS_ASGN='+=';
9
+ AMP='&'; HAT='^'; PROGRAM;
10
+ AMP_ASGN='&='; HAT_ASGN='^='; QMARK='?';
11
+ AND='&&'; IF='if'; RBRACE='}';
12
+ AREF; IN='in'; RBRACK=']';
13
+ ARGUMENTS; INCR='++'; REGEX;
14
+ ARRAY; INSTANCEOF='instanceof'; RETURN='return';
15
+ ARROW='->'; ITER; RPAREN=')';
16
+ ASGN='='; LABEL; RSHIFT='>>';
17
+ BLOCK; LBRACE='{'; RSHIFT3='>>>';
18
+ BL_END='end'; LBRACK='['; RSHIFT3_ASGN='>>>=';
19
+ BREAK='break'; LEQ='<='; RSHIFT_ASGN='>>=';
20
+ CALL; LESS='<'; SEMI=';';
21
+ CASE='case'; LET='let'; SET='set';
22
+ CATCH='catch'; LINE_COMMENT; SLASH;
23
+ COLON=':'; LITERAL; SLASH_ASGN;
24
+ COMMA=','; LPAREN='('; SPLAT;
25
+ COMMENT; LSHIFT='<<'; STAR='*';
26
+ CONTINUE='continue'; LSHIFT_ASGN='<<='; STAR_ASGN='*=';
27
+ DECR='--'; MINUS='-'; SWITCH='switch';
28
+ DEFAULT='default'; MINUS_ASGN='-='; THIS='this';
29
+ DELETE='delete'; MOD='%'; THROW='throw';
30
+ DO='do'; MOD_ASGN='%='; TILDE='~';
31
+ DOT='.'; NEQ='!='; TRUE='true';
32
+ DO_UNTIL; NEQQ='!=='; TRY='try';
33
+ DO_WHILE; NEW='new'; TYPEOF='typeof';
34
+ EACH='each'; NOT='!'; UMINUS;
35
+ ELSE='else'; NULL='null'; UNDEFINED='undefined';
36
+ EQ='=='; OBJECT; UNLESS='unless';
37
+ EQQ='==='; OR='||'; UNTIL='until';
38
+ FALSE='false'; OR_ASGN='||='; UPLUS;
39
+ FINALLY='finally'; PARAMS; VAR='var';
40
+ FOR='for'; PIPE='|'; VOID='void';
41
+ FOR_IN; PIPE_ASGN='|='; WHILE='while';
42
+ FUNCTION='function'; PLUS='+'; WITH='with';
43
+ GEQ='>='; PLUS_ASGN='+='; WORDS;
44
+ GET='get'; POST_DECR; YAML;
45
+ GREATER='>'; POST_INCR; YIELD='yield';
46
+ CONST='const';
85
47
  }
86
48
 
87
- scope InFor {
88
- active;
89
- }
49
+ scope InFor { active; }
90
50
 
91
51
  @parser::members {
92
52
 
93
53
  def auto_semicolon?( error )
94
- if ANTLR3::Error::NoViableAlternative === error
95
- ( input.position - 1 ).downto( 0 ) do | i |
96
- token = input[ i ] or break
97
- token.hidden? or break
98
- token.type == NEWLINE and return true
99
- end
54
+ if NoViableAlternative === error
55
+ return( @auto_semicolon = error ) unless same_line?
100
56
  end
101
57
  return false
102
58
  end
103
59
 
104
60
  def recover( error = $! )
105
- auto_semicolon?( error ) and return
61
+ @auto_semicolon == error and return( @auto_semicolon = nil )
106
62
  super
107
63
  end
108
64
 
@@ -111,35 +67,72 @@ scope InFor {
111
67
  super
112
68
  end
113
69
 
70
+ def newline?( from = 1 )
71
+ to = from == -1 ? 1 : from + 1
72
+ start = @input.future?( from )
73
+ stop = @input.future?( to )
74
+
75
+ start.upto( stop ) do | i |
76
+ @input.at( i ).type == NEWLINE and return( true )
77
+ end
78
+
79
+ return( false )
80
+ end
81
+
82
+ def same_line?
83
+ stop = @input.future? || @input.length
84
+ start = @input.past? || 0
85
+
86
+ start.upto( stop ) do | i |
87
+ @input.at( i ).type == NEWLINE and return( false )
88
+ end
89
+
90
+ return( true )
91
+ end
92
+
93
+ def prepend_tree( root, child )
94
+ child = @adaptor.rule_post_processing( child )
95
+ root.unshift( child )
96
+ root.start_index > child.start_index and root.start_index = child.start_index
97
+ root.stop_index < child.stop_index and root.stop_index = child.stop_index
98
+ return @adaptor.rule_post_processing( root )
99
+ end
114
100
  }
115
101
 
116
102
  @lexer::members {
117
- attr_accessor :regex_possible
103
+ attr_accessor :value_expected
118
104
 
119
- NO_REGEX_FOLLOWS = Set[
105
+ NO_VALUE_FOLLOWS = Set[
120
106
  ID, REGEX, STRING, NUMBER, THIS,
121
- TRUE, FALSE, NULL,
122
- RPAREN, RBRACK, RBRACE, UNDEFINED
107
+ TRUE, FALSE, NULL, UNDEFINED,
108
+ RPAREN, RBRACK, RBRACE,
109
+ IVAR, DOC, YAML, WORDS
123
110
  ]
124
111
 
125
112
  def next_token
126
113
  token = super
127
114
  unless token.hidden?
128
- @regex_possible =
129
- NO_REGEX_FOLLOWS.include?( token.type ) ? false : true
130
- @last_type = token.type
115
+ @value_expected =
116
+ NO_VALUE_FOLLOWS.include?( token.type ) ? false : true
131
117
  end
132
118
  return( token )
133
119
  end
134
120
  }
135
121
 
136
122
  @lexer::init {
137
- @regex_possible = true
138
- @last_type = nil
123
+ @value_expected = true
124
+ @token_buffer = []
125
+ @buffer_depth = 0
139
126
  }
140
127
 
128
+
129
+ /********************************************************************************
130
+ **************************** Top-Level Structure *****************************
131
+ ********************************************************************************/
132
+
141
133
  program
142
- : source_elements
134
+ : source_elements -> source_elements
135
+ | -> ^( UNDEFINED )
143
136
  ;
144
137
 
145
138
  source_elements
@@ -152,24 +145,36 @@ block
152
145
  ;
153
146
 
154
147
  statement_block
155
- : '{' ( statement_list )? '}' -> ^( BLOCK statement_list? )
148
+ : '{' statement_list? '}' -> ^( BLOCK statement_list? )
156
149
  ;
157
150
 
158
151
  statement_list
159
- : statement ( statement )* -> statement+
152
+ : statement+ -> statement+
153
+ ;
154
+
155
+ clause
156
+ : '(' expression_list ')' -> expression_list
160
157
  ;
161
158
 
159
+ /********************************************************************************
160
+ ******************************** Statements **********************************
161
+ ********************************************************************************/
162
+
162
163
  statement
163
164
  : variable_statement
165
+ | const_statement
164
166
  | empty_statement
167
+ | ( 'function' )=> function
165
168
  | ( ID ':' )=> labelled_statement
166
169
  | ( 'let' )=> let_statement
167
- | expression_statement
170
+ | expression_statement
168
171
  | if_statement
169
- | iteration_statement
172
+ | while_statement
173
+ | do_while_statement
174
+ | for_loop
170
175
  | continue_statement
171
176
  | break_statement
172
- | yield_statement
177
+ | yield_statement
173
178
  | return_statement
174
179
  | with_statement
175
180
  | switch_statement
@@ -177,92 +182,163 @@ statement
177
182
  | try_statement
178
183
  ;
179
184
 
185
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
186
+ // Simple Statements
187
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
188
+
189
+ empty_statement
190
+ : ';' ->
191
+ ;
192
+
193
+ expression_statement
194
+ : expression_list statement_end!
195
+ ;
196
+
197
+ labelled_statement
198
+ : ID ':' block -> ^( LABEL ID block )
199
+ ;
200
+
201
+ statement_end
202
+ : ';'
203
+ | ( '}' )=>
204
+ | EOF
205
+ ;
206
+
207
+ blank
208
+ : -> ^( UNDEFINED )
209
+ ;
210
+
211
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
212
+ // Block-ish Statements
213
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
214
+
215
+ try_statement
216
+ : 'try'
217
+ ( statement_block -> statement_block )
218
+ ( f=finally_clause -> { prepend_tree( $f.tree, $tree ) }
219
+ | ( catch_clause -> { prepend_tree( $catch_clause.tree, $tree ) } )
220
+ ( f2=finally_clause -> { prepend_tree( $f2.tree, $tree ) } )?
221
+ )
222
+ ;
223
+
224
+ catch_clause
225
+ : 'catch' '(' ID ')' statement_block
226
+ -> ^( 'catch' ID statement_block )
227
+ ;
228
+
229
+ finally_clause
230
+ : 'finally' statement_block
231
+ -> ^( 'finally' statement_block )
232
+ ;
233
+
234
+ with_statement
235
+ : 'with' clause block -> ^( 'with' clause block )
236
+ ;
237
+
238
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
239
+ // Variable Declarations
240
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
241
+
180
242
  variable_statement
181
- : 'var' variable_declaration_list statement_end -> ^( 'var' variable_declaration_list )
243
+ : 'var'^ variable_declaration_list statement_end!
182
244
  ;
183
-
245
+
246
+ const_statement
247
+ : 'const'^ variable_declaration_list statement_end!
248
+ ;
249
+
250
+ let_statement
251
+ : 'let'^ '('! variable_declaration_list ')'! block
252
+ ;
253
+
184
254
  variable_declaration_list
185
- : variable_declaration ( ',' variable_declaration )*
186
- -> variable_declaration+
255
+ : variable_declaration ( ','! variable_declaration )*
187
256
  ;
188
-
257
+
189
258
  variable_declaration
190
259
  : declaration_target ( '='^ expression )?
191
260
  ;
192
261
 
193
262
  declaration_target
194
263
  : '[' declaration_target ( ',' declaration_target )* ']' -> ^( ARRAY declaration_target+ )
195
- | '{' declaration_key ( ',' declaration_key )* '}' -> ^( OBJECT declaration_key+ )
196
- | variable_name -> variable_name
197
- ;
198
-
264
+ | '{' declaration_key ( ',' declaration_key )* '}' -> ^( OBJECT declaration_key+ )
265
+ | variable_name -> variable_name
266
+ ;
267
+
199
268
  declaration_key
200
269
  : property_name ':'^ declaration_target
201
- ;
202
-
203
- empty_statement
204
- : ';' ->
205
270
  ;
206
-
207
- expression_statement
208
- : expression_list statement_end! ;
209
-
271
+
272
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
273
+ // Branching Statements
274
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
275
+
210
276
  if_statement
211
- : 'if' '(' expression_list ')'
212
- when_true=block
213
- ( 'else' when_false=block )?
214
- -> ^( 'if' expression_list $when_true $when_false? )
277
+ : 'if'^ clause block ( 'else'! block )?
215
278
  ;
216
279
 
217
- let_statement
218
- : 'let' '(' variable_declaration_list ')' block
219
- -> ^( 'let' variable_declaration_list block )
220
- ;
221
-
222
- iteration_statement
223
- : do_while_statement
224
- | while_statement
225
- | ( 'for' 'each' '(' )=> for_each_in_statement
226
- | ( 'for' '(' for_in_statement_initialiser_part 'in' )=> for_in_statement
227
- | for_statement
280
+ switch_statement
281
+ : 'switch' '(' expression_list ')'
282
+ '{'
283
+ ( case_clause )*
284
+ ( default_clause ( case_clause )* )?
285
+ '}'
286
+ -> ^( 'switch' expression_list case_clause* default_clause? )
228
287
  ;
229
288
 
230
- do_while_statement
231
- : 'do' block 'while' '(' expression_list ')' statement_end -> ^( 'do' expression_list block )
289
+ case_clause
290
+ : 'case'^ expression_list ':'! statement_list?
232
291
  ;
233
292
 
293
+ default_clause
294
+ : 'default'^ ':'! statement_list?
295
+ ;
296
+
297
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
298
+ // While Loops
299
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
300
+
301
+ do_while_statement
302
+ : 'do' block 'while' clause statement_end
303
+ -> ^( 'do' clause block )
304
+ ;
305
+
234
306
  while_statement
235
- : 'while' '(' expression_list ')' block
236
- -> ^( 'while' expression_list block )
307
+ : 'while'^ clause block
237
308
  ;
238
-
309
+
310
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
311
+ // For Loops
312
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
313
+
314
+ for_loop
315
+ : { @input.peek( 2 ) == EACH }?=> for_each_in_statement
316
+ | ( 'for' '(' ~( ')' | ';' | 'in' )* 'in' )=> for_in_statement
317
+ | for_statement
318
+ ;
319
+
239
320
  for_statement
240
- : 'for'
241
- '('
242
- ( for_statement_initialiser_part )? ';'
243
- ( cond=expression_list )? ';'
244
- ( step=expression_list )?
245
- ')'
321
+ : 'for'^
322
+ '('!
323
+ ( for_statement_initialiser_part | blank ) ';'!
324
+ ( expression_list | blank ) ';'!
325
+ ( expression_list | blank )
326
+ ')'!
246
327
  block
247
- -> ^( 'for' for_statement_initialiser_part? $cond? $step? block )
248
328
  ;
249
329
 
250
330
  for_statement_initialiser_part
251
331
  scope InFor;
252
- @before {
253
- $InFor::active = true
254
- }
255
- @after {
256
- $InFor::active = false
257
- }
332
+ @before { $InFor::active = true }
333
+ @after { $InFor::active = false }
258
334
  : expression_list
259
335
  | 'var'^ variable_declaration_list
260
336
  ;
261
337
 
262
338
  for_each_in_statement
263
339
  : 'for' 'each' '(' for_in_statement_initialiser_part 'in' expression ')' block
264
- -> ^( 'each' for_in_statement_initialiser_part expression block )
265
- ;
340
+ -> ^( 'each' for_in_statement_initialiser_part expression block )
341
+ ;
266
342
 
267
343
  for_in_statement
268
344
  : f='for' '(' for_in_statement_initialiser_part 'in' expression ')' block
@@ -271,80 +347,34 @@ for_in_statement
271
347
 
272
348
  for_in_statement_initialiser_part
273
349
  scope InFor;
274
- @before {
275
- $InFor::active = true
276
- }
277
- @after {
278
- $InFor::active = false
279
- }
350
+ @before { $InFor::active = true }
351
+ @after { $InFor::active = false }
280
352
  : 'var'^ variable_declaration
281
353
  | member
282
354
  ;
283
355
 
356
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
357
+ // Flow Control
358
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
359
+
284
360
  continue_statement
285
- : 'continue'^ ID? statement_end!
361
+ : 'continue'^ ( { same_line? }?=> ID )? statement_end!
286
362
  ;
287
363
 
288
364
  break_statement
289
- : 'break'^ ID? statement_end!
365
+ : 'break'^ ( { same_line? }?=> ID )? statement_end!
290
366
  ;
291
367
 
292
368
  return_statement
293
- : 'return'^ expression_list? statement_end!
369
+ : 'return'^ ( { same_line? }?=> expression_list )? statement_end!
294
370
  ;
295
371
 
296
372
  yield_statement
297
- : 'yield'^ expression_list? statement_end!
298
- ;
299
-
300
-
301
- with_statement
302
- : 'with' '(' expression_list ')' block
303
- -> ^( 'with' expression_list block )
304
- ;
305
-
306
- labelled_statement
307
- : ID ':' block
308
- -> ^( LABEL ID block )
309
- ;
310
-
311
- switch_statement
312
- : 'switch' '(' expression_list ')'
313
- '{'
314
- ( case_clause )*
315
- ( default_clause ( case_clause )* )?
316
- '}'
317
- -> ^( 'switch' expression_list case_clause* default_clause? )
318
- ;
319
-
320
- case_clause
321
- : 'case'^ expression_list ':'! statement_list?
322
- ;
323
-
324
- default_clause
325
- : 'default'^ ':'! statement_list?
373
+ : 'yield'^ ( { same_line? }?=> expression_list )? statement_end!
326
374
  ;
327
375
 
328
376
  throw_statement
329
- : 'throw'^ expression_list statement_end!
330
- ;
331
-
332
- try_statement
333
- : 'try' ( statement_block -> statement_block )
334
- ( f=finally_clause -> { $f.tree.unshift( $tree ) }
335
- | ( catch_clause -> { $catch_clause.tree.unshift( $tree ) } )
336
- ( f2=finally_clause -> { $f2.tree.unshift( $tree ) } )?
337
- )
338
- ;
339
-
340
- catch_clause
341
- : 'catch' '(' ID ')' statement_block
342
- -> ^( 'catch' ID statement_block )
343
- ;
344
-
345
- finally_clause
346
- : 'finally' statement_block
347
- -> ^( 'finally' statement_block )
377
+ : 'throw'^ ( { same_line? }?=> expression_list )? statement_end!
348
378
  ;
349
379
 
350
380
  /********************************************************************************
@@ -356,10 +386,10 @@ expression_list
356
386
  ;
357
387
 
358
388
  expression
359
- : ( member assignment_op )=> member assignment_op^ expression
389
+ : ( member assignment_op )=> member assignment_op^ expression
360
390
  | conditional
361
391
  ;
362
-
392
+
363
393
  assignment_op
364
394
  : '='
365
395
  | '*='
@@ -384,11 +414,11 @@ logical_or
384
414
  ;
385
415
 
386
416
  logical_and
387
- : bit_or ( '&&'^ bit_or )*
417
+ : bit_or ( '&&'^ bit_or )*
388
418
  ;
389
419
 
390
420
  bit_or
391
- : bit_xor ( '|'^ bit_xor )*
421
+ : bit_xor ( '|'^ bit_xor )*
392
422
  ;
393
423
 
394
424
  bit_xor
@@ -433,30 +463,36 @@ mult
433
463
  ;
434
464
 
435
465
  unary
436
- : 'delete'^ unary
437
- | 'void'^ unary
438
- | 'typeof'^ unary
439
- | '++'^ unary
440
- | '--'^ unary
441
- | '+'^ unary
442
- | '-'^ unary
443
- | '~'^ unary
444
- | '!'^ unary
445
- | postfix
466
+ : 'delete' unary -> ^( 'delete' unary )
467
+ | 'void' unary -> ^( 'void' unary )
468
+ | 'typeof' unary -> ^( 'typeof' unary )
469
+ | '++' unary -> ^( '++' unary )
470
+ | '--' unary -> ^( '--' unary )
471
+ | '+' unary -> ^( UPLUS[ '+' ] unary )
472
+ | '-' unary -> ^( UMINUS[ '-' ] unary )
473
+ | '~' unary -> ^( '~' unary )
474
+ | '!' unary -> ^( '!' unary )
475
+ | postfix -> postfix
446
476
  ;
447
477
 
448
478
  postfix
449
479
  : member
450
- ( '++' -> ^( POST_INCR[ '++' ] member )
451
- | '--' -> ^( POST_DECR[ '--' ] member )
452
- | -> member
480
+ ( { same_line? }?=>
481
+ ( '++' -> ^( POST_INCR[ '++' ] member )
482
+ | '--' -> ^( POST_DECR[ '--' ] member )
483
+ )
484
+ | -> member
453
485
  )
454
486
  ;
455
487
 
488
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
489
+ // Atomic Expressions
490
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
491
+
456
492
  member
457
- : ( receiver -> receiver )
458
- ( accessor -> { $accessor.tree.unshift( $tree ) }
459
- | arguments -> ^( CALL $member arguments )
493
+ : ( receiver -> receiver )
494
+ ( accessor -> { prepend_tree( $accessor.tree, $tree ) }
495
+ | arguments -> ^( CALL $member arguments )
460
496
  )*
461
497
  ;
462
498
 
@@ -466,30 +502,48 @@ accessor
466
502
  ;
467
503
 
468
504
  receiver
469
- : primary
470
- | function
505
+ : primary -> primary
506
+ | function -> function
471
507
  | ( 'new' new_target arguments? )=>
472
508
  'new' new_target arguments? -> ^( 'new' new_target arguments? )
473
509
  ;
474
510
 
475
511
  new_target
476
512
  : ( receiver -> receiver )
477
- ( accessor -> { $accessor.tree.unshift( $tree ) } )*
513
+ ( accessor -> { prepend_tree( $accessor.tree, $tree ) } )*
478
514
  ;
479
515
 
480
516
  arguments
481
- : '(' ')' -> ^( ARGUMENTS )
482
- | '(' expression ( ',' expression )* ')'
483
- -> ^( ARGUMENTS expression+ )
517
+ : '(' ( expression ( ',' expression )* )? ')' -> ^( ARGUMENTS expression* )
518
+ ;
519
+
520
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
521
+ // Functions / Blocks
522
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
523
+
524
+ function
525
+ : 'function'^ variable_name? function_parameters statement_block
526
+ ;
527
+
528
+ function_parameters
529
+ : '(' parameters? ')' -> ^( PARAMS parameters? )
530
+ ;
531
+
532
+ parameters
533
+ : variable_name ( ',' variable_name )* -> variable_name+
484
534
  ;
485
535
 
536
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
537
+ // Literals
538
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
539
+
486
540
  primary
487
541
  : 'this'^
488
- | variable_name^
489
542
  | 'null'^
490
543
  | 'true'^
491
544
  | 'false'^
492
545
  | 'undefined'^
546
+ | variable_name^
493
547
  | NUMBER^
494
548
  | STRING^
495
549
  | REGEX^
@@ -498,31 +552,16 @@ primary
498
552
  | '('! expression_list ')'!
499
553
  ;
500
554
 
501
- function
502
- : 'function'^ ( ID )? formal_parameter_list block
503
- ;
504
-
505
- formal_parameter_list
506
- : '(' ( ID ( ',' ID )* )? ')'
507
- -> ^( PARAMS ID* )
508
- ;
509
-
510
- literal
511
- : 'null'^ | 'true'^ | 'false'^ | NUMBER^ | STRING^ | REGEX^
512
- ;
513
-
514
-
515
555
  array_literal
516
- : '[' ']' -> ^( ARRAY )
517
- | '[' expression ( ',' expression? )* ']' -> ^( ARRAY expression+ )
556
+ : '[' ']' -> ^( ARRAY )
557
+ | '[' list_item ( ',' list_item )* ']' -> ^( ARRAY list_item* )
518
558
  ;
519
559
 
520
- list_element
521
- : ( ',' )=> -> ^( UNDEFINED )
560
+ list_item
561
+ : ( ',' )=> -> ^( UNDEFINED )
522
562
  | expression -> expression
523
563
  ;
524
564
 
525
-
526
565
  object_literal
527
566
  : '{' '}' -> ^( OBJECT )
528
567
  | '{' property_definition ( ',' property_definition )* '}'
@@ -530,173 +569,75 @@ object_literal
530
569
  ;
531
570
 
532
571
  property_definition
533
- : 'get'^ ID formal_parameter_list block
534
- | 'set'^ ID formal_parameter_list block
535
- | property_name ':'^ expression
572
+ : 'get'^ ID function_parameters block
573
+ | 'set'^ ID function_parameters block
574
+ | property_name ':'^ expression
536
575
  ;
537
576
 
577
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
578
+ // Names and Words
579
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
580
+
538
581
  property_name
539
582
  : ID
540
- | reserved { $reserved.tree.token.type = ID }
541
- | STRING
583
+ | STRING
542
584
  | NUMBER
543
- ;
544
-
545
- statement_end
546
- : ';'
547
- | ( '}' )=>
548
- | EOF
585
+ | reserved { $reserved.tree.token.type = ID }
549
586
  ;
550
587
 
551
588
  variable_name
552
589
  : ID
553
- | t=pseudokeyword { $t.tree.token.type = ID }
554
- ;
590
+ | t=pseudokeyword { $t.tree.token.type = ID }
591
+ ;
555
592
 
556
593
  pseudokeyword
557
- : 'abstract'
558
- | 'as'
559
- | 'boolean'
560
- | 'byte'
561
- | 'char'
562
- | 'class'
563
- | 'debugger'
564
- | 'double'
565
- | 'each'
566
- | 'enum'
567
- | 'export'
568
- | 'extends'
569
- | 'final'
570
- | 'float'
571
- | 'get'
572
- | 'set'
573
- | 'goto'
574
- | 'implements'
575
- | 'import'
576
- | 'int'
577
- | 'interface'
578
- | 'is'
579
- | 'long'
580
- | 'namespace'
581
- | 'native'
582
- | 'package'
583
- | 'private'
584
- | 'protected'
585
- | 'public'
586
- | 'short'
587
- | 'static'
588
- | 'super'
589
- | 'synchronized'
590
- | 'throws'
591
- | 'transient'
592
- | 'use'
593
- | 'volatile'
594
+ : 'each'
595
+ | 'get'
596
+ | 'set'
594
597
  ;
595
598
 
596
599
  reserved
597
- : 'abstract'
598
- | 'as'
599
- | 'boolean'
600
- | 'break'
601
- | 'byte'
602
- | 'case'
603
- | 'catch'
604
- | 'char'
605
- | 'class'
606
- | 'const'
607
- | 'continue'
608
- | 'debugger'
609
- | 'default'
610
- | 'delete'
611
- | 'do'
612
- | 'double'
613
- | 'each'
614
- | 'else'
615
- | 'enum'
616
- | 'export'
617
- | 'extends'
618
- | 'false'
619
- | 'final'
620
- | 'finally'
621
- | 'float'
622
- | 'for'
623
- | 'function'
624
- | 'get'
625
- | 'goto'
626
- | 'if'
627
- | 'implements'
628
- | 'import'
629
- | 'in'
630
- | 'instanceof'
631
- | 'int'
632
- | 'interface'
633
- | 'is'
634
- | 'let'
635
- | 'long'
636
- | 'namespace'
637
- | 'native'
638
- | 'new'
639
- | 'null'
640
- | 'package'
641
- | 'private'
642
- | 'protected'
643
- | 'public'
644
- | 'return'
645
- | 'set'
646
- | 'short'
647
- | 'static'
648
- | 'super'
649
- | 'switch'
650
- | 'synchronized'
651
- | 'this'
652
- | 'throw'
653
- | 'throws'
654
- | 'transient'
655
- | 'true'
656
- | 'try'
657
- | 'typeof'
658
- | 'undefined'
659
- | 'use'
660
- | 'var'
661
- | 'void'
662
- | 'volatile'
663
- | 'while'
664
- | 'with'
665
- | 'yield'
600
+ : 'break' | 'do' | 'function' | 'new' | 'throw' | 'until'
601
+ | 'case' | 'each' | 'get' | 'null' | 'true' | 'var'
602
+ | 'catch' | 'else' | 'if' | 'return' | 'try' | 'void'
603
+ | 'continue' | 'false' | 'in' | 'set' | 'typeof' | 'while'
604
+ | 'default' | 'finally' | 'instanceof' | 'switch' | 'undefined' | 'with'
605
+ | 'delete' | 'for' | 'let' | 'this' | 'unless' | 'yield'
666
606
  ;
667
-
607
+
668
608
  /********************************************************************************
669
609
  *********************************** Lexer ************************************
670
610
  ********************************************************************************/
671
611
 
672
612
  SLASH
673
- : '//' ~( '\n' | '\r' | '\u2028' | '\u2029' )* { skip }
674
- | '/*' .* '*/' { skip }
675
- | { @regex_possible }?=> '/' ( ~( '/' | '*' | '\\' | '\r' | '\n' ) | '\\' . ) ( ~( '/' | '\\' | '\n' | '\r' ) | '\\' . )* '/' ( 'a'..'z' )* { $type = REGEX }
676
- | { !@regex_possible }?=> '/' ( '=' { $type = SLASH_ASGN } | { $type = SLASH } )
613
+ : '//' ~( '\n' | '\r' )* { $type = LINE_COMMENT; $channel = HIDDEN }
614
+ | '/*' .* '*/' { $type = COMMENT; $channel = HIDDEN }
615
+ | { @value_expected }?=> '/' ( ~( '/' | '*' | '\\' | '\r' | '\n' ) | '\\' . ) ( ~( '/' | '\\' | '\n' | '\r' ) | '\\' . )* '/' ( 'a'..'z' )* { $type = REGEX }
616
+ | { !@value_expected }?=> '/' ( '=' { $type = SLASH_ASGN } | { $type = SLASH } )
677
617
  ;
678
618
 
679
619
  STRING
680
- : '"' ( ~( '"' | '\\' | '\n' | '\r' ) | '\\' . )* '"'
681
- | '\'' ( ~( '\'' | '\\' | '\n' | '\r' ) | '\\' . )* '\''
682
- ;
620
+ : '\'' ( ~( '\'' | '\\' ) | '\\' . )* '\''
621
+ | '"' ( ~( '"' | '\\' ) | '\\' . )* '"'
622
+ ;
683
623
 
684
624
  NUMBER
685
- : ('0'..'9')+ '.' ('0'..'9')* ( ('e' | 'E') ('+' | '-')? ('0'..'9')+ )?
686
- | '.'? ('0'..'9')+ ( ('e' | 'E') ('+' | '-')? ('0'..'9')+ )?
687
- | '0' ('x' | 'X') ( '0'..'9' | 'a'..'f' | 'A'..'F' )+
688
- ;
625
+ : ('0'..'9')+ '.' ('0'..'9')* ( ('e' | 'E') ('+' | '-')? ('0'..'9')+ )?
626
+ | '.'? ('0'..'9')+ ( ('e' | 'E') ('+' | '-')? ('0'..'9')+ )?
627
+ | '0' ('x' | 'X') ( '0'..'9' | 'a'..'f' | 'A'..'F' )+
628
+ ;
689
629
 
690
630
  NEWLINE
691
- : ( '\n' | '\r' )+
692
- { $channel = HIDDEN }
693
- ;
631
+ : ( '\n' | '\r' )+ { $channel = HIDDEN }
632
+ ;
694
633
 
695
634
  ID
696
- : ( '$' | '_' | 'a'..'z' | 'A'..'Z' )
635
+ : ( '$' | '_' | 'a'..'z' | 'A'..'Z' )
697
636
  ( 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' )*
698
- ;
637
+ ;
699
638
 
700
639
  WS // Tab, vertical tab, form feed, space, non-breaking space and any other unicode "space separator".
701
- : ( '\t' | '\f' | ' ' | '\u00A0' )+ { $channel = HIDDEN }
702
- ;
640
+ : ( '\t' | '\f' | ' ' | '\u00A0' )+ { $channel = HIDDEN }
641
+ ;
642
+
643
+
data/templates/Ruby.stg CHANGED
@@ -1459,4 +1459,4 @@ placeAction(scope, name) ::= <<
1459
1459
  <endif>
1460
1460
  >>
1461
1461
 
1462
- runtimeLibraryVersion() ::= "1.8.2"
1462
+ runtimeLibraryVersion() ::= "1.8.5"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: antlr3
3
3
  version: !ruby/object:Gem::Version
4
- hash: 51
4
+ hash: 61
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 8
9
- - 2
10
- version: 1.8.2
9
+ - 5
10
+ version: 1.8.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kyle Yetter
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-02 00:00:00 -04:00
18
+ date: 2010-10-22 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies: []
21
21