%token INT %token PLUS %token MULT %token LPAREN %token RPAREN %token EOF %start top_expr %% top_expr: | e = expr_nt0; EOF { e } expr_nt0: | e1 = expr_nt0; PLUS; e2 = expr_nt1 { Plus(e1, e2) } | e = expr_nt1 { e } expr_nt1: | e1 = expr_nt1; MULT; e2 = expr_nt2 { Prod(e1, e2) } | e = expr_nt2 { e } expr_nt2: | LPAREN; e = expr_nt0; RPAREN { e } | c = INT { Int c } (***************************************) (* "3 * 4 + 5" ==expr_nt0==> Plus("3 * 4", "5") ==expr_nt1==> Plus("3 * 4", Int 5) ==expr_nt2==> Plus(Mult(Int 3, Int 4), Int 5) ==eval==> 17 "3 * (4 + 5)" ==expr_nt0+...==> Mult(Int 3, Plus(Int 4, Int 5)) ==eval==> 27 *)