To my understanding, precendence levels correspond to the level you define in the grammar, in the given order : in your case, you have "=", "+" at the same level, with higher precendence than "And" and "*". You should reverse your rules (starting with the higher-precendence construnction instead of the atomic values), and possibly split some of your level into different levels (eg. "<" and "+") for finer-grained precedence.
See camlp4/Camlp4Parsers/Camlp4OcamlRevisedParser.ml's "expr" rule (you may look for " expr:" in the source file) for a complete yet understandable example. On 3/12/09, Joel Reymont <joe...@gmail.com> wrote: > I'm trying to properly set up the precedence in my expression camlp4 > rule. > > It's not working properly, though. > > (* wrong!!! > has higher prec than and*) > # parse_with_rule expr "1 > 2 and 3 > 4";; > - : Easy_ast.expr = Cond (Int 1, GT, And (Int 2, Cond (Int 3, GT, Int > 4))) > > (* right! mul is higher than plus *) > # parse_with_rule expr "1 + 2 * 3";; > - : Easy_ast.expr = Plus (Int 1, Mul (Int 2, Int 3)) > > (* wrong!!! > should be higher than + *) > # parse_with_rule expr "1 + 2 > 3";; > - : Easy_ast.expr = Plus (Int 1, Cond (Int 2, GT, Int 3)) > > (* wrong!!! mul should be higher than and *) > # parse_with_rule expr "1 * 2 and 3 * 4";; > - : Easy_ast.expr = Mul (Int 1, And (Int 2, Mul (Int 3, Int 4))) > > (* right!!! *) > # parse_with_rule expr "1 * not 2";; > - : Easy_ast.expr = Mul (Int 1, Not (Int 2)) > > Here's my rule. What am I doing wrong? > > Thanks, Joel > > --- > > expr: > [ NONA > [ (x, _) = INT -> Int x > | (x, _) = FLOAT -> Float x > | (s, _) = STRING -> Str s > | "true" -> Bool true > | "false" -> Bool false > | a = IDENT; "["; b = exprl; "]"; c = OPT ago -> > Var (a, b, c) > | a = IDENT; b = OPT ago -> > Var (a, [], b) > | "("; e = expr; ")" -> Group e > ] > | LEFTA > [ e1 = expr; "="; e2 = expr -> Cond (e1, EQ, e2) > | e1 = expr; "<="; e2 = expr -> Cond (e1, LE, e2) > | e1 = expr; ">="; e2 = expr -> Cond (e1, GE, e2) > | e1 = expr; "<"; e2 = expr -> Cond (e1, LT, e2) > | e1 = expr; ">"; e2 = expr -> Cond (e1, GT, e2) > | e1 = expr; "<>"; e2 = expr -> Cond (e1, NEQ, e2) > | e1 = expr; "+"; e2 = expr -> Plus (e1, e2) > | e1 = expr; "-"; e2 = expr -> Minus (e1, e2) > | "-"; e = expr -> UniMinus e > ] > | LEFTA > [ e1 = expr; "Or"; e2 = expr -> Or (e1, e2) > | e1 = expr; "And"; e2 = expr -> And (e1, e2) > | e1 = expr; "Mod"; e2 = expr -> Mod (e1, e2) > | e1 = expr; "*"; e2 = expr -> Mul (e1, e2) > | e1 = expr; "/"; e2 = expr -> Div (e1, e2) > | e = expr; [ "Points"; "Point" ]; i = OPT instr -> Points (e, i) > | "Not"; e = expr -> Not e > ] > ]; > > --- > http://tinyco.de > --- Mac & iPhone > > > > > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > _______________________________________________ Caml-list mailing list. Subscription management: http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list Archives: http://caml.inria.fr Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs