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 : also this is example of function constraint
@n is position in Fibonacci sequence @n is position in Fibonacci sequence
? 'n >= 0; ? 'n >= 0;
fib @n 'n : Int -> Int = fib 'n : @n Int -> Int =
'n =: 0 | 1 => 1 'n =: 0 | 1 => 1
=: _ => fib ('n - 1) + fib 'n; =: _ => 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 : example of ^ and generics. ^ used to denote that this object allocated on heap
: object allocated by unique reference by default : object allocated by unique reference by default
^TreeNode 'Key 'Value = ^TreeNode 'Key 'Value =
@ -213,6 +209,18 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
$is_less_then : Ord -> Bool; $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 (source_file
@ -315,7 +323,9 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(return (return
(unit_literal))))) (unit_literal)))))
(function_definition (function_definition
(definition_info) (definition_info
(info)
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(argument_name_identifier) (argument_name_identifier)
@ -345,11 +355,14 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(placeholder) (placeholder)
(null_literal)))) (null_literal))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(annotation_info (annotation_info
(annotation_identifier)) (annotation_identifier)
(info))
(annotation_info (annotation_info
(annotation_identifier)) (annotation_identifier)
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(argument_name_identifier) (argument_name_identifier)
@ -360,9 +373,13 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(name_expression (name_expression
(argument_name_identifier)))) (argument_name_identifier))))
(function_definition (function_definition
(definition_info) (definition_info
(info)
(info)
(info))
(annotation_info (annotation_info
(annotation_identifier)) (annotation_identifier)
(info))
(constraint (constraint
(operator_expression (operator_expression
(name_expression (name_expression
@ -599,7 +616,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(simple_name_identifier) (simple_name_identifier)
(number_literal))))) (number_literal)))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(operator) (operator)
(argument_name_identifier) (argument_name_identifier)
(argument_name_identifier) (argument_name_identifier)
@ -660,7 +678,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(type (type
(simple_type_identifier))))) (simple_type_identifier)))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(type (type
@ -725,7 +744,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(operator) (operator)
(bool_literal)))))))) (bool_literal))))))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(type (type
@ -789,16 +809,10 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(simple_name_identifier)) (simple_name_identifier))
(operator) (operator)
(bool_literal)))))))) (bool_literal))))))))
(function_definition
(simple_name_identifier)
(argument_name_identifier)
(type
(simple_type_identifier)
(type
(argument_type_identifier)))
(block))
(type_definition (type_definition
(definition_info) (definition_info
(info)
(info))
(simple_type_identifier) (simple_type_identifier)
(argument_type_identifier) (argument_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) (simple_name_identifier)
(number_literal))))))) (number_literal)))))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_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) (simple_name_identifier)
(argument_name_identifier)))) (argument_name_identifier))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(argument_name_identifier) (argument_name_identifier)
@ -962,7 +978,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(reference_expression (reference_expression
(simple_name_identifier)))))) (simple_name_identifier))))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(argument_name_identifier) (argument_name_identifier)
@ -987,7 +1004,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(reference_expression (reference_expression
(simple_name_identifier)))))) (simple_name_identifier))))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(type (type
(simple_type_identifier)) (simple_type_identifier))
@ -1006,7 +1024,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(name_expression (name_expression
(simple_name_identifier)))) (simple_name_identifier))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(type (type
@ -1018,7 +1037,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(name_expression (name_expression
(simple_name_identifier))))) (simple_name_identifier)))))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_name_identifier)
(argument_name_identifier) (argument_name_identifier)
@ -1036,7 +1056,8 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(annotation_identifier) (annotation_identifier)
(argument_name_identifier))) (argument_name_identifier)))
(function_definition (function_definition
(definition_info) (definition_info
(info))
(simple_name_identifier) (simple_name_identifier)
(argument_name_identifier) (argument_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)
(argument_name_identifier))) (argument_name_identifier)))
(typeclass_definition (typeclass_definition
(definition_info) (definition_info
(info))
(typeclass_identifier) (typeclass_identifier)
(typeclass_identifier) (typeclass_identifier)
(function_definition (function_definition
@ -1060,4 +1082,52 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name
(type (type
(simple_type_identifier)) (simple_type_identifier))
(type (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($.annotation_identifier),
optional($._reference), optional($._reference),
$.argument_name_identifier, $.argument_name_identifier,
optional('?'), optional($._optional_result),
)), )),
optional(seq(':', repeat1(seq( optional(seq(':', repeat1(seq(
optional($.annotation_identifier), optional($.annotation_identifier),
@ -149,7 +149,7 @@ module.exports = grammar({
reference_expression: $ => prec(-1, seq($._reference, $._scoped_expression)), reference_expression: $ => prec(-1, seq($._reference, $._scoped_expression)),
suffix_expression: $ => seq($._scoped_expression, choice('?', '!')), suffix_expression: $ => seq($._scoped_expression, $._optional_result),
// --- other // --- other
@ -232,14 +232,16 @@ module.exports = grammar({
type: $ => seq( type: $ => seq(
optional('^'), optional('^'),
field('name', $._type_identifier), field('name', $._type_identifier),
optional('?'), optional($._optional_result),
optional(seq('[', repeat1($.type), ']')) optional(seq('[', repeat1($.type), ']'))
), ),
// --- comments // --- comments
definition_info: $ => repeat1(seq(': ', /[^\n]*/)), definition_info: $ => repeat1(seq(': ', $.info)),
annotation_info: $ => seq($.annotation_identifier, /[^\n]*/), annotation_info: $ => seq($.annotation_identifier, $.info),
info: $ => /[^\n]*/,
_exec_comment: $ => token(seq('#!', /[^\n]*/)), _exec_comment: $ => token(seq('#!', /[^\n]*/)),
_line_comment: $ => token(seq('//', /[^\n]*/)), _line_comment: $ => token(seq('//', /[^\n]*/)),
@ -249,6 +251,7 @@ module.exports = grammar({
_do: $ => choice('=>', 'do'), _do: $ => choice('=>', 'do'),
_var_let: $ => choice(choice('%', 'let'), choice('$', 'var')), _var_let: $ => choice(choice('%', 'let'), choice('$', 'var')),
_optional_result: $ => choice('?', '!'),
_reference: $ => choice(choice('->', 'out'), choice('<-', 'in'), choice('<>', 'ref')), _reference: $ => choice(choice('->', 'out'), choice('<-', 'in'), choice('<>', 'ref')),
_name_identifier: $ => choice($.argument_name_identifier, $.simple_name_identifier), _name_identifier: $ => choice($.argument_name_identifier, $.simple_name_identifier),