Yes, it's ambiguous, but more importantly it doesn't match all valid inputs (unless I've misunderstood what your input language is). As I've understood you, you want to parse, say, a ^ b ^ c and have it produce a parse tree that grows to the left (like (a ^ b) ^ c) and a -> b -> c producing a right-leaning parse tree (like a -> (b -> c)). But your grammar doesn't match either - it always ...