improvements for proper printing, etc.

This commit is contained in:
ProgramSnail 2023-07-31 22:06:30 +03:00
parent b71b732797
commit 8e0cea277e
4 changed files with 231 additions and 119 deletions

View file

@ -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))

View file

@ -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))

View file

@ -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 ;

View file

@ -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('<-', '<>', '--', '->',
'<-|<>', '<-|--', '<>|->', '--|->', '<>|--', '<-|->',