Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- open Ast
- %}
- %token <int> INT
- %token <bool> BOOL
- %token <float> FLOAT
- %token <string> VAR
- %token <string> OPER
- %token LET EQ IN
- %token IF THEN ELSE
- %token LPAREN RPAREN BEGIN END
- %token LBRACKET RBRACKET
- %token PIPE
- %token SEMISEMI SEMI COMMA
- %token EOF
- %start <Ast.ast list> main
- %%
- main:
- | expr SEMISEMI main { $1 :: $3 }
- | expr EOF { [$1] }
- | EOF { [] }
- ;
- simple_expr:
- | INT
- { Int $1 }
- | FLOAT
- { Float $1 }
- | BOOL
- { Bool $1 }
- | VAR
- { Var $1 }
- | LPAREN expr RPAREN
- { $2 }
- | BEGIN expr END
- { $2 }
- | LBRACKET separated_list(SEMI, avg_expr) RBRACKET
- { List $2 }
- ;
- avg_expr:
- | simple_expr { $1 }
- | call { $1 }
- ;
- expr:
- | avg_expr
- { $1 }
- | IF c = avg_expr THEN t = expr ELSE e = expr
- { If (c, t, e) }
- | LET b = bindings IN e = expr
- { Let (b, e) }
- | LET PIPE b = bindings IN e = expr
- { Let (b, e) }
- | tuple
- { Tuple $1 }
- ;
- tuple:
- rev_tuple { List.rev $1 };
- rev_tuple:
- | rev_tuple COMMA avg_expr
- { $3 :: $1 }
- | avg_expr COMMA avg_expr
- { [$3; $1] }
- ;
- call:
- | avg_expr simple_expr
- { Call ($1, $2) }
- | e = avg_expr; o = OPER; f = avg_expr
- { Call (Call (Var ("(" ^ o ^ ")"), e), f) };
- ;
- bindings:
- b = separated_list(PIPE, binding) { b }
- ;
- binding:
- v = VAR; EQ; e = expr { (v, e) }
- ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement