Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.41 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 BEGIN END
  13. %token LBRACKET RBRACKET
  14. %token PIPE
  15. %token SEMISEMI SEMI COMMA
  16. %token EOF
  17.  
  18. %start <Ast.ast list> main
  19.  
  20. %%
  21.  
  22. main:
  23.   | expr SEMISEMI main { $1 :: $3 }
  24.   | expr EOF           { [$1] }
  25.   | EOF                { [] }
  26.   ;
  27.  
  28. simple_expr:
  29.   | INT
  30.     { Int $1 }
  31.   | FLOAT
  32.     { Float $1 }
  33.   | BOOL
  34.     { Bool $1 }
  35.   | VAR
  36.     { Var $1 }
  37.   | LPAREN expr RPAREN
  38.     { $2 }
  39.   | BEGIN expr END
  40.     { $2 }
  41.   | LBRACKET separated_list(SEMI, avg_expr) RBRACKET
  42.     { List $2 }
  43.   ;
  44.  
  45. avg_expr:
  46.   | simple_expr { $1 }
  47.   | call        { $1 }
  48.   ;
  49.  
  50. expr:
  51.   | avg_expr
  52.     { $1 }
  53.   | IF c = avg_expr THEN t = expr ELSE e = expr
  54.     { If (c, t, e) }
  55.   | LET b = bindings IN e = expr
  56.     { Let (b, e) }
  57.   | LET PIPE b = bindings IN e = expr
  58.     { Let (b, e) }
  59.   | tuple
  60.     { Tuple $1 }
  61.   ;
  62.  
  63. tuple:
  64.   rev_tuple { List.rev $1 };
  65.  
  66. rev_tuple:
  67.   | rev_tuple COMMA avg_expr
  68.     { $3 :: $1 }
  69.   | avg_expr COMMA avg_expr
  70.     { [$3; $1] }
  71.   ;
  72.  
  73. call:
  74.   | avg_expr simple_expr
  75.     { Call ($1, $2) }
  76.   | e = avg_expr; o = OPER; f = avg_expr
  77.     { Call (Call (Var ("(" ^ o ^ ")"), e), f) };
  78.   ;
  79.  
  80. bindings:
  81.   b = separated_list(PIPE, binding) { b }
  82.   ;
  83.  
  84. binding:
  85.   v = VAR; EQ; e = expr { (v, e) }
  86.   ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement