/* 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