Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.14 KB | None | 0 0
  1. %{
  2.   open Ast
  3. %}
  4.  
  5. %token <int>    INT
  6. %token <bool>   BOOL
  7. %token <float>  FLOAT
  8. %token <string> VAR
  9. %token <string> OPER
  10. %token LET EQ IN
  11. %token IF THEN ELSE
  12. %token LPAREN RPAREN
  13. %token LBRACKET RBRACKET
  14. %token PIPE
  15. %token SEMI COMMA
  16. %token EOF
  17.  
  18. %start <Ast.ast list> main
  19.  
  20. %%
  21.  
  22. main:
  23.   | expr; SEMI; SEMI; main { $1 :: $4 }
  24.   | expr; EOF              { [$1] }
  25.   | EOF                    { [] }
  26.   ;
  27.  
  28. expr:
  29.   | INT
  30.     { Int $1 }
  31.   | FLOAT
  32.     { Float $1 }
  33.   | BOOL
  34.     { Bool $1 }
  35.   | call
  36.     { $1 }
  37.   | v = VAR
  38.     { Var v }
  39.   | LPAREN; expr; RPAREN
  40.     { $2 }
  41.   | LBRACKET; l = list_fields; RBRACKET
  42.     { List l }
  43.   | LPAREN; t = tuple_fields; RPAREN
  44.     { Tuple t }
  45.   | IF; c = expr; THEN; t = expr; ELSE; e = expr
  46.     { If (c, t, e) }
  47.   | LET; b = bindings; IN; e = expr
  48.     { Let (b, e) }
  49.   ;
  50.  
  51. call:
  52.   | call; expr { Call ($1, $2) }
  53.   | expr; expr { Call ($1, $2) }
  54.   ;
  55.  
  56. list_fields:
  57.   l = separated_list (SEMI, expr) { l }
  58.   ;
  59.  
  60. tuple_fields:
  61.   t = separated_list (COMMA, expr) { t }
  62.   ;
  63.  
  64. bindings:
  65.   b = separated_list (PIPE, binding) { b }
  66.   ;
  67.  
  68. binding:
  69.   v = VAR; EQ; e = expr { (v, e) }
  70.   ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement