fixes for easier parsing, result modifier added

This commit is contained in:
ProgramSnail 2023-07-24 13:02:21 +03:00
parent b26c0544bf
commit 18d84f5f28
2 changed files with 110 additions and 37 deletions

View file

@ -51,7 +51,7 @@ sum 'a 'b = 'a + 'b;
: also this is example of function constraint
@n is position in Fibonacci sequence
? 'n >= 0;
fib @n 'n : Int -> Int =
fib 'n : @n Int -> Int =
'n =: 0 | 1 => 1
=: _ => fib ('n - 1) + fib 'n;
@ -149,10 +149,6 @@ bubble_sort 'arr : ref Array['A] = {
};
}
merge_sort 'arr : <> Array['A] = {
}
: example of ^ and generics. ^ used to denote that this object allocated on heap
: object allocated by unique reference by default
^TreeNode 'Key 'Value =
@ -213,6 +209,18 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
$is_less_then : Ord -> Bool;
}
: function, that takes result argument
result_example 'a! = 'a =: _? => print "value inside"
=: _ => print "error inside";
: function, that returns result
parse_number : Unit! = {
%number_str := String.scan;
%number! := Int.parse number_str;
number.print;
bring ();
}
--------------------------------------------------------------------------------
(source_file
@ -315,7 +323,9 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(return
(unit_literal)))))
(function_definition
(definition_info)
(definition_info
(info)
(info))
(simple_name_identifier)
(argument_name_identifier)
(argument_name_identifier)
@ -345,11 +355,14 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(placeholder)
(null_literal))))
(function_definition
(definition_info)
(definition_info
(info))
(annotation_info
(annotation_identifier))
(annotation_identifier)
(info))
(annotation_info
(annotation_identifier))
(annotation_identifier)
(info))
(simple_name_identifier)
(argument_name_identifier)
(argument_name_identifier)
@ -360,9 +373,13 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(name_expression
(argument_name_identifier))))
(function_definition
(definition_info)
(definition_info
(info)
(info)
(info))
(annotation_info
(annotation_identifier))
(annotation_identifier)
(info))
(constraint
(operator_expression
(name_expression
@ -599,7 +616,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(simple_name_identifier)
(number_literal)))))
(function_definition
(definition_info)
(definition_info
(info))
(operator)
(argument_name_identifier)
(argument_name_identifier)
@ -660,7 +678,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(type
(simple_type_identifier)))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(type
@ -725,7 +744,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(operator)
(bool_literal))))))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(type
@ -789,16 +809,10 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(simple_name_identifier))
(operator)
(bool_literal))))))))
(function_definition
(simple_name_identifier)
(argument_name_identifier)
(type
(simple_type_identifier)
(type
(argument_type_identifier)))
(block))
(type_definition
(definition_info)
(definition_info
(info)
(info))
(simple_type_identifier)
(argument_type_identifier)
(argument_type_identifier)
@ -921,7 +935,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(simple_name_identifier)
(number_literal)))))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(argument_name_identifier)
@ -933,7 +948,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(simple_name_identifier)
(argument_name_identifier))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(argument_name_identifier)
@ -962,7 +978,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(reference_expression
(simple_name_identifier))))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(argument_name_identifier)
@ -987,7 +1004,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(reference_expression
(simple_name_identifier))))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(type
(simple_type_identifier))
@ -1006,7 +1024,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(name_expression
(simple_name_identifier))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(type
@ -1018,7 +1037,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(name_expression
(simple_name_identifier)))))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(argument_name_identifier)
@ -1036,7 +1056,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(annotation_identifier)
(argument_name_identifier)))
(function_definition
(definition_info)
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(argument_name_identifier)
@ -1052,7 +1073,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(argument_name_identifier)
(argument_name_identifier)))
(typeclass_definition
(definition_info)
(definition_info
(info))
(typeclass_identifier)
(typeclass_identifier)
(function_definition
@ -1060,4 +1082,52 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(type
(simple_type_identifier))
(type
(simple_type_identifier)))))
(simple_type_identifier))))
(function_definition
(definition_info
(info))
(simple_name_identifier)
(argument_name_identifier)
(match
(name_expression
(argument_name_identifier))
(case
(suffix_expression
(placeholder))
(name_expression
(simple_name_identifier)
(string_literal)))
(case
(placeholder)
(name_expression
(simple_name_identifier)
(string_literal)))))
(function_definition
(definition_info
(info))
(simple_name_identifier)
(type
(simple_type_identifier))
(block
(match
(name_definition
(simple_name_identifier))
(case
(name_expression
(type
(simple_type_identifier))
(simple_name_identifier))))
(match
(suffix_expression
(name_definition
(simple_name_identifier)))
(case
(name_expression
(type
(simple_type_identifier))
(simple_name_identifier)
(simple_name_identifier))))
(name_expression
(simple_name_identifier))
(return
(unit_literal)))))

View file

@ -59,7 +59,7 @@ module.exports = grammar({
optional($.annotation_identifier),
optional($._reference),
$.argument_name_identifier,
optional('?'),
optional($._optional_result),
)),
optional(seq(':', repeat1(seq(
optional($.annotation_identifier),
@ -149,7 +149,7 @@ module.exports = grammar({
reference_expression: $ => prec(-1, seq($._reference, $._scoped_expression)),
suffix_expression: $ => seq($._scoped_expression, choice('?', '!')),
suffix_expression: $ => seq($._scoped_expression, $._optional_result),
// --- other
@ -232,14 +232,16 @@ module.exports = grammar({
type: $ => seq(
optional('^'),
field('name', $._type_identifier),
optional('?'),
optional($._optional_result),
optional(seq('[', repeat1($.type), ']'))
),
// --- comments
definition_info: $ => repeat1(seq(': ', /[^\n]*/)),
annotation_info: $ => seq($.annotation_identifier, /[^\n]*/),
definition_info: $ => repeat1(seq(': ', $.info)),
annotation_info: $ => seq($.annotation_identifier, $.info),
info: $ => /[^\n]*/,
_exec_comment: $ => token(seq('#!', /[^\n]*/)),
_line_comment: $ => token(seq('//', /[^\n]*/)),
@ -249,6 +251,7 @@ module.exports = grammar({
_do: $ => choice('=>', 'do'),
_var_let: $ => choice(choice('%', 'let'), choice('$', 'var')),
_optional_result: $ => choice('?', '!'),
_reference: $ => choice(choice('->', 'out'), choice('<-', 'in'), choice('<>', 'ref')),
_name_identifier: $ => choice($.argument_name_identifier, $.simple_name_identifier),