finn-lang/grammar.txt

38 lines
1.2 KiB
Plaintext
Raw Normal View History

2023-06-28 21:52:39 +00:00
expression ->
2023-06-28 23:18:31 +00:00
| sequence
// | apply
2023-06-28 21:52:39 +00:00
| unary
| binary
// | let
2023-06-28 23:18:31 +00:00
| compound
| control
2023-06-28 21:52:39 +00:00
| field
| index
2023-06-29 15:55:45 +00:00
| identifier
2023-06-28 23:18:31 +00:00
| primary
2023-06-28 21:52:39 +00:00
grouping -> "(" expression ")" ;
unary -> ( "-" | "!" ) expression ;
binary -> expression operator expression ;
operator ->
| "==" | "!=" | "<" | "<=" | ">" | ">="
| "+" | "-" | "*" | "/"
// | "|>" | "<|" | ">>" | "<<"
2023-06-28 21:52:39 +00:00
| "++" ;
2023-06-28 23:18:31 +00:00
control ->
| if
2023-06-29 16:10:41 +00:00
| when
2023-06-28 21:52:39 +00:00
if -> "if" expression "then" expression "else" expression ;
2023-06-29 16:10:41 +00:00
variant_pattern -> "`" identifier ( "(" ( ( "_" | identifier ) ( "," ( "_" | identifier )* )? ) ")" )? ;
when -> "when" expression "is" ( variant_pattern "=>" expression )+ ;
2023-06-28 23:18:31 +00:00
compound -> variant | record | list ;
variant -> "`" identifier ( "(" ( expression ( "," expression)* )? ")" )? ;
2023-06-29 15:55:45 +00:00
base_record -> expression ( "with" identifier "=" expression ( "," "with" identifier "=" expression )* )?
2023-06-28 21:52:39 +00:00
record ->
2023-06-29 15:55:45 +00:00
"{" ( identifier ("=" expression)? ( "," identifier ("=" expression)? )* )? ( "|" base_record )* "}" ;
2023-06-28 21:52:39 +00:00
list -> "[" ( expression ( "," expression )* )? "]" ;
field -> expression "." identifier ;
index -> expression "[" expression "]" ;
2023-06-29 15:55:45 +00:00
identifier -> IDENTIFIER | "@" STRING ;
primary -> NUMBER | STRING | identifier | "(" expression ")" ;