Advertisement
Hinski2

Untitled

May 26th, 2024
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 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
  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: (*dodałem patterns usunołem idents*)
  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 } (*tutaj patterns zamiast idents tak samo w Let*)
  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 = base { App(e1, e2) }
  66. | FST; e = base { Fst e }
  67. | SND; e = base { Snd e }
  68. | RAISE { Raise }
  69. | c = CNAME; e = base { Ctor(c, e) }
  70. | e = base { e }
  71. ;
  72.  
  73. base:
  74. | i = INT { Int i }
  75. | x = IDENT { Var x }
  76. | LPAREN; RPAREN { Unit }
  77. | LPAREN; e = mixfix; RPAREN { e }
  78. | TRUE { Bool true }
  79. | FALSE { Bool false }
  80. | MATCH; e = mixfix; WITH; option(BAR); cs=separated_list(BAR,clause); END
  81. { Match(e, cs) }
  82. ;
  83.  
  84. clause:
  85. | p=pattern; ARR; e=mixfix { (p, e) }
  86. ;
  87.  
  88. pattern:
  89. | p1=pattern; COMMA; p2=pattern { PPair(p1, p2) }
  90. | p=pattern_app { p }
  91. ;
  92.  
  93. pattern_app:
  94. | c = CNAME; p = pattern_base { PCtor(c, p) }
  95. | p=pattern_base { p }
  96. ;
  97.  
  98. pattern_base:
  99. | UNDERSCORE { PWildcard }
  100. | LPAREN; RPAREN { PUnit }
  101. | LPAREN; p=pattern; RPAREN { p }
  102. | x=IDENT { PVar x }
  103. | i=INT { PInt i }
  104. | TRUE { PBool true }
  105. | FALSE { PBool false }
  106. ;
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement