forked from
patrick.sirref.org/merry
Shells in OCaml
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