Skip to content

Commit b88f4fc

Browse files
committed
Make generators visible in the parse tree
- Replace `_comprehension_clause` with `generator` - Place the _block_form inside the generator (instead of having the comprehension clause as a sibiling in the parse tree).
1 parent ee4a179 commit b88f4fc

File tree

2 files changed

+36
-23
lines changed

2 files changed

+36
-23
lines changed

grammar.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,6 @@ module.exports = grammar({
166166
[$.juxtaposition_expression, $._expression],
167167
[$.matrix_row, $.comprehension_expression], // Comprehensions with newlines
168168
[$.parenthesized_expression, $.tuple_expression],
169-
[$._bracket_form, $.tuple_expression],
170169
],
171170

172171
supertypes: $ => [
@@ -534,11 +533,16 @@ module.exports = grammar({
534533
'[',
535534
$._bracket_form,
536535
optional($._terminator),
537-
$._comprehension_clause,
536+
$.for_clause,
537+
repeat(choice(
538+
$.for_clause,
539+
$.if_clause,
540+
)),
538541
']',
539542
)),
540543

541-
_comprehension_clause: $ => seq(
544+
generator: $ => seq(
545+
$._block_form,
542546
$.for_clause,
543547
repeat(choice(
544548
$.for_clause,
@@ -586,16 +590,18 @@ module.exports = grammar({
586590
),
587591

588592
parenthesized_expression: $ => prec.dynamic(1, parenthesize(
589-
sep1($._semicolon, $._bracket_form),
590-
optional($._comprehension_clause),
593+
sep1($._semicolon, choice(
594+
$._bracket_form,
595+
$.generator,
596+
)),
591597
optional($._semicolon),
592598
)),
593599

594600
tuple_expression: $ => parenthesize(
595601
optional($._semicolon),
596602
sep(choice(',', $._semicolon), choice(
597603
$._bracket_form,
598-
seq($._expression, $._comprehension_clause),
604+
$.generator,
599605
)),
600606
optional(','),
601607
),

test/corpus/collections.txt

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,7 @@ comprehension array collections
158158
]
159159
UInt[b(c, e) for c in d for e in f]
160160

161-
f(1, 2, i for i in iter)
162-
(b(c, e) for c in d, e = 5 if e)
163-
164161
---
165-
166162
(source_file
167163
(comprehension_expression
168164
(identifier)
@@ -177,19 +173,30 @@ f(1, 2, i for i in iter)
177173
(comprehension_expression
178174
(call_expression (identifier) (argument_list (identifier) (identifier)))
179175
(for_clause (for_binding (identifier) (operator) (identifier)))
180-
(for_clause (for_binding (identifier) (operator) (identifier)))))
176+
(for_clause (for_binding (identifier) (operator) (identifier))))))
177+
178+
179+
========================================
180+
generators
181+
========================================
182+
183+
f(1, 2, i for i in iter)
184+
(b(c, e) for c in d, e = 5 if e)
181185

186+
---
187+
(source_file
182188
(call_expression
183-
(identifier)
184-
(argument_list
185-
(integer_literal)
186-
(integer_literal)
187189
(identifier)
188-
(for_clause (for_binding (identifier) (operator) (identifier)))))
189-
(parenthesized_expression
190-
(call_expression (identifier) (argument_list (identifier) (identifier)))
191-
(for_clause
192-
(for_binding (identifier) (operator) (identifier))
193-
(for_binding (identifier) (operator) (integer_literal)))
194-
(if_clause (identifier))))
195-
190+
(argument_list
191+
(integer_literal)
192+
(integer_literal)
193+
(generator
194+
(identifier)
195+
(for_clause (for_binding (identifier) (operator) (identifier))))))
196+
(parenthesized_expression
197+
(generator
198+
(call_expression (identifier) (argument_list (identifier) (identifier)))
199+
(for_clause
200+
(for_binding (identifier) (operator) (identifier))
201+
(for_binding (identifier) (operator) (integer_literal)))
202+
(if_clause (identifier)))))

0 commit comments

Comments
 (0)