diff options
| author | 2024-08-25 17:56:34 +0800 | |
|---|---|---|
| committer | 2024-08-25 17:56:34 +0800 | |
| commit | 97b4f889cd2c3a692da98e681016414587ebf204 (patch) | |
| tree | be3285c61a1e2ebb6da01506e8c793bb3afab482 /grammar.bnf | |
| parent | Added array access. (diff) | |
| download | orang-main.tar.gz orang-main.tar.xz orang-main.zip | |
Diffstat (limited to 'grammar.bnf')
| -rw-r--r-- | grammar.bnf | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/grammar.bnf b/grammar.bnf index 3dcb1c6..d798f9d 100644 --- a/grammar.bnf +++ b/grammar.bnf | |||
| @@ -3,10 +3,13 @@ | |||
| 3 | program ::= (statement ';'?)*; | 3 | program ::= (statement ';'?)*; |
| 4 | statement ::= definition; | 4 | statement ::= definition; |
| 5 | definition ::= 'def' def-spec '=' expression | 5 | definition ::= 'def' def-spec '=' expression |
| 6 | | 'def' '_' '=' expression; | 6 | | 'def' '_' '=' expression |
| 7 | ; | ||
| 8 | |||
| 7 | def-spec ::= IDENTIFIER arg-spec*; | 9 | def-spec ::= IDENTIFIER arg-spec*; |
| 8 | arg-spec ::= '(' arg-spec ')' | IDENTIFIER | arg-spec-tuple | '_'; | 10 | arg-spec ::= '(' arg-spec ')' | IDENTIFIER | arg-spec-tuple | '_'; |
| 9 | arg-spec-tuple ::= '(' ')' | '(' arg-spec ',' arg-spec (',' arg-spec)* ','? ')'; | 11 | arg-spec-tuple ::= '(' ')' | '(' arg-spec ',' arg-spec (',' arg-spec)* ','? ')'; |
| 12 | |||
| 10 | expression ::= binary-expression | unary-expression; | 13 | expression ::= binary-expression | unary-expression; |
| 11 | unary-expression ::= unop+ simple-expression; | 14 | unary-expression ::= unop+ simple-expression; |
| 12 | binary-expression ::= call-expression (binop call-expression)*; | 15 | binary-expression ::= call-expression (binop call-expression)*; |
| @@ -21,23 +24,27 @@ simple-expression ::= '(' expression ')' | |||
| 21 | | IDENTIFIER | 24 | | IDENTIFIER |
| 22 | | STRING | 25 | | STRING |
| 23 | | array | 26 | | array |
| 27 | | map | ||
| 24 | | tuple | 28 | | tuple |
| 29 | | do-expression | ||
| 30 | | fn-expression | ||
| 25 | | if-else-expression | 31 | | if-else-expression |
| 26 | | let-in-expression | 32 | | let-in-expression |
| 27 | | fn-expression | 33 | ; |
| 28 | | do-expression; | ||
| 29 | 34 | ||
| 30 | array ::= '[' ']' | '[' expression (',' expression)* ','? ']'; | 35 | array ::= '[' ']' | '[' expression (',' expression)* ','? ']'; |
| 36 | map ::= '{' '}' | '{' expression '->' expression (',' expression '->' expression) ','? '}'; | ||
| 31 | // Note that tuples always have either zero or at least two elements | 37 | // Note that tuples always have either zero or at least two elements |
| 32 | // A tuple with only one element is just '(' expression ')' -- a parenthese-wrapped expression | 38 | // A tuple with only one element is just '(' expression ')' -- a parenthese-wrapped expression |
| 33 | // Also '(' expression ',' ')' is illegal | 39 | // Also '(' expression ',' ')' is illegal |
| 34 | tuple ::= '(' ')' | '(' expression ',' expression (',' expression)* ','? ')'; | 40 | tuple ::= '(' ')' | '(' expression ',' expression (',' expression)* ','? ')'; |
| 35 | 41 | ||
| 42 | do-expression ::= 'do' expression (';' expression)* 'end'; | ||
| 43 | fn-expression ::= 'fn' arg-spec+ '->' expression | ||
| 44 | | 'fn' arg-spec+ do-expression | ||
| 45 | ; | ||
| 36 | if-else-expression ::= 'if' expression 'then' expression 'else' expression; | 46 | if-else-expression ::= 'if' expression 'then' expression 'else' expression; |
| 37 | let-in-expression ::= 'let' def-spec '=' expression ('and' def-spec '=' expression)* 'in' expression; | 47 | let-in-expression ::= 'let' def-spec '=' expression ('and' def-spec '=' expression)* 'in' expression; |
| 38 | fn-expression ::= 'fn' arg-spec+ '->' expression | ||
| 39 | | 'fn' arg-spec+ do-expression; | ||
| 40 | do-expression ::= 'do' expression (';' expression)* 'end'; | ||
| 41 | 48 | ||
| 42 | repl-program ::= (repl-statement ';'?)* '\n'; // currently, hard-limited by the newline :sweat_smile: | 49 | repl-program ::= (repl-statement ';'?)* '\n'; // currently, hard-limited by the newline :sweat_smile: |
| 43 | repl-statement ::= statement | expression; | 50 | repl-statement ::= statement | expression; |