/* Syntactic analyzer for mini-Turtle */ %{ open Ast %} /* Tokens declaration */ %token COMMA LCURLY RCURLY EOF %token FORWARD PENUP PENDOWN TURNLEFT TURNRIGHT COLOR %token BLACK WHITE RED GREEN BLUE %token IF ELSE DEF REPEAT %token <int> INT %token <string> VAR %token PLUS MINUS TIMES DIV %token LPAR RPAR /* TODO */ /* Tokens priorities and associativity */ %left PLUS MINUS %left TIMES DIV %nonassoc uminus %nonassoc IF %nonassoc ELSE /* TODO */ /* Grammar entry-point */ %start prog /* Type of returned values for the syntactic analyzer */ %type <Ast.program> prog %% /* Grammar rules */ prog: defs = def* stmts = stmt* EOF { { defs = defs; main = Sblock stmts } } def: DEF x = VAR LPAR args = separated_list(COMMA, VAR) RPAR s = stmt { { name = x; formals = args; body = s } } stmt: PENUP { Spenup } PENDOWN { Spendown } FORWARD e = expr { Sforward e } TURNLEFT e = expr { Sturn e } TURNRIGHT e = expr { Sturn (Ebinop (Sub, Econst 0, e)) } COLOR c = color { Scolor c } f = VAR LPAR l = separated_list(COMMA, expr) RPAR { Scall (f, l) } IF e = expr s = stmt { Sif (e, s, Sforward (Econst 0)) } IF e = expr s1 = stmt ELSE s2 = stmt { Sif (e, s1, s2) } REPEAT e = expr s = stmt { Srepeat (e, s) } LCURLY s = stmt* RCURLY { Sblock s } expr: n = INT { Econst n } id = VAR { Evar id } e1 = expr o = op e2 = expr { Ebinop (o, e1, e2) } MINUS e = expr %prec uminus { Ebinop (Sub, Econst 0, e) } LPAR e = expr RPAR { e } %inline op: PLUS { Add } MINUS { Sub } TIMES { Mul } DIV { Div } ; color: BLACK { Turtle.black } WHITE { Turtle.white } RED { Turtle.red } GREEN { Turtle.green } BLUE { Turtle.blue }
This document was generated using caml2html