2023-07-16 20:54:43 +03:00
|
|
|
grammar lang ;
|
|
|
|
|
|
2023-07-29 12:06:22 +03:00
|
|
|
// not always most recent grammar
|
2023-07-16 20:54:43 +03:00
|
|
|
// not checked
|
|
|
|
|
|
2023-08-12 14:44:05 +03:00
|
|
|
// TODO
|
|
|
|
|
|
2023-07-16 20:54:43 +03:00
|
|
|
source_file: (statement)+ EOF ;
|
|
|
|
|
|
|
|
|
|
statement: import
|
|
|
|
|
| type_definition
|
|
|
|
|
| function_definition
|
|
|
|
|
| typeclass_definition
|
2023-07-31 22:06:30 +03:00
|
|
|
| EXTRA
|
2023-07-16 20:54:43 +03:00
|
|
|
;
|
|
|
|
|
|
|
|
|
|
import: ('::' | 'import') (SIMPLE_NAME_IDENTIFIER | '_') ('=' SIMPLE_NAME_IDENTIFIER)?
|
2023-07-22 19:50:12 +03:00
|
|
|
(':' (SIMPLE_TYPE_IDENTIFIER | SIMPLE_NAME_IDENTIFIER | TYPECLASS_IDENTIFIER | ('(' OPERATOR ')'))+)? ';'
|
2023-07-16 20:54:43 +03:00
|
|
|
;
|
|
|
|
|
|
|
|
|
|
constraint: '?' expression ;
|
|
|
|
|
|
|
|
|
|
function_definition: (definietion_info)? (ANNOTATION_INFO)* (constraint ';')*
|
2023-07-31 22:06:30 +03:00
|
|
|
('.')? (SIMPLE_NAME_IDENTIFIER | ('(' OPERATOR ')')) ('?' | '!')
|
|
|
|
|
(((ANNOTATION_IDENTIFIER)? (REFERENCE)? ARGUMENT_NAME_IDENTIFIER ('?' | '!')?)*)
|
2023-08-12 14:44:05 +03:00
|
|
|
(':' ((ANNOTATION_IDENTIFIER)? (REFERENCE)? scoped_type)+)?
|
2023-07-18 14:37:16 +03:00
|
|
|
(('=' ( /*prec 2*/ block | (super_expression ';'))) | ';')
|
2023-07-16 20:54:43 +03:00
|
|
|
;
|
|
|
|
|
|
2023-07-31 22:06:30 +03:00
|
|
|
type_definition: (DEFINITION_INFO)? (ANNOTATION_INFO)* ('^')?
|
|
|
|
|
(SIMPLE_TYPE_IDENTIFIER | TYPECLASS_IDENTIFIER)
|
|
|
|
|
('[' (TYPECLASS_IDENTIFIER)+ ']')?
|
|
|
|
|
(ARGUMENT_TYPE_IDENTIFIER)*
|
2023-08-12 14:44:05 +03:00
|
|
|
('=' type)?
|
2023-07-31 22:06:30 +03:00
|
|
|
';'
|
|
|
|
|
;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
2023-07-19 11:01:02 +03:00
|
|
|
case: (':=' | '=:') expression (('??' | 'if') expression)? (('=>' | 'do') expression)? ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
|
|
|
|
match: expression (case)+ ;
|
|
|
|
|
|
2023-07-19 11:01:02 +03:00
|
|
|
condition: choice('??' | 'if') expression choice('=>' |'do') expression
|
|
|
|
|
(('!!' | 'elif') expression ('=>' | 'do') expression)*
|
|
|
|
|
(('!!=>' | 'else') _expression)?
|
2023-07-16 20:54:43 +03:00
|
|
|
;
|
|
|
|
|
|
|
|
|
|
loop: ('@' | 'for') (expression | (expression ':' expression))?,
|
2023-07-19 11:01:02 +03:00
|
|
|
('=>' | 'do') expression
|
2023-07-16 20:54:43 +03:00
|
|
|
;
|
|
|
|
|
|
|
|
|
|
comma_expression: /* prec left ?? */ super_expression ',' super_expression ;
|
|
|
|
|
|
|
|
|
|
operator_expression: /* prec left ?? */
|
|
|
|
|
| /* prec 4 */ expression OPERATOR expression
|
|
|
|
|
| /* prec 3 */ expression OPERATOR_TAIL1 expression
|
|
|
|
|
| /* prec 2 */ expression OPERATOR_TAIL2 expression
|
|
|
|
|
| /* prec 1 */ expression OPERATOR_TAIL3 expression
|
|
|
|
|
;
|
|
|
|
|
|
2023-07-31 22:06:30 +03:00
|
|
|
block: '{' ((super_expression ';') | EXTRA)* '}' ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
|
|
|
|
array: '[[' (scoped_expression)+ ']]' ;
|
|
|
|
|
|
|
|
|
|
name_definition: (('%' | 'let') | ('$' | 'var')) (SIMPLE_NAME_IDENTIFIER | PLACEHOLDER) ;
|
|
|
|
|
|
2023-07-18 15:17:02 +03:00
|
|
|
array_access: scoped_expression '[' super_expression ']' ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
2023-07-18 11:03:11 +03:00
|
|
|
tuple_access: scoped_expression, '.' NUMBER_LITERAL
|
|
|
|
|
|
2023-07-29 12:06:22 +03:00
|
|
|
reference_expression: /* prec -1 ?? */ REFERENCE scoped_expression ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
2023-07-17 23:14:39 +03:00
|
|
|
suffix_expression: scoped_expression ('?' | '!')
|
|
|
|
|
|
2023-07-16 20:54:43 +03:00
|
|
|
return: ('return' | 'bring') expression ;
|
|
|
|
|
|
|
|
|
|
loop_control: 'break'
|
|
|
|
|
| 'continue'
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
name_expression:
|
2023-08-12 14:44:05 +03:00
|
|
|
((scoped_type '.' SIMPLE_NAME_IDENTIFIER)
|
2023-07-16 20:54:43 +03:00
|
|
|
| (scoped_expression '.' SIMPLE_NAME_IDENTIFIER)
|
|
|
|
|
| name_identifier
|
|
|
|
|
| ('(' OPERATOR ')'))
|
|
|
|
|
((ANNOTATION_IDENTIFIER)? scoped_expression)*
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
2023-08-12 14:44:05 +03:00
|
|
|
constructor: scoped_type (ANNOTATION_IDENTIFIER)? scoped_expression)+ ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
2023-07-19 11:01:02 +03:00
|
|
|
lambda: '\\' (ARGUMENT_NAME_IDENTIFIER)* '=>' expression ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
|
|
|
|
super_expression: match
|
|
|
|
|
| condition
|
|
|
|
|
| loop
|
|
|
|
|
| comma_expression
|
|
|
|
|
| expression
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expression: name_expression
|
|
|
|
|
| operator_expression
|
|
|
|
|
| return
|
|
|
|
|
| lambda
|
|
|
|
|
| constructor
|
|
|
|
|
| not_name_scoped_expression
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
scoped_expression: name_identifier
|
|
|
|
|
| not_name_scoped_expression
|
|
|
|
|
;
|
|
|
|
|
|
2023-07-18 14:37:16 +03:00
|
|
|
not_name_scoped_expression: block
|
|
|
|
|
| array
|
|
|
|
|
| PLACEHOLDER
|
2023-07-16 20:54:43 +03:00
|
|
|
| name_definition
|
2023-07-18 15:17:02 +03:00
|
|
|
| array_access
|
2023-07-18 11:03:11 +03:00
|
|
|
| tuple_access
|
2023-07-16 20:54:43 +03:00
|
|
|
| loop_control
|
2023-07-19 11:01:02 +03:00
|
|
|
| reference_expression
|
2023-07-18 14:37:16 +03:00
|
|
|
| suffix_expression
|
2023-07-16 20:54:43 +03:00
|
|
|
| literal
|
|
|
|
|
| '(' super_expression ')'
|
|
|
|
|
;
|
|
|
|
|
|
2023-08-12 14:44:05 +03:00
|
|
|
variant_type: ('|')? annotated_type ('|' annotated_type)+ ;
|
|
|
|
|
|
|
|
|
|
tuple_type: ('&')? annotated_type ('&' _annotated_type)+ ;
|
|
|
|
|
|
|
|
|
|
annotated_type: (ANNOTATION_IDENTIFIER)? scoped_type ;
|
|
|
|
|
|
|
|
|
|
array_type: '[[' type ']]' ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
2023-08-12 14:44:05 +03:00
|
|
|
reference_type: /* prec -1 */ '^' scoped_type ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
2023-08-12 14:44:05 +03:00
|
|
|
modified_type: scoped_type ('?' | '!') ;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
2023-08-12 14:44:05 +03:00
|
|
|
simple_type: type_identifier ('[' (scoped_type)+ ']')? ;
|
|
|
|
|
|
|
|
|
|
type: simple_type
|
|
|
|
|
| reference_type
|
|
|
|
|
| modified_type
|
|
|
|
|
| array_type
|
|
|
|
|
| variant_type
|
|
|
|
|
| tuple_type
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
scoped_type: simple_type
|
|
|
|
|
| reference_type
|
|
|
|
|
| modified_type
|
|
|
|
|
| array_type
|
|
|
|
|
| '(' (variant_type | tuple_type) ')'
|
|
|
|
|
;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
|
|
|
|
name_identifier: (ARGUMENT_NAME_IDENTIFIER | SIMPLE_NAME_IDENTIFIER) ;
|
|
|
|
|
type_identifier: (ARGUMENT_TYPE_IDENTIFIER | SIMPLE_TYPE_IDENTIFIER) ;
|
|
|
|
|
|
|
|
|
|
literal: FLOAT_NUMBER_LITERAL
|
|
|
|
|
| NUMBER_LITERAL
|
|
|
|
|
| STRING_LITERAL
|
|
|
|
|
| CHAR_LITERAL
|
|
|
|
|
| BOOL_LITERAL
|
|
|
|
|
| UNIT_LITERAL
|
|
|
|
|
| NULL_LITERAL
|
2023-07-29 12:06:22 +03:00
|
|
|
;
|
2023-07-16 20:54:43 +03:00
|
|
|
|
|
|
|
|
DEFINITION_INFO : : ': ' ([^\n]*)+ ;
|
|
|
|
|
ANNOTATION_INFO : ANNOTATION_IDENTIFIER [^\n]* ;
|
|
|
|
|
|
2023-07-31 22:06:30 +03:00
|
|
|
EXTRA: EMPTY_LINES
|
|
|
|
|
| LINE_COMMENT
|
|
|
|
|
| LINE_COMMENT
|
|
|
|
|
| BLOCK_COMMENT
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
EMPTY_LINES : ('\n')+ ;
|
2023-07-25 19:08:23 +03:00
|
|
|
|
2023-08-12 14:44:05 +03:00
|
|
|
EXEC_COMMENT : '#!' [^\n]* -> skip ;
|
2023-07-16 20:54:43 +03:00
|
|
|
LINE_COMMENT : '//' [^\n]* -> skip ;
|
|
|
|
|
BLOCK_COMMENT : '\*' ([^*] |('\*' [^/]))* '*/' -> skip ;
|
|
|
|
|
|
2023-07-29 12:06:22 +03:00
|
|
|
REFERENCE: ('->' | 'out')
|
|
|
|
|
| ('<-' | 'in')
|
|
|
|
|
| ('<>' | 'ref')
|
|
|
|
|
| ('|->' | 'or_out')
|
|
|
|
|
| ('<-|' | 'or_in')
|
|
|
|
|
;
|
|
|
|
|
|
2023-07-16 20:54:43 +03:00
|
|
|
PLACEHOLDER : '_' ;
|
|
|
|
|
|
|
|
|
|
SIMPLE_NAME_IDENTIFIER : ([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_]* ;
|
|
|
|
|
ARGUMENT_TYPE_IDENTIFIER : '\'' [A-Z][a-zA-Z0-9]* ;
|
|
|
|
|
ANNOTATION_IDENTIFIER : '@' [a-z_][a-z0-9_]* ;
|
|
|
|
|
|
|
|
|
|
OPERATOR : ([+\-*/%^!?|&,<>=]+)|\.+ ;
|
|
|
|
|
OPERATOR_TAIL1 : [+\-*/%^!?|&,<>=]+\. ;
|
|
|
|
|
OPERATOR_TAIL2 : [+\-*/%^!?|&,<>=]+\.\. ;
|
|
|
|
|
OPERATOR_TAIL3 : [+\-*/%^!?|&,<>=]+\.\.\. ;
|
|
|
|
|
|
2023-08-12 15:55:09 +03:00
|
|
|
FLOAT_NUMBER_LITERAL : '-'? [0-9]+ '.' [0-9]+ 'f' ;
|
|
|
|
|
DOUBLE_NUMBER_LITERAL : '-'? [0-9]+ '.' [0-9]+ ;
|
|
|
|
|
INT_LITERAL : '-'? [0-9]+ 'i' ;
|
|
|
|
|
LONG_LITERAL : '-'? [0-9]+ 'l' ;
|
2023-08-12 15:08:53 +03:00
|
|
|
INDEX_LITERAL : [0-9]+ ;
|
|
|
|
|
STRING_LITERAL : '\"' ([^\\\'] | ( '\\' [\u0000-\u00FF]))* '\"' ;
|
|
|
|
|
UNICODE_STRING_LITERAL : '\"' ([^\\\'] | ( '\\' [\u0000-\uFFFF]))* '\"u';
|
|
|
|
|
CHAR_LITERAL : '\'\'' ([^\\\'] | ( '\\' [\u0000-\u00FF])) '\'\'' ;
|
|
|
|
|
UNICODE_LITERAL : '\'\'' ([^\\\'] | ( '\\' [\u0000-\uFFFF])) '\'\'u' ;
|
2023-07-16 20:54:43 +03:00
|
|
|
BOOL_LITERAL : 'true' | 'false' ;
|
|
|
|
|
UNIT_LITERAL : '()' ;
|
|
|
|
|
NULL_LITERAL : 'null' ;
|
|
|
|
|
|
|
|
|
|
// IDENTIFIER: ([@'#]?[a-zA-Z0-9_]+)|([+\-*/%^!?|&,<>=]+\.?\.?\.?)|\.+
|