diff --git a/grammar.txt b/grammar.txt index 962dfe0..7d3afb7 100644 --- a/grammar.txt +++ b/grammar.txt @@ -1,12 +1,12 @@ expression -> | sequence -// | apply + | apply | unary | binary | let | compound | control - | field + | selector | index | identifier | primary @@ -19,22 +19,25 @@ operator -> | "+" | "-" | "*" | "/" | "|>" | "<|" | ">>" | "<<" | "++" ; -pattern -> "_" | record_pattern | variant_pattern | identifier ; +pattern -> "_" | record_pattern | variant_pattern ; record_pattern -> "{" ( identifier ( "=" pattern )? ( "," identifier ( "=" pattern )? )* ) ( "|" identifier ) "}" variant_pattern -> "`" identifier ( "(" ( "_" | compound_pattern | identifier ) ")" )? ; -let -> "let" pattern "=" expression ( "and" pattern "=" expression )* "in" expression ; +parameters -> "(" ( identifier ( "," identifier )* )?")" +let -> "let" ( identifier parameters? | pattern ) "=" expression ( "and" ( identifier parameters? | pattern ) "=" expression )* "in" expression ; control -> | if | when if -> "if" expression "then" expression "else" expression ; -when -> "when" expression "is" ( pattern "=>" expression )+ ; +when -> "when" expression "is" ( ( identifier | pattern ) "=>" expression )+ ; compound -> variant | record | list ; variant -> "`" identifier ( "(" expression ")" )? ; base_record -> expression ( "with" identifier "=" expression ( "," "with" identifier "=" expression )* )? record -> "{" ( identifier ("=" expression)? ( "," identifier ("=" expression)? )* )? ( "|" base_record )* "}" ; list -> "[" ( expression ( "," expression )* )? "]" ; -field -> expression "." identifier ; -index -> expression "[" expression "]" ; identifier -> IDENTIFIER | "@" STRING ; -primary -> NUMBER | STRING | identifier | "(" expression ")" ; +operand -> ( NUMBER | STRING | identifier | "(" expression ")" ) ; +selector -> "." identifier ; +index -> "[" expression "]" ; +arguments -> "(" ( "_" | expression ( "," ( "_" | expression ) )* )? ")" ; +primary -> operand ( selector | index | arguments ) ;