mips-cc

A little C compiler
git clone git@git.mpah.dev/mips-cc.git
Log | Files | Refs | README

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 }