Closed
Description
Section "Operators" defines:
Expression = UnaryExpr | Expression binary_op UnaryExpr .
UnaryExpr = PrimaryExpr | unary_op UnaryExpr .
binary_op = "||" | "&&" | rel_op | add_op | mul_op .
rel_op = "==" | "!=" | "<" | "<=" | ">" | ">=" .
add_op = "+" | "-" | "|" | "^" .
mul_op = "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" .
unary_op = "+" | "-" | "!" | "^" | "*" | "&" | "<-" .
Later section "Operator precedence" explains how mul_op has higher precedence than add_op, etc., but according to the BNF grammar the only way to derive "1 + 2 * 3" is:
Expression
Expression binary_op UnaryExpr
(Expression binary_op UnaryExpr) binary_op UnaryExpr
(UnaryExpr binary_op UnaryExpr) binary_op UnaryExpr
("1" "+" "2") "*" "3"
So the operator precedence section doesn't matter under the presented grammar.
I think the Expression rule needs to be changed to
Expression = UnaryExpr | Expression binary_op Expression .
I.e., the final UnaryExpr should be changed to Expression. This matches the yacc grammar in cmd/internal/gc/go.y.