Skip to content
This repository was archived by the owner on Jun 1, 2022. It is now read-only.

Commit 0431d82

Browse files
authored
[#37] Default parameters (#38)
* [#37] Default parameters * improve rest node
1 parent e364f7c commit 0431d82

File tree

4 files changed

+95
-93
lines changed

4 files changed

+95
-93
lines changed

grammar.js

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ const PREC = Object.freeze({
1414
NOT: 12,
1515
PREFIX: 13,
1616
EXPRESSION: 14,
17-
PARAMETER: 14,
1817
PATTERN: 14,
1918
APPLICATION: 15,
2019
PIPELINE: 16,
@@ -35,14 +34,12 @@ module.exports = grammar({
3534
word: $ => $._identifier_without_operators,
3635
conflicts: $ => [
3736
[$.infix_application],
38-
[$.parameter, $._expression],
39-
[$.parameter, $._pattern],
40-
[$._expression, $._pattern],
41-
[$.parameter, $._expression, $._pattern],
37+
[$._expression, $.pattern],
4238
[$._literal, $._literal_pattern],
4339
[$.string, $.string_pattern],
4440
[$.map, $.map_pattern],
45-
[$.pattern_pair, $._literal]
41+
[$.pattern_pair, $._literal],
42+
[$.shorthand_pair_identifier_pattern, $.map]
4643
],
4744

4845
rules: {
@@ -104,89 +101,82 @@ module.exports = grammar({
104101

105102
block: $ => seq($._indent, $._expression_seq, $._dedent),
106103

107-
parameter: $ => prec(PREC.PARAMETER, choice(
108-
field('value', $._literal),
104+
pattern: $ => prec(PREC.PATTERN, choice(
109105
field('pattern', $._destructuring_pattern),
106+
field('value', $._literal_pattern),
110107
seq(
111-
field('name', $.identifier),
108+
field('name', alias($.identifier, $.identifier_pattern)),
112109
optional(seq('=', field('value', $._expression)))
113110
)
114111
)),
115-
parameters: $ => seq(
116-
'(',
117-
choice(
118-
seq(
119-
commaSep1($.parameter),
120-
optional(seq(',', $.rest_parameter))
121-
),
122-
$.rest_parameter
123-
),
124-
')'
125-
),
126-
rest_parameter: $ => seq(
127-
'...',
128-
field('name', alias($.identifier, $.identifier_pattern)),
129-
optional(seq('=', field('value', $._expression)))
130-
),
131112

132-
argument: $ => choice('?', field('value', $._expression)),
133-
arguments: $ => commaSep1($.argument),
134-
135-
_pattern: $ => prec(PREC.PATTERN, choice(
136-
$._destructuring_pattern,
137-
$._literal_pattern,
138-
alias($.identifier, $.identifier_pattern)
139-
)),
140113
_destructuring_pattern: $ => prec(PREC.PATTERN, choice(
141114
$.map_pattern,
142115
$.tuple_pattern,
143116
$.list_pattern
144117
)),
145-
_literal_pattern: $ => choice(
146-
$.boolean,
147-
$.number,
148-
$.string_pattern,
149-
prec(PREC.REGEX, $.regex)
150-
),
151118
map_pattern: $ => prec(PREC.PATTERN, seq(
152119
'{',
153-
commaSep1(choice(
154-
$.pattern_pair,
155-
alias($.identifier, $.shorthand_pair_identifier_pattern)
156-
)),
157-
optional(seq(',', $.rest_pattern)),
120+
commaSep1(choice($.pattern_pair, $.shorthand_pair_identifier_pattern)),
121+
optional(seq(',', alias($.rest, $.rest_map))),
158122
'}'
159123
)),
160124
tuple_pattern: $ => prec(PREC.PATTERN, choice(
161-
seq('(', $._pattern, ',', $.rest_pattern, ')'),
125+
seq('(', $.pattern, ',', alias($.rest, $.rest_list), ')'),
162126
seq(
163127
'(',
164-
commaSep2($._pattern),
165-
optional(seq(',', $.rest_pattern)),
128+
commaSep2($.pattern),
129+
optional(seq(',', alias($.rest, $.rest_list))),
166130
')'
167131
)
168132
)),
169133
list_pattern: $ => prec(PREC.PATTERN, seq(
170134
'[',
171-
commaSep1($._pattern),
172-
optional(seq(',', $.rest_pattern)),
135+
commaSep1($.pattern),
136+
optional(seq(',', alias($.rest, $.rest_list))),
173137
']'
174138
)),
175139
pattern_pair: $ => seq(
176140
field('left', $.string_pattern),
177141
'->',
178-
field('right', $._pattern)
142+
field('right', $.pattern)
179143
),
180-
rest_pattern: $ => seq(
144+
shorthand_pair_identifier_pattern: $ => seq(
145+
field('name', alias($.identifier, $.identifier_pattern)),
146+
optional(seq('=', field('value', $._expression)))
147+
),
148+
rest: $ => seq(
181149
'...',
182150
field('name', alias($.identifier, $.identifier_pattern))
183151
),
152+
153+
_literal_pattern: $ => choice(
154+
$.boolean,
155+
$.number,
156+
$.string_pattern,
157+
prec(PREC.REGEX, $.regex)
158+
),
184159
string_pattern: $ => seq(
185160
$._string_start,
186161
repeat(choice($.escape_sequence, $._string_content)),
187162
$._string_end
188163
),
189164

165+
parameters: $ => seq(
166+
'(',
167+
choice(
168+
seq(
169+
commaSep1($.pattern),
170+
optional(seq(',', alias($.rest, $.rest_list))),
171+
),
172+
alias($.rest, $.rest_list)
173+
),
174+
')'
175+
),
176+
177+
argument: $ => choice('?', field('value', $._expression)),
178+
arguments: $ => commaSep1($.argument),
179+
190180
_group: $ => seq('(', $._expression, ')'),
191181

192182
abstraction: $ => prec.left(commaSep1($.abstraction_branch)),

test/corpus/expressions.txt

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ abstraction
33
==================
44

55
(a, b) => a
6-
(a = 1, b, 1, {c}, ...d) => a
6+
(a, b, 1, {c = 1}, ...d) => a
77

88
fib := (0) =>
99
0,
1010
(1) =>
1111
1,
12-
(n) =>
12+
(n = 2) =>
1313
fib(n - 1) + fib(n - 2)
1414

1515
---
@@ -18,44 +18,46 @@ fib := (0) =>
1818
(abstraction
1919
(abstraction_branch
2020
parameters: (parameters
21-
(parameter
22-
name: (identifier))
23-
(parameter
24-
name: (identifier)))
21+
(pattern
22+
name: (identifier_pattern))
23+
(pattern
24+
name: (identifier_pattern)))
2525
body: (identifier)))
2626
(abstraction
2727
(abstraction_branch
2828
parameters: (parameters
29-
(parameter
30-
name: (identifier)
31-
value: (number))
32-
(parameter
33-
name: (identifier))
34-
(parameter
35-
value: (number))
36-
(parameter
29+
(pattern
30+
name: (identifier_pattern))
31+
(pattern
32+
name: (identifier_pattern))
33+
(pattern
34+
value: (number))
35+
(pattern
3736
pattern: (map_pattern
38-
(shorthand_pair_identifier_pattern)))
39-
(rest_parameter
37+
(shorthand_pair_identifier_pattern
38+
name: (identifier_pattern)
39+
value: (number))))
40+
(rest_list
4041
name: (identifier_pattern)))
4142
body: (identifier)))
4243
(assignment
4344
left: (identifier_pattern)
4445
right: (abstraction
4546
(abstraction_branch
4647
parameters: (parameters
47-
(parameter
48+
(pattern
4849
value: (number)))
4950
body: (number))
5051
(abstraction_branch
5152
parameters: (parameters
52-
(parameter
53+
(pattern
5354
value: (number)))
5455
body: (number))
5556
(abstraction_branch
5657
parameters: (parameters
57-
(parameter
58-
name: (identifier)))
58+
(pattern
59+
name: (identifier_pattern)
60+
value: (number)))
5961
body: (infix_application
6062
left: (application
6163
abstraction: (identifier)
@@ -127,7 +129,7 @@ a 1
127129
value: (number)))))))
128130

129131
==================
130-
unary expressions
132+
prefix application
131133
==================
132134

133135
!false
@@ -152,7 +154,7 @@ unary expressions
152154
argument: (number)))
153155

154156
==================
155-
binary expressions
157+
infix application
156158
==================
157159

158160
1 .. 1
@@ -358,16 +360,16 @@ a := (a) =>
358360
right: (abstraction
359361
(abstraction_branch
360362
parameters: (parameters
361-
(parameter
362-
name: (identifier)))
363+
(pattern
364+
name: (identifier_pattern)))
363365
body: (number)))))
364366

365367
==================
366368
return
367369
==================
368370

369371
return 1
370-
return (a )=>
372+
return (a) =>
371373
1
372374

373375
---
@@ -379,6 +381,6 @@ return (a )=>
379381
value: (abstraction
380382
(abstraction_branch
381383
parameters: (parameters
382-
(parameter
383-
name: (identifier)))
384+
(pattern
385+
name: (identifier_pattern)))
384386
body: (number)))))

test/corpus/patterns.txt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,18 @@ map pattern
1212
left: (map_pattern
1313
(pattern_pair
1414
left: (string_pattern)
15-
right: (identifier_pattern)))
15+
right: (pattern
16+
name: (identifier_pattern))))
1617
right: (identifier))
1718
(assignment
1819
left: (map_pattern
1920
(pattern_pair
2021
left: (string_pattern)
21-
right: (identifier_pattern))
22-
(shorthand_pair_identifier_pattern)
23-
(rest_pattern
22+
right: (pattern
23+
name: (identifier_pattern)))
24+
(shorthand_pair_identifier_pattern
25+
name: (identifier_pattern))
26+
(rest_map
2427
name: (identifier_pattern)))
2528
right: (identifier)))
2629

@@ -36,13 +39,16 @@ tuple pattern
3639
(program
3740
(assignment
3841
left: (tuple_pattern
39-
(identifier_pattern)
40-
(identifier_pattern))
42+
(pattern
43+
name: (identifier_pattern))
44+
(pattern
45+
name: (identifier_pattern)))
4146
right: (identifier))
4247
(assignment
4348
left: (tuple_pattern
44-
(identifier_pattern)
45-
(rest_pattern
49+
(pattern
50+
name: (identifier_pattern))
51+
(rest_list
4652
name: (identifier_pattern)))
4753
right: (identifier)))
4854

@@ -58,13 +64,17 @@ list pattern
5864
(program
5965
(assignment
6066
left: (list_pattern
61-
(identifier_pattern)
62-
(identifier_pattern))
67+
(pattern
68+
name: (identifier_pattern))
69+
(pattern
70+
name: (identifier_pattern)))
6371
right: (identifier))
6472
(assignment
6573
left: (list_pattern
66-
(identifier_pattern)
67-
(identifier_pattern)
68-
(rest_pattern
74+
(pattern
75+
name: (identifier_pattern))
76+
(pattern
77+
name: (identifier_pattern))
78+
(rest_list
6979
name: (identifier_pattern)))
7080
right: (identifier)))

test/corpus/statements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ export a := (a) =>
3636
right: (abstraction
3737
(abstraction_branch
3838
parameters: (parameters
39-
(parameter
40-
name: (identifier)))
39+
(pattern
40+
name: (identifier_pattern)))
4141
body: (number))))))

0 commit comments

Comments
 (0)