So all it says is that ID :<whatever> is good, but ID :: is not. However, this doesn't solve the original problem --- in x?y:zy is still parsed as label. I guess the right solution would be to enter a different state after we have seen ? and within that state ignore the label rule. As in C/C++ the e1 ? e2 : e3 is an expression, therefore it cannot contain labels.