diff --git a/corpus/test.langexp b/corpus/test.langexp index f5ace2a..5146c0e 100644 --- a/corpus/test.langexp +++ b/corpus/test.langexp @@ -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))))) diff --git a/grammar.js b/grammar.js index bcaf09a..4648076 100644 --- a/grammar.js +++ b/grammar.js @@ -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),