(* CMCS-312, 2006 Sample Parser *) open Ast %% %name Calc %term VAR of string | NUM of int | REPEAT | LPAREN | RPAREN | LAMBDA | PLUS | DOT | STOP | EOF %nonterm start of term option | term of term | app of term | abs of term | plus of term | repeat of term | atom of term %pos int %nodefault %verbose %start start %eop STOP %% start: abs (SOME abs) | (NONE) abs: LAMBDA VAR DOT abs (Term_abs(VAR,abs)) | repeat (repeat) repeat: REPEAT atom atom atom (Term_repeat(atom1,atom2,atom3)) | term (term) term: term PLUS app (Term_plus(term,app)) | app (app) app: app atom (Term_app (app, atom)) | atom (atom) atom: VAR (Term_var VAR) | NUM (Term_num NUM) | LPAREN abs RPAREN (Term_paren abs)