diff --git a/corpus/edigits_like.langexp b/corpus/edigits_like.langexp index 8a2a89c..b8092b1 100644 --- a/corpus/edigits_like.langexp +++ b/corpus/edigits_like.langexp @@ -62,17 +62,21 @@ test_k 'n 'k : Int Int -> Bool = { -------------------------------------------------------------------------------- (source_file + (empty_lines) (import (simple_name_identifier)) + (empty_lines) (import (simple_name_identifier) (simple_type_identifier)) + (empty_lines) (import (simple_name_identifier)) (empty_lines) (function_definition (simple_name_identifier) (block + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -90,6 +94,7 @@ test_k 'n 'k : Int Int -> Bool = { (number_literal))) (simple_name_identifier)) (number_literal)))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -97,6 +102,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier) (number_literal)))) + (empty_lines) (match (operator_expression (name_definition @@ -113,12 +119,14 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier)) (operator) (number_literal))))) + (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -135,6 +143,7 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier)) (operator) (number_literal))))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -149,12 +158,14 @@ test_k 'n 'k : Int Int -> Bool = { (operator_tail1) (name_expression (simple_name_identifier))))) + (empty_lines) (match (name_definition (simple_name_identifier)) (case (name_expression (simple_name_identifier)))) + (empty_lines) (loop (name_definition (simple_name_identifier)) @@ -178,6 +189,7 @@ test_k 'n 'k : Int Int -> Bool = { (operator) (number_literal))) (block + (empty_lines) (condition (operator_expression (operator_expression @@ -237,7 +249,9 @@ test_k 'n 'k : Int Int -> Bool = { (string_literal)) (operator) (name_expression - (simple_name_identifier))))))))) + (simple_name_identifier))))) + (empty_lines))) + (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) @@ -252,6 +266,7 @@ test_k 'n 'k : Int Int -> Bool = { (type (simple_type_identifier)) (block + (empty_lines) (condition (operator_expression (name_expression @@ -289,6 +304,7 @@ test_k 'n 'k : Int Int -> Bool = { (argument_name_identifier))) (operator_tail1) (number_literal)))) + (empty_lines) (match (operator_expression (name_definition @@ -301,6 +317,7 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier) (argument_name_identifier) (simple_name_identifier)))) + (empty_lines) (match (operator_expression (name_definition @@ -332,7 +349,8 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier)) (operator) (name_expression - (simple_name_identifier))))))) + (simple_name_identifier))))) + (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) @@ -342,16 +360,19 @@ test_k 'n 'k : Int Int -> Bool = { (type (simple_type_identifier)) (block + (empty_lines) (match (name_definition (simple_name_identifier)) (case (number_literal))) + (empty_lines) (match (name_definition (simple_name_identifier)) (case (number_literal))) + (empty_lines) (loop (name_expression (simple_name_identifier) @@ -360,17 +381,21 @@ test_k 'n 'k : Int Int -> Bool = { (argument_name_identifier) (simple_name_identifier))) (block + (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (name_expression (simple_name_identifier))) + (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) - (number_literal)))) + (number_literal)) + (empty_lines))) + (empty_lines) (loop (operator_expression (operator_expression @@ -382,6 +407,7 @@ test_k 'n 'k : Int Int -> Bool = { (operator_tail1) (number_literal)) (block + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -395,6 +421,7 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier))) (operator_tail1) (number_literal)))) + (empty_lines) (condition (name_expression (simple_name_identifier) @@ -411,10 +438,13 @@ test_k 'n 'k : Int Int -> Bool = { (simple_name_identifier)) (operator) (name_expression - (simple_name_identifier)))))) + (simple_name_identifier)))) + (empty_lines))) + (empty_lines) (return (name_expression - (simple_name_identifier))))) + (simple_name_identifier))) + (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) @@ -427,6 +457,7 @@ test_k 'n 'k : Int Int -> Bool = { (type (simple_type_identifier)) (block + (empty_lines) (condition (operator_expression (name_expression @@ -458,6 +489,7 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier) (simple_name_identifier)))))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -478,4 +510,6 @@ test_k 'n 'k : Int Int -> Bool = { (name_expression (simple_name_identifier)) (operator) - (number_literal))))))) + (number_literal)))) + (empty_lines))) + (empty_lines)) diff --git a/corpus/test.langexp b/corpus/test.langexp index c076d9b..0715633 100644 --- a/corpus/test.langexp +++ b/corpus/test.langexp @@ -155,15 +155,16 @@ bubble_sort_2 'arr : ref Array['A] = { & @key Key & @value Value & @left ^TreeNode['Key 'Value] - & @right ^TreeNode['Key 'Value] { - new = do_something; // static methods + & @right ^TreeNode['Key 'Value]; - $insert 'key = do_something; // const methods +.new = do_something; // static methods - %find 'key = do_something; +.insert <> 'this 'key = do_something; // const methods + +.find 'this 'key = do_something; + +.delete <> 'this 'key = do_something; // var methods - $delete 'key = do_something; // var methods -} generic_type_name_expressions = { $x := TreeNode[Int Int].new; @@ -203,9 +204,8 @@ move_construct_task 'name 'duration : <- String <- Float -> Task = Task @name 'n arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name 'duration; : ord is fundamental typeclass -#Ord : #Eq { - $is_less_then : Ord -> Bool; -} +#Ord[#Eq]; +.is_less_then : Ord -> Bool; : function, that takes result argument result_example 'a! = 'a =: _? => print "value inside" @@ -229,19 +229,24 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a -------------------------------------------------------------------------------- (source_file + (empty_lines) + (extra) (empty_lines) (import (simple_name_identifier)) + (extra) (empty_lines) (import (placeholder) (simple_name_identifier)) + (extra) (empty_lines) (import (simple_name_identifier) (simple_name_identifier) (simple_name_identifier) (simple_name_identifier)) + (empty_lines) (import (simple_name_identifier) (simple_name_identifier)) @@ -252,19 +257,22 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (empty_lines) (loop (block + (empty_lines) (match (name_definition (simple_name_identifier)) (case (name_expression (simple_name_identifier)))) + (empty_lines) (condition (operator_expression (name_expression (simple_name_identifier)) (operator) (char_literal)) - (loop_control)))) + (loop_control)) + (empty_lines))) (empty_lines) (loop (operator_expression @@ -273,9 +281,11 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (operator) (number_literal)) (block + (empty_lines) (name_expression (simple_name_identifier) - (simple_name_identifier)))) + (simple_name_identifier)) + (empty_lines))) (empty_lines) (loop (name_definition @@ -285,9 +295,11 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (operator) (number_literal)) (block + (empty_lines) (name_expression (simple_name_identifier) - (string_literal)))) + (string_literal)) + (empty_lines))) (empty_lines) (condition (operator_expression @@ -325,16 +337,20 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (operator) (number_literal)) (block + (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (number_literal)) + (empty_lines) (name_expression (simple_name_identifier) - (simple_name_identifier))) + (simple_name_identifier)) + (empty_lines)) (return - (unit_literal))))) + (unit_literal))) + (empty_lines))) (empty_lines) (function_definition (definition_info @@ -436,6 +452,7 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (function_definition (simple_name_identifier) (block + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -510,6 +527,8 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (placeholder) (string_literal))) (empty_lines) + (extra) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -518,6 +537,7 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (simple_name_identifier) (simple_name_identifier) (simple_name_identifier)))) + (empty_lines) (name_expression (simple_name_identifier) (simple_name_identifier)) @@ -547,6 +567,8 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (annotation_identifier) (float_number_literal)))) (empty_lines) + (extra) + (empty_lines) (match (suffix_expression (name_definition @@ -557,13 +579,7 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (name_expression (simple_name_identifier)))) (empty_lines) - (match - (suffix_expression - (name_definition - (simple_name_identifier))) - (case - (name_expression - (simple_name_identifier)))) + (extra) (empty_lines) (match (suffix_expression @@ -573,12 +589,28 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (name_expression (simple_name_identifier)))) (empty_lines) - (suffix_expression - (simple_name_identifier)) + (extra) + (empty_lines) + (match + (suffix_expression + (name_definition + (simple_name_identifier))) + (case + (name_expression + (simple_name_identifier)))) + (empty_lines) + (extra) (empty_lines) (suffix_expression (simple_name_identifier)) (empty_lines) + (extra) + (empty_lines) + (suffix_expression + (simple_name_identifier)) + (empty_lines) + (extra) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -634,6 +666,8 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (number_literal) (number_literal)))) (empty_lines) + (extra) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -645,11 +679,13 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (number_literal)) (operator) (number_literal)))) + (empty_lines) (name_expression (simple_name_identifier) (tuple_access (simple_name_identifier) - (number_literal))))) + (number_literal))) + (empty_lines))) (empty_lines) (function_definition (definition_info @@ -668,29 +704,35 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (function_definition (simple_name_identifier) (block + (empty_lines) (name_expression (simple_name_identifier) (simple_name_identifier) (simple_name_identifier) - (simple_name_identifier)))) + (simple_name_identifier)) + (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) (block + (empty_lines) (name_expression (simple_name_identifier) (simple_name_identifier) (simple_name_identifier) - (simple_name_identifier)))) + (simple_name_identifier)) + (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) (block + (empty_lines) (name_expression (simple_name_identifier) (simple_name_identifier) (simple_name_identifier) - (simple_name_identifier)))) + (simple_name_identifier)) + (empty_lines))) (empty_lines) (type_definition (simple_type_identifier) @@ -729,20 +771,24 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (type (argument_type_identifier))) (block + (empty_lines) (match (name_expression (simple_name_identifier)) (case (bool_literal))) + (empty_lines) (loop (name_expression (simple_name_identifier)) (block + (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (bool_literal)) + (empty_lines) (loop (name_definition (simple_name_identifier)) @@ -784,7 +830,9 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (name_expression (simple_name_identifier)) (operator) - (bool_literal)))))))) + (bool_literal)))) + (empty_lines))) + (empty_lines))) (empty_lines) (function_definition (definition_info @@ -796,20 +844,24 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (type (argument_type_identifier))) (block + (empty_lines) (match (name_definition (simple_name_identifier)) (case (bool_literal))) + (empty_lines) (loop (name_expression (simple_name_identifier)) (block + (empty_lines) (operator_expression (name_expression (simple_name_identifier)) (operator) (bool_literal)) + (empty_lines) (loop (name_definition (simple_name_identifier)) @@ -851,7 +903,9 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (name_expression (simple_name_identifier)) (operator) - (bool_literal)))))))) + (bool_literal)))) + (empty_lines))) + (empty_lines))) (empty_lines) (type_definition (definition_info @@ -881,30 +935,41 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (type (argument_type_identifier)) (type - (argument_type_identifier))))) - (function_definition - (simple_name_identifier) - (name_expression - (simple_name_identifier))) - (function_definition - (simple_name_identifier) - (argument_name_identifier) - (name_expression - (simple_name_identifier))) - (function_definition - (simple_name_identifier) - (argument_name_identifier) - (name_expression - (simple_name_identifier))) - (function_definition - (simple_name_identifier) - (argument_name_identifier) - (name_expression - (simple_name_identifier)))) + (argument_type_identifier)))))) + (empty_lines) + (function_definition + (simple_name_identifier) + (name_expression + (simple_name_identifier))) + (extra) + (empty_lines) + (function_definition + (simple_name_identifier) + (argument_name_identifier) + (argument_name_identifier) + (name_expression + (simple_name_identifier))) + (extra) + (empty_lines) + (function_definition + (simple_name_identifier) + (argument_name_identifier) + (argument_name_identifier) + (name_expression + (simple_name_identifier))) + (empty_lines) + (function_definition + (simple_name_identifier) + (argument_name_identifier) + (argument_name_identifier) + (name_expression + (simple_name_identifier))) + (extra) (empty_lines) (function_definition (simple_name_identifier) (block + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -917,6 +982,7 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (type (simple_type_identifier))) (simple_name_identifier)))) + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -926,11 +992,13 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (simple_type_identifier) (type (simple_type_identifier))) - (simple_name_identifier)))))) + (simple_name_identifier)))) + (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) (block + (empty_lines) (operator_expression (operator_expression (operator_expression @@ -949,6 +1017,8 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (operator) (name_expression (simple_name_identifier))) + (extra) + (empty_lines) (operator_expression (operator_expression (operator_expression @@ -966,11 +1036,14 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (simple_name_identifier))) (operator) (name_expression - (simple_name_identifier))))) + (simple_name_identifier))) + (extra) + (empty_lines))) (empty_lines) (function_definition (simple_name_identifier) (block + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -978,8 +1051,10 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (reference_expression (array_access (simple_name_identifier) - (number_literal))))))) + (number_literal))))) + (empty_lines))) (empty_lines) + (extra) (empty_lines) (function_definition (definition_info @@ -1126,17 +1201,18 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (argument_name_identifier) (argument_name_identifier))) (empty_lines) - (typeclass_definition + (type_definition (definition_info (info)) (typeclass_identifier) - (typeclass_identifier) - (function_definition - (simple_name_identifier) - (type - (simple_type_identifier)) - (type - (simple_type_identifier)))) + (typeclass_identifier)) + (empty_lines) + (function_definition + (simple_name_identifier) + (type + (simple_type_identifier)) + (type + (simple_type_identifier))) (empty_lines) (function_definition (definition_info @@ -1165,6 +1241,7 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (type (simple_type_identifier)) (block + (empty_lines) (match (name_definition (simple_name_identifier)) @@ -1173,6 +1250,7 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (type (simple_type_identifier)) (simple_name_identifier)))) + (empty_lines) (match (suffix_expression (name_definition @@ -1183,10 +1261,13 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (simple_type_identifier)) (simple_name_identifier) (simple_name_identifier)))) + (empty_lines) (name_expression (simple_name_identifier)) + (empty_lines) (return - (unit_literal)))) + (unit_literal)) + (empty_lines))) (empty_lines) (function_definition (definition_info @@ -1243,4 +1324,5 @@ result_func! 'a 'b -> 'c -> 'd = ?? 'a == 0 => error "some error" !!=> ('c := 'a (case (name_expression (argument_name_identifier))))) - (unit_literal))))) + (unit_literal)))) + (empty_lines)) diff --git a/grammar.g4 b/grammar.g4 index b556f9b..1349375 100644 --- a/grammar.g4 +++ b/grammar.g4 @@ -9,7 +9,7 @@ statement: import | type_definition | function_definition | typeclass_definition - | EMPTY_LINES + | EXTRA ; import: ('::' | 'import') (SIMPLE_NAME_IDENTIFIER | '_') ('=' SIMPLE_NAME_IDENTIFIER)? @@ -18,22 +18,20 @@ import: ('::' | 'import') (SIMPLE_NAME_IDENTIFIER | '_') ('=' SIMPLE_NAME_IDENTI constraint: '?' expression ; -type_definition: (DEFINITION_INFO)? (ANNOTATION_INFO)* ('^')? - SIMPLE_TYPE_IDENTIFIER ((ARGUMENT_TYPE_IDENTIFIER)* '=' variant_type)? - (('{' function_definietion '}')|';') - ; - function_definition: (definietion_info)? (ANNOTATION_INFO)* (constraint ';')* - (('%' | 'let') | ('$' | 'var'))? (SIMPLE_NAME_IDENTIFIER | ('(' OPERATOR ')')) - ((ANNOTATION_IDENTIFIER)? (REFERENCE)? ARGUMENT_NAME_IDENTIFIER ('?')?)* + ('.')? (SIMPLE_NAME_IDENTIFIER | ('(' OPERATOR ')')) ('?' | '!') + (((ANNOTATION_IDENTIFIER)? (REFERENCE)? ARGUMENT_NAME_IDENTIFIER ('?' | '!')?)*) (':' ((ANNOTATION_IDENTIFIER)? (REFERENCE)? type)+)? (('=' ( /*prec 2*/ block | (super_expression ';'))) | ';') ; -typeclass_definition: (DEFINITION_INFO)? (ANNOTATION_INFO)* - TYPECLASS_IDENTIFIER (seq(':', (TYPECLASS_IDENTIFIER)+))? - (('{' (function_definition)* '}') | ';') - ; +type_definition: (DEFINITION_INFO)? (ANNOTATION_INFO)* ('^')? + (SIMPLE_TYPE_IDENTIFIER | TYPECLASS_IDENTIFIER) + ('[' (TYPECLASS_IDENTIFIER)+ ']')? + (ARGUMENT_TYPE_IDENTIFIER)* + ('=' variant_type)? + ';' + ; case: (':=' | '=:') expression (('??' | 'if') expression)? (('=>' | 'do') expression)? ; @@ -57,7 +55,7 @@ operator_expression: /* prec left ?? */ | /* prec 1 */ expression OPERATOR_TAIL3 expression ; -block: '{' ((super_expression ';') | EMPTY_LINES)* '}' ; +block: '{' ((super_expression ';') | EXTRA)* '}' ; array: '[[' (scoped_expression)+ ']]' ; @@ -146,7 +144,13 @@ literal: FLOAT_NUMBER_LITERAL DEFINITION_INFO : : ': ' ([^\n]*)+ ; ANNOTATION_INFO : ANNOTATION_IDENTIFIER [^\n]* ; -EMPTY_LINES '\n' ('\n')+ ; +EXTRA: EMPTY_LINES + | LINE_COMMENT + | LINE_COMMENT + | BLOCK_COMMENT + ; + +EMPTY_LINES : ('\n')+ ; LINE_COMMENT : '#!' [^\n]* -> skip ; LINE_COMMENT : '//' [^\n]* -> skip ; diff --git a/grammar.js b/grammar.js index c92a60c..ee6549f 100644 --- a/grammar.js +++ b/grammar.js @@ -4,10 +4,7 @@ module.exports = grammar({ word: $ => $.identifier, extras: $ => [ - $._exec_comment, - $._line_comment, - $._block_comment, - /\s/ + /\s/, ], rules: { @@ -20,7 +17,7 @@ module.exports = grammar({ $.import, $.function_definition, $.type_definition, - $.typeclass_definition, + $.extra, $.empty_lines, ), @@ -29,10 +26,10 @@ module.exports = grammar({ field('name', choice($.simple_name_identifier, $.placeholder)), optional(seq('=', field('module', $.simple_name_identifier))), optional(seq(':', repeat1(choice( - $.simple_type_identifier, $.simple_name_identifier, - $.typeclass_identifier, seq('(',$.operator, ')'), + $.simple_type_identifier, + $.typeclass_identifier, )))), ';', ), @@ -45,38 +42,36 @@ module.exports = grammar({ optional($.definition_info), repeat($.annotation_info), repeat(seq($.constraint, ';')), - optional($._var_let), + optional('.'), // for methods choice(field('name', $.simple_name_identifier), seq('(', field('name', $.operator), ')')), - optional($._optional_result), + optional($._optional_or_result), repeat(seq( optional($.annotation_identifier), optional($._reference), $.argument_name_identifier, - optional($._optional_result), + optional($._optional_or_result), + )), + optional(seq( + ':', + repeat1(seq( + optional($.annotation_identifier), + optional($._reference), + $.type, + )), )), - optional(seq(':', repeat1(seq( - optional($.annotation_identifier), - optional($._reference), - $.type, - )))), choice(seq('=', choice(prec(2, choice($.block, $.array)), seq($._super_expression, ';'))), ';'), ), + // datatype or typeclass definition type_definition: $ => seq( optional($.definition_info), - repeat($.annotation_info), + repeat($.annotation_info), // for datatypes only optional('^'), - field('name', $.simple_type_identifier), - optional(seq(repeat($.argument_type_identifier), '=', $.variant_type)), - choice(seq('{', repeat($.function_definition), '}'), ';') - ), - - typeclass_definition: $ => seq( - optional($.definition_info), - // no argumenmts => no annotation info - field('name', $.typeclass_identifier), - optional(seq(':', repeat1($.typeclass_identifier))), - choice(seq('{', repeat($.function_definition), '}'), ';'), + field('name', choice($.simple_type_identifier, $.typeclass_identifier)), + optional(seq('[', repeat($.typeclass_identifier), ']')), // parametric typeclasses ?? + repeat($.argument_type_identifier), // for datatypes only + optional(seq('=', $.variant_type)), // for datatypes only + ';', ), // --- flow control @@ -130,7 +125,7 @@ module.exports = grammar({ // --- continers - block: $ => seq('{', repeat(choice(seq($._super_expression, ';'), $.empty_lines)), '}'), + block: $ => seq('{', repeat(choice(seq($._super_expression, ';'), $.extra, $.empty_lines)), '}'), array: $ => seq('[[', repeat1($._scoped_expression), ']]'), @@ -139,7 +134,7 @@ module.exports = grammar({ return: $ => seq(choice('return', 'bring'), $._expression), name_definition: $ => seq( - $._var_let, + choice(choice('%', 'let'), choice('$', 'var')), choice($.simple_name_identifier, $.placeholder), ), @@ -151,7 +146,7 @@ module.exports = grammar({ reference_expression: $ => prec(-1, seq($._reference, $._scoped_expression)), - suffix_expression: $ => seq($._scoped_expression, $._optional_result), + suffix_expression: $ => seq($._scoped_expression, $._optional_or_result), // --- other @@ -234,7 +229,7 @@ module.exports = grammar({ type: $ => seq( optional('^'), field('name', $._type_identifier), - optional($._optional_result), + optional($._optional_or_result), optional(seq('[', repeat1($.type), ']')) ), @@ -245,7 +240,8 @@ module.exports = grammar({ info: $ => /[^\n]*/, - empty_lines: $ => /\n\n+/, + extra: $ => choice($._exec_comment, $._line_comment, $._block_comment), + empty_lines: $ => prec.left(repeat1('\n')), _exec_comment: $ => token(seq('#!', /[^\n]*/)), _line_comment: $ => token(seq('//', /[^\n]*/)), @@ -254,11 +250,7 @@ module.exports = grammar({ // --- tokens _do: $ => choice('=>', 'do'), - _var_let: $ => choice(choice('%', 'let'), choice('$', 'var')), - _optional_result: $ => choice('?', '!'), - //_reference: $ => choice(choice('->', 'out'), choice('<-', 'in'), choice('<>', 'ref'), choice('|->', 'or_out'), choice('<-|', 'or_in')), - - // _reference: $ => seq(optional(choice('->', 'out')), optional(choice('<>', 'ref')), optional(choice('--', 'const')), optional(choice('<-', 'in'))), + _optional_or_result: $ => choice('?', '!'), _reference: $ => choice(choice('<-', '<>', '--', '->', '<-|<>', '<-|--', '<>|->', '--|->', '<>|--', '<-|->',