|
|
|
@ -39,6 +39,8 @@ extern yy::parser::symbol_type yylex(); |
|
|
|
|
%define api.value.type variant |
|
|
|
|
%define api.token.constructor |
|
|
|
|
|
|
|
|
|
%locations |
|
|
|
|
|
|
|
|
|
%type <std::vector<std::string>> lowercaseParams |
|
|
|
|
%type <std::vector<branch_ptr>> branches |
|
|
|
|
%type <std::vector<constructor_ptr>> constructors |
|
|
|
@ -78,26 +80,26 @@ lowercaseParams |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
aAdd |
|
|
|
|
: aAdd PLUS aMul { $$ = ast_ptr(new ast_binop(PLUS, std::move($1), std::move($3))); } |
|
|
|
|
| aAdd MINUS aMul { $$ = ast_ptr(new ast_binop(MINUS, std::move($1), std::move($3))); } |
|
|
|
|
: aAdd PLUS aMul { $$ = ast_ptr(new ast_binop(PLUS, std::move($1), std::move($3), @$)); } |
|
|
|
|
| aAdd MINUS aMul { $$ = ast_ptr(new ast_binop(MINUS, std::move($1), std::move($3), @$)); } |
|
|
|
|
| aMul { $$ = std::move($1); } |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
aMul |
|
|
|
|
: aMul TIMES app { $$ = ast_ptr(new ast_binop(TIMES, std::move($1), std::move($3))); } |
|
|
|
|
| aMul DIVIDE app { $$ = ast_ptr(new ast_binop(DIVIDE, std::move($1), std::move($3))); } |
|
|
|
|
: aMul TIMES app { $$ = ast_ptr(new ast_binop(TIMES, std::move($1), std::move($3), @$)); } |
|
|
|
|
| aMul DIVIDE app { $$ = ast_ptr(new ast_binop(DIVIDE, std::move($1), std::move($3), @$)); } |
|
|
|
|
| app { $$ = std::move($1); } |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
app |
|
|
|
|
: app appBase { $$ = ast_ptr(new ast_app(std::move($1), std::move($2))); } |
|
|
|
|
: app appBase { $$ = ast_ptr(new ast_app(std::move($1), std::move($2), @$)); } |
|
|
|
|
| appBase { $$ = std::move($1); } |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
appBase |
|
|
|
|
: INT { $$ = ast_ptr(new ast_int($1)); } |
|
|
|
|
| LID { $$ = ast_ptr(new ast_lid(std::move($1))); } |
|
|
|
|
| UID { $$ = ast_ptr(new ast_uid(std::move($1))); } |
|
|
|
|
: INT { $$ = ast_ptr(new ast_int($1, @$)); } |
|
|
|
|
| LID { $$ = ast_ptr(new ast_lid(std::move($1), @$)); } |
|
|
|
|
| UID { $$ = ast_ptr(new ast_uid(std::move($1), @$)); } |
|
|
|
|
| OPAREN aAdd CPAREN { $$ = std::move($2); } |
|
|
|
|
| case { $$ = std::move($1); } |
|
|
|
|
| let { $$ = std::move($1); } |
|
|
|
@ -106,17 +108,17 @@ appBase |
|
|
|
|
|
|
|
|
|
let |
|
|
|
|
: LET OCURLY definitions CCURLY IN OCURLY aAdd CCURLY |
|
|
|
|
{ $$ = ast_ptr(new ast_let(std::move($3), std::move($7))); } |
|
|
|
|
{ $$ = ast_ptr(new ast_let(std::move($3), std::move($7), @$)); } |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
lambda |
|
|
|
|
: BACKSLASH lowercaseParams ARROW OCURLY aAdd CCURLY |
|
|
|
|
{ $$ = ast_ptr(new ast_lambda(std::move($2), std::move($5))); } |
|
|
|
|
{ $$ = ast_ptr(new ast_lambda(std::move($2), std::move($5), @$)); } |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
case |
|
|
|
|
: CASE aAdd OF OCURLY branches CCURLY |
|
|
|
|
{ $$ = ast_ptr(new ast_case(std::move($2), std::move($5))); } |
|
|
|
|
{ $$ = ast_ptr(new ast_case(std::move($2), std::move($5), @$)); } |
|
|
|
|
; |
|
|
|
|
|
|
|
|
|
branches |
|
|
|
|