@@ -121,7 +121,14 @@ def scan_tokens encoder, options
121
121
kind = :global_variable
122
122
elsif match = scan ( / \$ \{ [^\} ]+ \} /ox )
123
123
match =~ /\$ \{ (.*)\} /
124
- kind = IDENT_KIND [ $1]
124
+ var = $1
125
+ if var =~ /\[ .*\] /
126
+ encoder . text_token ( "${" , :instance_variable )
127
+ match_array ( var , encoder )
128
+ encoder . text_token ( "}" , :instance_variable )
129
+ next
130
+ end
131
+ kind = IDENT_KIND [ var ]
125
132
kind = :instance_variable if kind == :ident
126
133
elsif match = scan ( / \$ \( [^\) ]+ \) /ox )
127
134
kind = :shell
@@ -140,10 +147,10 @@ def scan_tokens encoder, options
140
147
encoder . text_token ( op , :operator )
141
148
next
142
149
end
143
- elsif match = scan ( /[A-Za-z_]+\[ [A-Za-z_\d ]+\] / )
150
+ elsif match = scan ( /[A-Za-z_]+\[ [A-Za-z_\@ \* \ d ]+\] / )
144
151
# array
145
- kind = IDENT_KIND ( match )
146
- kind = :instance_variable if kind == :ident
152
+ match_array ( match , encoder )
153
+ next
147
154
elsif match = scan ( / \$ [A-Za-z_][A-Za-z_0-9]* /ox )
148
155
match =~ /\$ (.*)/
149
156
kind = IDENT_KIND [ $1]
@@ -188,7 +195,17 @@ def scan_tokens encoder, options
188
195
kind = :predefined_constant
189
196
elsif match = scan ( / (?: \$ \( \( .*?\) \) ) /x )
190
197
kind = :global_variable
191
- elsif match = scan ( / \$ \{ ?[A-Za-z_][A-Za-z_\d ]*\} ? /x )
198
+ elsif match = scan ( / \$ (?: (?: \{ [^\} ]* \} ) | (?: [A-Za-z_0-9]+ ) ) /x )
199
+ match =~ /(\$ \{ ?)([^\} ]*)(\} ?)/
200
+ pre = $1
201
+ var = $2
202
+ post = $3
203
+ if var =~ /\[ .*?\] /
204
+ encoder . text_token ( pre , :instance_variable )
205
+ match_array ( var , encoder )
206
+ encoder . text_token ( post , :instance_variable )
207
+ next
208
+ end
192
209
kind = IDENT_KIND [ match ]
193
210
kind = :instance_variable if kind == :ident
194
211
elsif match = scan ( /[^#{ @quote } \\ ]+/ )
@@ -208,6 +225,18 @@ def scan_tokens encoder, options
208
225
encoder
209
226
end
210
227
228
+
229
+ def match_array ( match , encoder )
230
+ match =~ /([A-Za-z_]+)\[ (.*?)\] /
231
+ var = $1
232
+ key = $2
233
+ kind = IDENT_KIND [ var ]
234
+ kind = :instance_variable if kind == :ident
235
+ encoder . text_token ( var , kind )
236
+ encoder . text_token ( "[" , :operator )
237
+ encoder . text_token ( key , :key )
238
+ encoder . text_token ( "]" , :operator )
239
+ end
211
240
212
241
def handle_error ( match , options )
213
242
o = { :ignore_errors => true } . merge ( options )
0 commit comments