parser: LALR(1) terminals: "NUM" "COMMA" "FN" "LPAREN" "RPAREN" "SEMICOLON" "ARROW" "IDENT" "PLUS" "MINUS" "TIMES" "DIVIDE" "EXPONENT" "ASSIGN" 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] | <error> "SEMICOLON" [toplevel] ; <toplevel_expr> ::= <expr> [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];