Advertisement
Hinski2

Untitled

Jun 3rd, 2024
13
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. %{
  2. open Ast
  3.  
  4. let rec make_funs ps e =
  5. match ps with
  6. | p :: ys -> Fun(p, make_funs ys e)
  7. | [] -> e
  8. %}
  9.  
  10. %token <int> INT
  11. %token <string> IDENT CNAME
  12. %token TIMES DIV PLUS MINUS
  13. %token LPAREN RPAREN
  14. %token FUN ARR BAR
  15. %token AND OR EQ LT GT LEQ GEQ NEQ COMMA
  16. %token TRUE FALSE IF THEN ELSE LET IN AS
  17. %token TRY WITH RAISE MATCH END UNDERSCORE
  18. %token FST SND
  19. %token EOF
  20.  
  21. %start <Ast.expr> prog
  22.  
  23. %left COMMA
  24. %nonassoc AND OR
  25. %nonassoc EQ NEQ LT GT LEQ GEQ
  26. %left PLUS MINUS
  27. %left TIMES DIV
  28.  
  29. %%
  30.  
  31. prog:
  32. | e = mixfix; EOF { e }
  33. ;
  34.  
  35. patterns:
  36. | p = pattern; ps = patterns { p :: ps }
  37. | p = pattern { [p] }
  38.  
  39. mixfix:
  40. | IF; e1 = mixfix; THEN; e2 = mixfix; ELSE; e3 = mixfix { If(e1, e2, e3) }
  41. | LET; x = pattern; EQ; e1 = mixfix; IN; e2 = mixfix { Let(x, e1, e2) }
  42. | FUN; ps = patterns; ARR; e = mixfix { make_funs ps e }
  43. | TRY; e1 = mixfix; WITH; e2 = mixfix { Try(e1, e2) }
  44. | e = expr { e }
  45. ;
  46.  
  47. expr:
  48. | e1 = expr; PLUS; e2 = expr { Binop(Add, e1, e2) }
  49. | e1 = expr; MINUS; e2 = expr { Binop(Sub, e1, e2) }
  50. | e1 = expr; DIV; e2 = expr { Binop(Div, e1, e2) }
  51. | e1 = expr; TIMES; e2 = expr { Binop(Mult, e1, e2) }
  52. | e1 = expr; EQ; e2 = expr { Binop(Eq, e1, e2) }
  53. | e1 = expr; LT; e2 = expr { Binop(Lt, e1, e2) }
  54. | e1 = expr; GT; e2 = expr { Binop(Gt, e1, e2) }
  55. | e1 = expr; LEQ; e2 = expr { Binop(Leq, e1, e2) }
  56. | e1 = expr; GEQ; e2 = expr { Binop(Geq, e1, e2) }
  57. | e1 = expr; NEQ; e2 = expr { Binop(Neq, e1, e2) }
  58. | e1 = expr; AND; e2 = expr { Binop(And, e1, e2) }
  59. | e1 = expr; OR; e2 = expr { Binop(Or, e1, e2) }
  60. | e1 = expr; COMMA; e2 = expr { Pair(e1, e2) }
  61. | e = app { e }
  62. ;
  63.  
  64. app:
  65. | e1 = app; e2 = app_base { App(e1, e2) }
  66. | FST; e = app_base { Fst e }
  67. | SND; e = app_base { Snd e }
  68. | RAISE { Raise }
  69. | c = CNAME; e = app_bases { Ctor(c, e) } (* zmiana z app_base *)
  70. | e = app_base { e }
  71. ;
  72.  
  73. app_bases: (* dodanie *)
  74. | ap = app_base; COMMA; aps = app_bases { ap :: aps }
  75. | ap = app_base { [ap] }
  76.  
  77. app_base:
  78. | i = INT { Int i }
  79. | x = IDENT { Var x }
  80. | LPAREN; RPAREN { Unit }
  81. | LPAREN; e = mixfix; RPAREN { e }
  82. | TRUE { Bool true }
  83. | FALSE { Bool false }
  84. | MATCH; e = mixfix; WITH; option(BAR); cs=separated_list(BAR,clause); END
  85. { Match(e, cs) }
  86. ;
  87.  
  88. clause:
  89. | p=pattern; ARR; e=mixfix { (p, e) }
  90. ;
  91.  
  92. pattern:
  93. | p1=pattern; COMMA; p2=pattern { PPair(p1, p2) }
  94. | p=pattern_app; AS; x=IDENT { PAs(p, x) }
  95. | p=pattern_app { p }
  96. ;
  97.  
  98. pattern_app:
  99. | c = CNAME; p = pattern_bases { PCtor(c, p) } (*zmiana*)
  100. | p=pattern_base { p }
  101. ;
  102.  
  103. pattern_bases: (* dodanie pattern_bases *)
  104. | p = pattern_base; COMMA; ps = pattern_bases { p :: ps }
  105. | p = pattern_base { [p] }
  106.  
  107. pattern_base:
  108. | UNDERSCORE { PWildcard }
  109. | LPAREN; RPAREN { PUnit }
  110. | LPAREN; p=pattern; RPAREN { p }
  111. | x=IDENT { PVar x }
  112. | i=INT { PInt i }
  113. | TRUE { PBool true }
  114. | FALSE { PBool false }
  115. ;
  116.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement