@@ -17,6 +17,7 @@ const PREC = Object.freeze({
1717 PATTERN : 14 ,
1818 APPLICATION : 15 ,
1919 PIPELINE : 16 ,
20+ ACCESS : 17
2021} ) ;
2122
2223module . exports = grammar ( {
@@ -98,6 +99,7 @@ module.exports = grammar({
9899 $ . prefix_application ,
99100 $ . infix_application ,
100101 $ . pipeline ,
102+ $ . access ,
101103 alias ( $ . simple_assignment , $ . assignment ) ,
102104 $ . return ,
103105 alias ( $ . simple_if , $ . if ) ,
@@ -112,11 +114,12 @@ module.exports = grammar({
112114 alias ( $ . compound_abstraction , $ . abstraction ) ,
113115 alias ( $ . compound_assignment , $ . assignment ) ,
114116 alias ( $ . compound_if , $ . if ) ,
115- alias ( $ . compound_case , $ . case )
117+ $ . case ,
118+ $ . module
116119 ) ,
117120
118121 block : $ => choice (
119- seq ( optional ( 'then' ) , $ . _simple_expression , $ . _newline ) ,
122+ seq ( $ . _simple_expression , $ . _newline ) ,
120123 seq ( $ . _newline , $ . _indent , repeat1 ( $ . _expression ) , $ . _dedent )
121124 ) ,
122125
@@ -265,6 +268,15 @@ module.exports = grammar({
265268 field ( 'right' , $ . _simple_expression )
266269 ) ) ,
267270
271+ access : $ => prec . left ( PREC . ACCESS , seq (
272+ field ( 'left' , $ . _simple_expression ) ,
273+ '->' ,
274+ choice (
275+ seq ( '[' , field ( 'right' , $ . _simple_expression ) , ']' ) ,
276+ field ( 'right' , alias ( $ . identifier , $ . shorthand_access_identifier ) )
277+ )
278+ ) ) ,
279+
268280 simple_assignment : $ => seq (
269281 field ( 'left' , choice (
270282 alias ( $ . identifier , $ . identifier_pattern ) ,
@@ -304,17 +316,19 @@ module.exports = grammar({
304316 compound_if : $ => prec . right ( seq (
305317 'if' ,
306318 field ( 'condition' , $ . _simple_expression ) ,
319+ optional ( 'then' ) ,
307320 field ( 'consequence' , $ . block ) ,
308321 field ( 'alternatives' , alias ( repeat ( $ . else_if_clause ) , $ . else_if_clauses ) ) ,
309322 optional ( seq ( 'else' , field ( 'alternative' , $ . block ) ) )
310323 ) ) ,
311324 else_if_clause : $ => seq (
312325 'else if' ,
313326 field ( 'condition' , $ . _simple_expression ) ,
327+ optional ( 'then' ) ,
314328 field ( 'consequence' , $ . block )
315329 ) ,
316330
317- compound_case : $ => seq (
331+ case : $ => seq (
318332 'case' ,
319333 field ( 'value' , $ . _simple_expression ) ,
320334 field ( 'branches' , alias ( repeat1 ( $ . when_clause ) , $ . when_clauses ) ) ,
@@ -323,10 +337,18 @@ module.exports = grammar({
323337 when_clause : $ => seq (
324338 'when' ,
325339 field ( 'values' , $ . expression_list ) ,
340+ optional ( 'then' ) ,
326341 field ( 'consequence' , $ . block )
327342 ) ,
328343 expression_list : $ => commaSep1 ( $ . _simple_expression ) ,
329344
345+ module : $ => seq (
346+ 'module' ,
347+ field ( 'name' , $ . identifier ) ,
348+ optional ( 'where' ) ,
349+ field ( 'body' , $ . block )
350+ ) ,
351+
330352 map : $ => seq (
331353 '{' ,
332354 commaSep ( choice (
0 commit comments