Shells in OCaml
at main 49 lines 1.1 kB view raw
1%{ 2 open Arith 3%} 4 5%token <int> INT 6%token <string> VAR 7%token PLUSEQ MINUSEQ DIVEQ MULEQ MODEQ EQ 8%token PLUS MINUS MUL DIV 9%token LT GT EQEQ 10%token QUESTION COLON 11%token LPAREN RPAREN 12%token EOF 13 14%right PLUSEQ MINUSEQ DIVEQ MULEQ MODEQ EQ 15%right QUESTION COLON 16%left PLUS MINUS 17%left MUL DIV 18%left GT LT 19%right UMINUS UPLUS 20 21%start <Arith.expr> main 22 23%% 24 25main: 26 | expr EOF { $1 } 27 28expr: 29 | v=VAR PLUSEQ e=expr { Assign (Add, v, e) } 30 | v=VAR MINUSEQ e=expr { Assign (Sub, v, e) } 31 | v=VAR MULEQ e=expr { Assign (Mul, v, e) } 32 | v=VAR DIVEQ e=expr { Assign (Div, v, e) } 33 | expr PLUS expr { Binop (Add, $1, $3) } 34 | expr MINUS expr { Binop (Sub, $1, $3) } 35 | expr MUL expr { Binop (Mul, $1, $3) } 36 | expr DIV expr { Binop (Div, $1, $3) } 37 | expr LT expr { Binop (Lt, $1, $3) } 38 | expr GT expr { Binop (Gt, $1, $3) } 39 | expr EQEQ expr { Binop (Eq, $1, $3) } 40 | expr QUESTION expr COLON expr { Ternary ($1, $3, $5) } 41 42 43 | PLUS expr %prec UPLUS { $2 } 44 | MINUS expr %prec UMINUS { Neg $2 } 45 46 | INT { Int $1 } 47 | VAR { Var $1 } 48 | LPAREN expr RPAREN { $2 } 49