%{ open Arith %} %token INT %token VAR %token PLUSEQ MINUSEQ DIVEQ MULEQ MODEQ EQ %token PLUS MINUS MUL DIV %token LT GT EQEQ %token QUESTION COLON %token LPAREN RPAREN %token EOF %right PLUSEQ MINUSEQ DIVEQ MULEQ MODEQ EQ %right QUESTION COLON %left PLUS MINUS %left MUL DIV %left GT LT %right UMINUS UPLUS %start main %% main: | expr EOF { $1 } expr: | v=VAR PLUSEQ e=expr { Assign (Add, v, e) } | v=VAR MINUSEQ e=expr { Assign (Sub, v, e) } | v=VAR MULEQ e=expr { Assign (Mul, v, e) } | v=VAR DIVEQ e=expr { Assign (Div, v, e) } | expr PLUS expr { Binop (Add, $1, $3) } | expr MINUS expr { Binop (Sub, $1, $3) } | expr MUL expr { Binop (Mul, $1, $3) } | expr DIV expr { Binop (Div, $1, $3) } | expr LT expr { Binop (Lt, $1, $3) } | expr GT expr { Binop (Gt, $1, $3) } | expr EQEQ expr { Binop (Eq, $1, $3) } | expr QUESTION expr COLON expr { Ternary ($1, $3, $5) } | PLUS expr %prec UPLUS { $2 } | MINUS expr %prec UMINUS { Neg $2 } | INT { Int $1 } | VAR { Var $1 } | LPAREN expr RPAREN { $2 }