4 %token PLUS MINUS TIMES DIV
5 %token LPAREN RPAREN ASSIGN IN IMPLY FUNC
8 %left PLUS MINUS/* lowest precedence */
9 %left TIMES DIV /* medium precedence */
10 %nonassoc UMINUS/* highest precedence */
11 %start main /* the entry point */
19 |blocks block{match $1 with Ast.Node x -> Ast.Node (x @ [$2])
20 | Ast.Int x -> Ast.Node[$1; $2] | Ast.Leaf x -> Ast.Node [$1; $2]} /* It Must not be entered */
29 | typ ID ASSIGN expr IN block {Ast.Node [Ast.Leaf "%let"; Ast.Node[$1; Ast.Leaf $2; $4]; $6]}
34 | typ IMPLY typ {Ast.Node [Ast.Leaf "->"; $1 ; $3]}
43 arg FUNC block {Ast.Node [Ast.Leaf "%lambda"; $1 ; $3]}
46 typ ID { Ast.Node [$1;Ast.Leaf $2] }
50 expr expr { Ast.Node [ Ast.Leaf "%apply"; $1; $2] }
54 INT { Ast.Int (int_of_string $1)}
56 | LPAREN expr RPAREN { $2 }
57 | expr PLUS expr { Ast.Node [ Ast.Leaf "+"; $1; $3] }
58 | expr MINUS expr { Ast.Node[ Ast.Leaf "-"; $1 ; $3] }
59 | expr TIMES expr { Ast.Node[ Ast.Leaf "*"; $1 ;$3] }
60 | expr DIV expr { Ast.Node[ Ast.Leaf "/"; $1; $3] }
61 | MINUS expr %prec UMINUS { Ast.Node[ Ast.Leaf "-" ; $2] }