coffee-script 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/coffee-script.gemspec +1 -1
- data/examples/{code.cs → code.coffee} +4 -4
- data/examples/{documents.cs → documents.coffee} +0 -0
- data/examples/{poignant.cs → poignant.coffee} +2 -2
- data/examples/{syntax_errors.cs → syntax_errors.coffee} +0 -0
- data/examples/{underscore.cs → underscore.coffee} +0 -0
- data/lib/coffee-script.rb +1 -1
- data/lib/coffee_script/CoffeeScript.tmbundle/Preferences/CoffeeScript.tmPreferences +1 -1
- data/lib/coffee_script/CoffeeScript.tmbundle/Syntaxes/CoffeeScript.tmLanguage +46 -47
- data/lib/coffee_script/command_line.rb +1 -1
- data/lib/coffee_script/grammar.y +33 -28
- data/lib/coffee_script/lexer.rb +5 -1
- data/lib/coffee_script/narwhal/{coffee-script.cs → coffee-script.coffee} +1 -1
- data/lib/coffee_script/narwhal/js/coffee-script.js +1 -1
- data/lib/coffee_script/narwhal/js/loader.js +2 -2
- data/lib/coffee_script/narwhal/{launcher.cs → launcher.coffee} +0 -0
- data/lib/coffee_script/narwhal/{loader.cs → loader.coffee} +4 -4
- data/lib/coffee_script/nodes.rb +30 -34
- data/lib/coffee_script/parser.rb +691 -661
- metadata +9 -9
data/README
CHANGED
data/coffee-script.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'coffee-script'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.4' # Keep version in sync with coffee-script.rb
|
4
4
|
s.date = '2009-12-25'
|
5
5
|
|
6
6
|
s.homepage = "http://jashkenas.github.com/coffee-script/"
|
@@ -62,8 +62,8 @@ race: =>
|
|
62
62
|
race().
|
63
63
|
|
64
64
|
# Conditional assignment:
|
65
|
-
good
|
66
|
-
wine
|
65
|
+
good ||= evil
|
66
|
+
wine &&= cheese
|
67
67
|
|
68
68
|
# Nested property access and calls.
|
69
69
|
((moon.turn(360))).shapes[3].move({x: 45, y: 30}).position['top'].offset('x')
|
@@ -145,13 +145,13 @@ Animal.prototype.move: meters =>
|
|
145
145
|
alert(this.name + " moved " + meters + "m.").
|
146
146
|
|
147
147
|
Snake: name => this.name: name.
|
148
|
-
Snake extends
|
148
|
+
Snake extends Animal
|
149
149
|
Snake.prototype.move: =>
|
150
150
|
alert('Slithering...')
|
151
151
|
super(5).
|
152
152
|
|
153
153
|
Horse: name => this.name: name.
|
154
|
-
Horse extends
|
154
|
+
Horse extends Animal
|
155
155
|
Horse.prototype.move: =>
|
156
156
|
alert('Galloping...')
|
157
157
|
super(45).
|
File without changes
|
@@ -81,9 +81,9 @@ Creature : {
|
|
81
81
|
hit: damage =>
|
82
82
|
p_up: Math.rand( this.charisma )
|
83
83
|
if p_up % 9 is 7
|
84
|
-
this.life
|
84
|
+
this.life += p_up / 4
|
85
85
|
puts( "[" + this.name + " magick powers up " + p_up + "!]" ).
|
86
|
-
this.life
|
86
|
+
this.life -= damage
|
87
87
|
if this.life <= 0 then puts( "[" + this.name + " has died.]" )..
|
88
88
|
|
89
89
|
# This method takes one turn in a fight.
|
File without changes
|
File without changes
|
data/lib/coffee-script.rb
CHANGED
@@ -9,7 +9,7 @@ require "coffee_script/parse_error"
|
|
9
9
|
# Namespace for all CoffeeScript internal classes.
|
10
10
|
module CoffeeScript
|
11
11
|
|
12
|
-
VERSION = '0.1.
|
12
|
+
VERSION = '0.1.4' # Keep in sync with the gemspec.
|
13
13
|
|
14
14
|
# Compile a script (String or IO) to JavaScript.
|
15
15
|
def self.compile(script, options={})
|
@@ -6,8 +6,7 @@
|
|
6
6
|
<string>CoffeeScript Syntax: version 1</string>
|
7
7
|
<key>fileTypes</key>
|
8
8
|
<array>
|
9
|
-
<string>
|
10
|
-
<string>coffeescript</string>
|
9
|
+
<string>coffee</string>
|
11
10
|
</array>
|
12
11
|
<key>name</key>
|
13
12
|
<string>CoffeeScript</string>
|
@@ -19,22 +18,22 @@
|
|
19
18
|
<key>1</key>
|
20
19
|
<dict>
|
21
20
|
<key>name</key>
|
22
|
-
<string>entity.name.function.
|
21
|
+
<string>entity.name.function.coffee</string>
|
23
22
|
</dict>
|
24
23
|
<key>2</key>
|
25
24
|
<dict>
|
26
25
|
<key>name</key>
|
27
|
-
<string>keyword.operator.
|
26
|
+
<string>keyword.operator.coffee</string>
|
28
27
|
</dict>
|
29
28
|
<key>3</key>
|
30
29
|
<dict>
|
31
30
|
<key>name</key>
|
32
|
-
<string>variable.parameter.function.
|
31
|
+
<string>variable.parameter.function.coffee</string>
|
33
32
|
</dict>
|
34
33
|
<key>4</key>
|
35
34
|
<dict>
|
36
35
|
<key>name</key>
|
37
|
-
<string>storage.type.function.
|
36
|
+
<string>storage.type.function.coffee</string>
|
38
37
|
</dict>
|
39
38
|
</dict>
|
40
39
|
<key>comment</key>
|
@@ -42,7 +41,7 @@
|
|
42
41
|
<key>match</key>
|
43
42
|
<string>([a-zA-Z_?.$]*)\s*(=|:)\s*([\w,\s]*?)\s*(=>)</string>
|
44
43
|
<key>name</key>
|
45
|
-
<string>meta.function.
|
44
|
+
<string>meta.function.coffee</string>
|
46
45
|
</dict>
|
47
46
|
<dict>
|
48
47
|
<key>captures</key>
|
@@ -50,12 +49,12 @@
|
|
50
49
|
<key>1</key>
|
51
50
|
<dict>
|
52
51
|
<key>name</key>
|
53
|
-
<string>variable.parameter.function.
|
52
|
+
<string>variable.parameter.function.coffee</string>
|
54
53
|
</dict>
|
55
54
|
<key>2</key>
|
56
55
|
<dict>
|
57
56
|
<key>name</key>
|
58
|
-
<string>storage.type.function.
|
57
|
+
<string>storage.type.function.coffee</string>
|
59
58
|
</dict>
|
60
59
|
</dict>
|
61
60
|
<key>comment</key>
|
@@ -63,7 +62,7 @@
|
|
63
62
|
<key>match</key>
|
64
63
|
<string>([a-zA-Z_?., $]*)\s*(=>)</string>
|
65
64
|
<key>name</key>
|
66
|
-
<string>meta.inline.function.
|
65
|
+
<string>meta.inline.function.coffee</string>
|
67
66
|
</dict>
|
68
67
|
<dict>
|
69
68
|
<key>captures</key>
|
@@ -71,12 +70,12 @@
|
|
71
70
|
<key>1</key>
|
72
71
|
<dict>
|
73
72
|
<key>name</key>
|
74
|
-
<string>keyword.operator.new.
|
73
|
+
<string>keyword.operator.new.coffee</string>
|
75
74
|
</dict>
|
76
75
|
<key>2</key>
|
77
76
|
<dict>
|
78
77
|
<key>name</key>
|
79
|
-
<string>entity.name.type.instance.
|
78
|
+
<string>entity.name.type.instance.coffee</string>
|
80
79
|
</dict>
|
81
80
|
</dict>
|
82
81
|
<key>match</key>
|
@@ -88,7 +87,7 @@
|
|
88
87
|
<key>match</key>
|
89
88
|
<string>\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?))\b</string>
|
90
89
|
<key>name</key>
|
91
|
-
<string>constant.numeric.
|
90
|
+
<string>constant.numeric.coffee</string>
|
92
91
|
</dict>
|
93
92
|
<dict>
|
94
93
|
<key>begin</key>
|
@@ -98,7 +97,7 @@
|
|
98
97
|
<key>0</key>
|
99
98
|
<dict>
|
100
99
|
<key>name</key>
|
101
|
-
<string>punctuation.definition.string.begin.
|
100
|
+
<string>punctuation.definition.string.begin.coffee</string>
|
102
101
|
</dict>
|
103
102
|
</dict>
|
104
103
|
<key>end</key>
|
@@ -108,18 +107,18 @@
|
|
108
107
|
<key>0</key>
|
109
108
|
<dict>
|
110
109
|
<key>name</key>
|
111
|
-
<string>punctuation.definition.string.end.
|
110
|
+
<string>punctuation.definition.string.end.coffee</string>
|
112
111
|
</dict>
|
113
112
|
</dict>
|
114
113
|
<key>name</key>
|
115
|
-
<string>string.quoted.single.
|
114
|
+
<string>string.quoted.single.coffee</string>
|
116
115
|
<key>patterns</key>
|
117
116
|
<array>
|
118
117
|
<dict>
|
119
118
|
<key>match</key>
|
120
119
|
<string>\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)</string>
|
121
120
|
<key>name</key>
|
122
|
-
<string>constant.character.escape.
|
121
|
+
<string>constant.character.escape.coffee</string>
|
123
122
|
</dict>
|
124
123
|
</array>
|
125
124
|
</dict>
|
@@ -131,7 +130,7 @@
|
|
131
130
|
<key>0</key>
|
132
131
|
<dict>
|
133
132
|
<key>name</key>
|
134
|
-
<string>punctuation.definition.string.begin.
|
133
|
+
<string>punctuation.definition.string.begin.coffee</string>
|
135
134
|
</dict>
|
136
135
|
</dict>
|
137
136
|
<key>end</key>
|
@@ -141,18 +140,18 @@
|
|
141
140
|
<key>0</key>
|
142
141
|
<dict>
|
143
142
|
<key>name</key>
|
144
|
-
<string>punctuation.definition.string.end.
|
143
|
+
<string>punctuation.definition.string.end.coffee</string>
|
145
144
|
</dict>
|
146
145
|
</dict>
|
147
146
|
<key>name</key>
|
148
|
-
<string>string.quoted.double.
|
147
|
+
<string>string.quoted.double.coffee</string>
|
149
148
|
<key>patterns</key>
|
150
149
|
<array>
|
151
150
|
<dict>
|
152
151
|
<key>match</key>
|
153
152
|
<string>\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)</string>
|
154
153
|
<key>name</key>
|
155
|
-
<string>constant.character.escape.
|
154
|
+
<string>constant.character.escape.coffee</string>
|
156
155
|
</dict>
|
157
156
|
</array>
|
158
157
|
</dict>
|
@@ -164,7 +163,7 @@
|
|
164
163
|
<key>0</key>
|
165
164
|
<dict>
|
166
165
|
<key>name</key>
|
167
|
-
<string>punctuation.definition.string.begin.
|
166
|
+
<string>punctuation.definition.string.begin.coffee</string>
|
168
167
|
</dict>
|
169
168
|
</dict>
|
170
169
|
<key>end</key>
|
@@ -174,18 +173,18 @@
|
|
174
173
|
<key>0</key>
|
175
174
|
<dict>
|
176
175
|
<key>name</key>
|
177
|
-
<string>punctuation.definition.string.end.
|
176
|
+
<string>punctuation.definition.string.end.coffee</string>
|
178
177
|
</dict>
|
179
178
|
</dict>
|
180
179
|
<key>name</key>
|
181
|
-
<string>string.quoted.script.
|
180
|
+
<string>string.quoted.script.coffee</string>
|
182
181
|
<key>patterns</key>
|
183
182
|
<array>
|
184
183
|
<dict>
|
185
184
|
<key>match</key>
|
186
185
|
<string>\\(x\h{2}|[0-2][0-7]{,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)</string>
|
187
186
|
<key>name</key>
|
188
|
-
<string>constant.character.escape.
|
187
|
+
<string>constant.character.escape.coffee</string>
|
189
188
|
</dict>
|
190
189
|
</array>
|
191
190
|
</dict>
|
@@ -195,61 +194,61 @@
|
|
195
194
|
<key>1</key>
|
196
195
|
<dict>
|
197
196
|
<key>name</key>
|
198
|
-
<string>punctuation.definition.comment.
|
197
|
+
<string>punctuation.definition.comment.coffee</string>
|
199
198
|
</dict>
|
200
199
|
</dict>
|
201
200
|
<key>match</key>
|
202
201
|
<string>(#).*$\n?</string>
|
203
202
|
<key>name</key>
|
204
|
-
<string>comment.line.
|
203
|
+
<string>comment.line.coffee</string>
|
205
204
|
</dict>
|
206
205
|
<dict>
|
207
206
|
<key>match</key>
|
208
207
|
<string>\b(break|when|catch|continue|else|finally|for|if|return|switch|then|throw|try|unless|while)\b</string>
|
209
208
|
<key>name</key>
|
210
|
-
<string>keyword.control.
|
209
|
+
<string>keyword.control.coffee</string>
|
211
210
|
</dict>
|
212
211
|
<dict>
|
213
212
|
<key>match</key>
|
214
213
|
<string>\b(true|on|yes)\b</string>
|
215
214
|
<key>name</key>
|
216
|
-
<string>constant.language.boolean.true.
|
215
|
+
<string>constant.language.boolean.true.coffee</string>
|
217
216
|
</dict>
|
218
217
|
<dict>
|
219
218
|
<key>match</key>
|
220
219
|
<string>\b(false|off|no)\b</string>
|
221
220
|
<key>name</key>
|
222
|
-
<string>constant.language.boolean.false.
|
221
|
+
<string>constant.language.boolean.false.coffee</string>
|
223
222
|
</dict>
|
224
223
|
<dict>
|
225
224
|
<key>match</key>
|
226
225
|
<string>\bnull\b</string>
|
227
226
|
<key>name</key>
|
228
|
-
<string>constant.language.null.
|
227
|
+
<string>constant.language.null.coffee</string>
|
229
228
|
</dict>
|
230
229
|
<dict>
|
231
230
|
<key>match</key>
|
232
231
|
<string>\b(super|this|extends)\b</string>
|
233
232
|
<key>name</key>
|
234
|
-
<string>variable.language.
|
233
|
+
<string>variable.language.coffee</string>
|
235
234
|
</dict>
|
236
235
|
<dict>
|
237
236
|
<key>match</key>
|
238
237
|
<string>\b(debugger)\b</string>
|
239
238
|
<key>name</key>
|
240
|
-
<string>keyword.other.
|
239
|
+
<string>keyword.other.coffee</string>
|
241
240
|
</dict>
|
242
241
|
<dict>
|
243
242
|
<key>match</key>
|
244
|
-
<string>!|\$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&
|
243
|
+
<string>!|\$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\?|\|\||\:|\*=|(?<!\()/=|%=|\+=|\-=|&=|\^=|\b(in|instanceof|new|delete|typeof|and|or|is|isnt|not)\b</string>
|
245
244
|
<key>name</key>
|
246
|
-
<string>keyword.operator.
|
245
|
+
<string>keyword.operator.coffee</string>
|
247
246
|
</dict>
|
248
247
|
<dict>
|
249
248
|
<key>match</key>
|
250
249
|
<string>\b(Infinity|NaN|undefined)\b</string>
|
251
250
|
<key>name</key>
|
252
|
-
<string>constant.language.
|
251
|
+
<string>constant.language.coffee</string>
|
253
252
|
</dict>
|
254
253
|
<dict>
|
255
254
|
<key>begin</key>
|
@@ -259,7 +258,7 @@
|
|
259
258
|
<key>1</key>
|
260
259
|
<dict>
|
261
260
|
<key>name</key>
|
262
|
-
<string>punctuation.definition.string.begin.
|
261
|
+
<string>punctuation.definition.string.begin.coffee</string>
|
263
262
|
</dict>
|
264
263
|
</dict>
|
265
264
|
<key>end</key>
|
@@ -269,18 +268,18 @@
|
|
269
268
|
<key>1</key>
|
270
269
|
<dict>
|
271
270
|
<key>name</key>
|
272
|
-
<string>punctuation.definition.string.end.
|
271
|
+
<string>punctuation.definition.string.end.coffee</string>
|
273
272
|
</dict>
|
274
273
|
</dict>
|
275
274
|
<key>name</key>
|
276
|
-
<string>string.regexp.
|
275
|
+
<string>string.regexp.coffee</string>
|
277
276
|
<key>patterns</key>
|
278
277
|
<array>
|
279
278
|
<dict>
|
280
279
|
<key>match</key>
|
281
280
|
<string>\\.</string>
|
282
281
|
<key>name</key>
|
283
|
-
<string>constant.character.escape.
|
282
|
+
<string>constant.character.escape.coffee</string>
|
284
283
|
</dict>
|
285
284
|
</array>
|
286
285
|
</dict>
|
@@ -288,41 +287,41 @@
|
|
288
287
|
<key>match</key>
|
289
288
|
<string>\;</string>
|
290
289
|
<key>name</key>
|
291
|
-
<string>punctuation.terminator.statement.
|
290
|
+
<string>punctuation.terminator.statement.coffee</string>
|
292
291
|
</dict>
|
293
292
|
<dict>
|
294
293
|
<key>match</key>
|
295
294
|
<string>,[ |\t]*</string>
|
296
295
|
<key>name</key>
|
297
|
-
<string>meta.delimiter.object.comma.
|
296
|
+
<string>meta.delimiter.object.comma.coffee</string>
|
298
297
|
</dict>
|
299
298
|
<dict>
|
300
299
|
<key>match</key>
|
301
300
|
<string>\.</string>
|
302
301
|
<key>name</key>
|
303
|
-
<string>meta.delimiter.method.period.
|
302
|
+
<string>meta.delimiter.method.period.coffee</string>
|
304
303
|
</dict>
|
305
304
|
<dict>
|
306
305
|
<key>match</key>
|
307
306
|
<string>\{|\}</string>
|
308
307
|
<key>name</key>
|
309
|
-
<string>meta.brace.curly.
|
308
|
+
<string>meta.brace.curly.coffee</string>
|
310
309
|
</dict>
|
311
310
|
<dict>
|
312
311
|
<key>match</key>
|
313
312
|
<string>\(|\)</string>
|
314
313
|
<key>name</key>
|
315
|
-
<string>meta.brace.round.
|
314
|
+
<string>meta.brace.round.coffee</string>
|
316
315
|
</dict>
|
317
316
|
<dict>
|
318
317
|
<key>match</key>
|
319
318
|
<string>\[|\]</string>
|
320
319
|
<key>name</key>
|
321
|
-
<string>meta.brace.square.
|
320
|
+
<string>meta.brace.square.coffee</string>
|
322
321
|
</dict>
|
323
322
|
</array>
|
324
323
|
<key>scopeName</key>
|
325
|
-
<string>source.
|
324
|
+
<string>source.coffee</string>
|
326
325
|
<key>uuid</key>
|
327
326
|
<string>5B520980-A7D5-4E10-8582-1A4C889A8DE5</string>
|
328
327
|
</dict>
|
data/lib/coffee_script/grammar.y
CHANGED
@@ -26,18 +26,18 @@ prechigh
|
|
26
26
|
left '<=' '<' '>' '>='
|
27
27
|
right '==' '!=' IS ISNT
|
28
28
|
left '&&' '||' AND OR
|
29
|
-
right '
|
29
|
+
right '-=' '+=' '/=' '*=' '%='
|
30
30
|
right DELETE INSTANCEOF TYPEOF
|
31
|
-
left
|
31
|
+
left '.'
|
32
32
|
right THROW FOR IN WHILE NEW SUPER
|
33
33
|
left UNLESS IF ELSE EXTENDS
|
34
|
-
left
|
34
|
+
left ASSIGN '||=' '&&='
|
35
35
|
right RETURN
|
36
36
|
preclow
|
37
37
|
|
38
|
-
# We expect
|
38
|
+
# We expect 3 shift/reduce errors for optional syntax.
|
39
39
|
# There used to be 252 -- greatly improved.
|
40
|
-
expect
|
40
|
+
expect 3
|
41
41
|
|
42
42
|
rule
|
43
43
|
|
@@ -115,13 +115,13 @@ rule
|
|
115
115
|
|
116
116
|
# Assignment to a variable.
|
117
117
|
Assign:
|
118
|
-
Value
|
118
|
+
Value ASSIGN Expression { result = AssignNode.new(val[0], val[2]) }
|
119
119
|
;
|
120
120
|
|
121
121
|
# Assignment within an object literal.
|
122
122
|
AssignObj:
|
123
|
-
IDENTIFIER
|
124
|
-
| STRING
|
123
|
+
IDENTIFIER ASSIGN Expression { result = AssignNode.new(val[0], val[2], :object) }
|
124
|
+
| STRING ASSIGN Expression { result = AssignNode.new(val[0], val[2], :object) }
|
125
125
|
| Comment { result = val[0] }
|
126
126
|
;
|
127
127
|
|
@@ -179,13 +179,13 @@ rule
|
|
179
179
|
| Expression AND Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
180
180
|
| Expression OR Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
181
181
|
|
182
|
-
| Expression '
|
183
|
-
| Expression '
|
184
|
-
| Expression '
|
185
|
-
| Expression '
|
186
|
-
| Expression '
|
187
|
-
| Expression '
|
188
|
-
| Expression '
|
182
|
+
| Expression '-=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
183
|
+
| Expression '+=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
184
|
+
| Expression '/=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
185
|
+
| Expression '*=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
186
|
+
| Expression '%=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
187
|
+
| Expression '||=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
188
|
+
| Expression '&&=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
|
189
189
|
|
190
190
|
| DELETE Expression { result = OpNode.new(val[0], val[1]) }
|
191
191
|
| TYPEOF Expression { result = OpNode.new(val[0], val[1]) }
|
@@ -259,12 +259,13 @@ rule
|
|
259
259
|
|
260
260
|
# Extending an object's prototype.
|
261
261
|
Extends:
|
262
|
-
Value EXTENDS
|
262
|
+
Value EXTENDS Value { result = ExtendsNode.new(val[0], val[2]) }
|
263
263
|
;
|
264
264
|
|
265
265
|
# A generic function invocation.
|
266
266
|
Invocation:
|
267
267
|
Value "(" ArgList ")" { result = CallNode.new(val[0], val[2]) }
|
268
|
+
| Invocation "(" ArgList ")" { result = CallNode.new(val[0], val[2]) }
|
268
269
|
;
|
269
270
|
|
270
271
|
# Calling super.
|
@@ -315,19 +316,23 @@ rule
|
|
315
316
|
;
|
316
317
|
|
317
318
|
# Array comprehensions, including guard and current index.
|
319
|
+
# Looks a little confusing, check nodes.rb for the arguments to ForNode.
|
318
320
|
For:
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
321
|
+
Expression FOR
|
322
|
+
ForVariables ForSource { result = ForNode.new(val[0], val[3][0], val[2][0], val[3][1], val[2][1]) }
|
323
|
+
;
|
324
|
+
|
325
|
+
# An array comprehension has variables for the current element and index.
|
326
|
+
ForVariables:
|
327
|
+
IDENTIFIER { result = val }
|
328
|
+
| IDENTIFIER "," IDENTIFIER { result = [val[0], val[2]] }
|
329
|
+
;
|
330
|
+
|
331
|
+
# The source of the array comprehension can optionally be filtered.
|
332
|
+
ForSource:
|
333
|
+
IN PureExpression "." { result = [val[1]] }
|
334
|
+
| IN PureExpression
|
335
|
+
IF Expression "." { result = [val[1], val[3]] }
|
331
336
|
;
|
332
337
|
|
333
338
|
# Switch/When blocks.
|