From 2e0dfdf3faf62f97f9440f164cb957a3d184a8bd Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Wed, 19 Jul 2023 10:25:24 +0300 Subject: [PATCH] operator definitions --- corpus/test.langexp | 13 +++++++++++++ grammar.g4 | 2 +- grammar.js | 4 +--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/corpus/test.langexp b/corpus/test.langexp index 02fe5dd..4090f83 100644 --- a/corpus/test.langexp +++ b/corpus/test.langexp @@ -106,6 +106,8 @@ func_2 = { print t.0; } +( - ) 'a 'b = 'a + neg 'b; + test.something = { do_something a b c; } @@ -588,6 +590,17 @@ arg_deduction_example 'name 'duration : <- String <- Float -> Task = Task 'name (tuple_access (simple_name_identifier) (number_literal))))) + (function_definition + (operator) + (argument_name_identifier) + (argument_name_identifier) + (operator_expression + (name_expression + (argument_name_identifier)) + (operator) + (name_expression + (simple_name_identifier) + (argument_name_identifier)))) (function_definition (simple_name_identifier) (block diff --git a/grammar.g4 b/grammar.g4 index 7e34246..588f6b0 100644 --- a/grammar.g4 +++ b/grammar.g4 @@ -23,7 +23,7 @@ type_definition: (DEFINITION_INFO)? (ANNOTATION_INFO)* ('^')? ; function_definition: (definietion_info)? (ANNOTATION_INFO)* (constraint ';')* - (('%' | 'let') | ('$' | 'var'))? SIMPLE_NAME_IDENTIFIER + (('%' | 'let') | ('$' | 'var'))? (SIMPLE_NAME_IDENTIFIER | ('(' OPERATOR ')')) ((ANNOTATION_IDENTIFIER)? ARGUMENT_NAME_IDENTIFIER ('?')?)* (':' ((ANNOTATION_IDENTIFIER)? ('->' | 'in') | ('<-' | 'out') | ('<>' | 'ref'))? type)+)? (('=' ( /*prec 2*/ block | (super_expression ';'))) | ';') diff --git a/grammar.js b/grammar.js index d753731..c81c5c1 100644 --- a/grammar.js +++ b/grammar.js @@ -53,7 +53,7 @@ module.exports = grammar({ repeat($.annotation_info), repeat(seq($.constraint, ';')), /*optional(seq(*/optional(choice(choice('%', 'let'), choice('$', 'var')))/*, '.'))*/, - field('name', $.simple_name_identifier), + choice(field('name', $.simple_name_identifier), seq('(', field('name', $.operator), ')')), repeat(seq( optional($.annotation_identifier), $.argument_name_identifier, @@ -248,9 +248,7 @@ module.exports = grammar({ _type_identifier: $ => choice($.argument_type_identifier, $.simple_type_identifier), placeholder: $ => '_', - simple_name_identifier: $ => token(seq(repeat(seq(/[a-z_][a-z0-9_]*/, '.')), /[a-z_][a-z0-9_]*/)), - simple_type_identifier: $ => /([a-z_][a-z0-9_]*\.)*[A-Z][a-zA-Z0-9]*/, typeclass_identifier: $ => /([a-z_][a-z0-9_]*\.)*#[A-Z][a-zA-Z0-9]*/, argument_name_identifier: $ => /'[a-z_][a-z0-9_]*/,