Parsodus/examples/calc/calcParser.pds

56 lines
2.0 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]
| <toplevel_functiondef> "SEMICOLON" [toplevel]
| <toplevel_assign> "SEMICOLON" [toplevel]
| <toplevel_error> "SEMICOLON" [toplevel]
;
<toplevel_expr> ::= <expr> [toplevel];
<toplevel_functiondef> ::= <functiondef> [toplevel];
<toplevel_assign> ::= <assign> [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];