Parsodus/examples/calc/calcParser.pds

68 lines
2.0 KiB
Plaintext

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];