parser.mly (4858B)
1 %{ 2 open Ast 3 open Ast.Syntax 4 %} 5 6 %token <int> Lint 7 %token <float> Lfloat 8 %token <bool> Ltrue Lfalse 9 %token <string> Lchar 10 %token <string> Lstr 11 %token <string> Lvar 12 %token Ladd Lsub Lmul Ldiv Lmod Lopar Lcpar Lobra Lcbra Lcom Lputs Lputi Lgeti 13 %token Lreturn Lassign Lsc Lend Leq Lneq Lif Lelse Lwhile 14 %token Lint_k Lfloat_k Lbool_k Lchar_k Lvoid_k 15 %token Lge Lgt Lle Llt Lor Land Lxor Lex 16 17 %left Ladd Lsub 18 %left Lmul Ldiv 19 20 %start prog 21 22 %type <Ast.Syntax.prog> prog 23 24 %% 25 26 prog: 27 | d = def; p = prog { 28 d :: p 29 } 30 | Lend {[]} 31 32 def: 33 | t = type_; n = Lvar; Lopar; a = args; Lcpar; Lobra; b = block; Lcbra { 34 Func { ftype = t 35 ; name = n 36 ; args = a 37 ; body = b 38 ; pos = $startpos(t) } 39 } 40 | t = type_; n = Lvar; Lopar; no_arg; Lcpar; Lobra; b = block; Lcbra { 41 Func { ftype = t 42 ; name = n 43 ; args = [] 44 ; body = b 45 ; pos = $startpos(t) } 46 } 47 48 arg: 49 | t = type_; n = Lvar { 50 t, n 51 } 52 53 args: 54 | {[]} 55 | a = arg { a :: [] } 56 | a = arg; Lcom; r = args { a :: r } 57 58 par: 59 | {[]} 60 | e = expr { 61 e :: [] 62 } 63 | e = expr; Lcom; p = par { 64 e :: p 65 } 66 67 block: 68 | {[]} 69 | Lreturn; e = expr; Lsc { 70 Return { expr = e; pos = $startpos($1) } 71 :: [] 72 } 73 | v = Lvar; Lassign; e = expr; Lsc; b = block { 74 Assign { var = v; expr = e; pos = $startpos($2) } 75 :: b 76 } 77 | t = type_; v = Lvar; Lsc; b = block { 78 Decl { var = v; type_ = t; pos = $startpos(t) } 79 :: b 80 } 81 | t = type_; v = Lvar; Lassign; e = expr; Lsc; b = block { 82 Decl { var = v; type_ = t; pos = $startpos(t) } 83 :: Assign { var = v; expr = e; pos = $startpos($3) } 84 :: b 85 } 86 | e = expr; Lsc; b = block { 87 Expr { expr = e; pos = $startpos(e) } 88 :: b 89 } 90 | Lif; e = expr; Lobra; b1 = block; Lcbra; b = block { 91 Cond { expr = e; b1 = b1; b2 = []; pos = $startpos($1) } 92 :: b 93 } 94 | Lif; e = expr; Lobra; b1 = block; Lcbra; Lelse; Lobra; b2 = block; Lcbra; b = block { 95 Cond { expr = e; b1 = b1; b2 = b2; pos = $startpos($1) } 96 :: b 97 } 98 | Lif; e = expr; Lobra; b1 = block; Lcbra; Lelse; b2 = block; b = block; { 99 Cond { expr = e; b1 = b1; b2 = b2; pos = $startpos($1) } 100 :: b 101 } 102 | Lwhile; e = expr; Lobra; b1 = block; Lcbra; b = block { 103 Loop { expr = e; b = b1; pos = $startpos($1) } 104 :: b 105 } 106 107 expr: 108 | Lopar; e = expr; Lcpar { e } 109 | b = Ltrue { 110 Bool { value = b; pos = $startpos(b)} 111 } 112 | b = Lfalse { 113 Bool { value = b; pos = $startpos(b)} 114 } 115 | n = Lint { 116 Int { value = n; pos = $startpos(n)} 117 } 118 | n = Lfloat { 119 Float { value = n; pos = $startpos(n)} 120 } 121 | c = Lchar { 122 Char { value = c; pos = $startpos(c)} 123 } 124 | s = Lstr { 125 Str { value = s; pos = $startpos(s)} 126 } 127 | a = expr; Lmul; b = expr { 128 Call { func = "_mul"; args = [a; b]; pos = $startpos($2)} 129 } 130 | a = expr; Ladd; b = expr { 131 Call { func = "_add"; args = [a; b]; pos = $startpos($2)} 132 } 133 | a = expr; Lsub; b = expr { 134 Call { func = "_sub"; args = [a; b]; pos = $startpos($2)} 135 } 136 | a = expr; Ldiv; b = expr { 137 Call { func = "_div"; args = [a; b]; pos = $startpos($2)} 138 } 139 | a = expr; Lmod; b = expr { 140 Call { func = "_mod"; args = [a; b]; pos = $startpos($2)} 141 } 142 | a = expr; Lge ; b = expr { 143 Call { func = "_ge"; args = [a; b]; pos = $startpos($2)} 144 } 145 | a = expr; Lgt ; b = expr { 146 Call { func = "_gt"; args = [a; b]; pos = $startpos($2)} 147 } 148 | a = expr; Lle ; b = expr { 149 Call { func = "_le"; args = [a; b]; pos = $startpos($2)} 150 } 151 | a = expr; Llt ; b = expr { 152 Call { func = "_lt"; args = [a; b]; pos = $startpos($2)} 153 } 154 | a = expr; Leq; b = expr { 155 Call { func = "_eq"; args = [a; b]; pos = $startpos($2)} 156 } 157 | a = expr; Lneq; b = expr { 158 Call { func = "_neq"; args = [a; b]; pos = $startpos($2)} 159 } 160 | a = expr; Lor ; b = expr { 161 Call { func = "_or"; args = [a; b]; pos = $startpos($2)} 162 } 163 | a = expr; Land ; b = expr { 164 Call { func = "_and"; args = [a; b]; pos = $startpos($2)} 165 } 166 | a = expr; Lxor ; b = expr { 167 Call { func = "_xor"; args = [a; b]; pos = $startpos($2)} 168 } 169 | Lputs; Lopar; a = expr; Lcpar { 170 Call { func = "_puts"; args = [a]; pos = $startpos($1)} 171 } 172 | Lputi; Lopar; a = expr; Lcpar { 173 Call { func = "_puti"; args = [a]; pos = $startpos($1)} 174 } 175 | Lgeti; Lopar; Lcpar { 176 Call { func = "_geti"; args = []; pos = $startpos($1)} 177 } 178 | v = Lvar { 179 Var { name = v; pos = $startpos(v)} 180 } 181 | v = Lvar; Lopar; a = par; Lcpar; { 182 Call { func = v 183 ; args = a 184 ; pos = $startpos(v)} 185 } 186 | Lsub; e = expr { 187 Call { func = "_rev"; args = [e]; pos = $startpos($1)} 188 } 189 | Lex; e = expr { 190 Call { func = "_not"; args = [e]; pos = $startpos($1)} 191 } 192 193 type_: 194 | Lint_k { Int_t } 195 | Lbool_k { Bool_t } 196 | Lfloat_k { Float_t } 197 | Lchar_k { Char_t } 198 | Lvoid_k { Void_t } 199 200 no_arg: 201 | Lvoid_k { Void_t }