simple_exp:
| "(" exp ")" -> $2
| "{" exp "}" -> $2
| "(" ")" -> Unit
| BOOL -> Bool($1)
| int -> Int($1)
| int "." int -> Float($1, $3)
| "!" IDENT -> Var($2, true)
| IDENT -> Var($1,false)
| STRING -> String($1)
exp:
| ";" -> Unit
| simple_exp -> $1
| "!" exp -> Not($2)
| "-" exp -> Neg($2)
| exp "&" exp -> And($1,$3)
| exp "|" exp -> Or($1,$3)
| exp "+" exp -> Add($1,$3)
| exp "-" exp -> Sub($1,$3)
| exp "*" exp -> Mul($1,$3)
| exp "/" exp -> Div($1, $3)
| exp "=" exp -> Eq($1, $3)
| exp "<" ">" exp -> Not(Eq($1, $3))
| exp "<" exp -> Not(LE($3, $1))
| exp ">" exp -> Not(LE($1, $3))
| exp "<" "=" exp -> LE($1, $3)
| exp ">" "=" exp -> LE($3, $1)
| exp "?" exp -> If($1, $3, Unit)
| exp "?" exp ":" exp -> If($1, $3, $5)
| exp "?" "*" exp -> While(Unit, $1, $4, Unit)
| "(" exp ";" exp ";" exp ")" "?" "*" exp -> While($2, $4, $10, $6)
| "import" STRING -> Import($2)
| "fun" IDENT actual_args "=" "{" exp "}" -> LetRec($2, $3, $6)
| simple_exp actual_args -> App("", $1, $2)
| IDENT "." simple_exp actual_args -> App($1, $3, $4)
| elems -> Tuple($1)
| IDENT "=" exp -> Let($1, false, $3, Unit)
| IDENT ":" "=" exp -> Let($1, true, $4, Unit)
| IDENT "=" exp ";" exp -> Let($1, false, $3, $5)
| IDENT ":" "=" exp ";" exp -> Let($1, true, $4, $6)
| "[" elems "]" -> Array($2)
| IDENT "[" exp "]" "=" exp -> Put($1,$3,$6,false)
| IDENT "[" exp "+" "]" "=" exp -> Put($1,$3,$7,true)
| IDENT "[" exp "]" -> Get($1,$3)
| IDENT "/" exp -> Remove($1,$3, false, false)
| IDENT "/" exp BOOL -> Remove($1,$3, false, $4)
| IDENT "-" exp -> Remove($1,$3, true, false)
| IDENT "-" exp BOOL -> Remove($1,$3, true, $4)
| "|" IDENT "|" -> Length($2)
| "class" IDENT "{" exp "}" -> Class($2, $4)
| "\0" -> Unit
| "match" exp "with" expMatch -> Match($2, $4)
| exp ";" -> $1
| exp ";" exp -> Stmts($1, $3)
expMatchOne:
| ":" exp "->" exp -> MatchLine($2, $4)
expMatch:
| expMatch expMatchOne -> $1 @ [$2]
| expMatchOne -> [$1]
actual_args:
| actual_args simple_exp -> $1 @ [$2]
| simple_exp -> [$1]
elems:
| elems "," exp -> $1 @ [$3]
| exp "," exp -> [$1; $3]