Skip to content

Operator precedence doesn't match GDScript for not vs comparison and bitwise vs comparison #16

Description

@dreed-sd

GDShrapt appears to parse operator precedence differently from GDScript in two cases where GDScript's precedence rules diverge from C-like languages.

Case 1: not vs comparison operators

In GDScript, not has lower precedence than comparison operators (>, <, ==, etc.). So not a > 0 means not (a > 0). This is even the case for !a > 0 which means !(a > 0) despite how it looks.

Expected AST (GDScript precedence):

GDSingleOperatorExpression (not)
  └── GDDualOperatorExpression (>)
      ├── GDIdentifierExpression (a)
      └── GDNumberExpression (0)

Actual AST:

GDDualOperatorExpression (>)
  ├── GDSingleOperatorExpression (not)
  │   └── GDIdentifierExpression (a)
  └── GDNumberExpression (0)

Case 2: Bitwise vs comparison operators

In GDScript, bitwise operators (&, |, ^) have higher precedence than comparison operators (==, !=, <, >, etc.). So a & b == 0 means (a & b) == 0.

GDShrapt parses a & b == 0 as a & (b == 0) — with & as the outer operator and b == 0 as the right child. This matches C# precedence where bitwise is lower than comparison, but not GDScript's actual precedence.

Expected AST (GDScript precedence):

GDDualOperatorExpression (==)
  ├── GDDualOperatorExpression (&)
  │   ├── GDIdentifierExpression (a)
  │   └── GDIdentifierExpression (b)
  └── GDNumberExpression (0)

Actual AST:

GDDualOperatorExpression (&)
  ├── GDIdentifierExpression (a)
  └── GDDualOperatorExpression (==)
      ├── GDIdentifierExpression (b)
      └── GDNumberExpression (0)

GDScript precedence reference

https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#operators

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions