Skip to content

spec: bad grammar for binary expressions #10151

Closed
@mdempsky

Description

@mdempsky

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions