54 lines
1.9 KiB
Plaintext
54 lines
1.9 KiB
Plaintext
parser: LALR(1)
|
|
lexesis: calcLexer.lxs
|
|
precedence:
|
|
right "EXPONENT"
|
|
left "TIMES" "DIVIDE"
|
|
left "PLUS" "MINUS"
|
|
|
|
start: <start>
|
|
grammar:
|
|
<start> ::= <toplevel> <start> [toplevel]
|
|
| [toplevel]
|
|
;
|
|
|
|
<toplevel> ::= <toplevel_expr> "SEMICOLON" [toplevel]
|
|
| <functiondef> "SEMICOLON" [toplevel]
|
|
| <assign> "SEMICOLON" [toplevel]
|
|
| <toplevel_error> "SEMICOLON" [toplevel]
|
|
;
|
|
|
|
<toplevel_expr> ::= <expr> [toplevel];
|
|
<toplevel_error> ::= <error> [toplevel];
|
|
|
|
<expr> ::= <expr> "PLUS" <expr> [binop]
|
|
| <expr> "MINUS" <expr> [binop]
|
|
| <expr> "TIMES" <expr> [binop]
|
|
| <expr> "DIVIDE" <expr> [binop]
|
|
| <expr> "EXPONENT" <expr> [binop]
|
|
| "IDENT" [expr_simple]
|
|
| "NUM" [expr_simple]
|
|
| "MINUS" <expr> [umin, right 1]
|
|
| "LPAREN" <expr> "RPAREN" [parenthesized]
|
|
| "IDENT" "LPAREN" <opt_arguments> "RPAREN" [functioncall]
|
|
;
|
|
|
|
<opt_arguments> ::= <arguments> [opt_arguments]
|
|
| [opt_arguments]
|
|
;
|
|
|
|
<arguments> ::= <expr> [arguments]
|
|
| <arguments> "COMMA" <expr> [arguments]
|
|
;
|
|
|
|
<functiondef> ::= "FN" "IDENT" "LPAREN" <opt_idents> "RPAREN" "ARROW" <expr> [functiondef];
|
|
|
|
<opt_idents> ::= <idents> [opt_idents]
|
|
| [opt_idents]
|
|
;
|
|
|
|
<idents> ::= "IDENT" [idents]
|
|
| <idents> "COMMA" "IDENT" [idents]
|
|
;
|
|
|
|
<assign> ::= "IDENT" "ASSIGN" <expr> [assign];
|