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
GDShrapt appears to parse operator precedence differently from GDScript in two cases where GDScript's precedence rules diverge from C-like languages.
Case 1:
notvs comparison operatorsIn GDScript,
nothas lower precedence than comparison operators (>,<,==, etc.). Sonot a > 0meansnot (a > 0). This is even the case for!a > 0which means!(a > 0)despite how it looks.Expected AST (GDScript precedence):
Actual AST:
Case 2: Bitwise vs comparison operators
In GDScript, bitwise operators (
&,|,^) have higher precedence than comparison operators (==,!=,<,>, etc.). Soa & b == 0means(a & b) == 0.GDShrapt parses
a & b == 0asa & (b == 0)— with&as the outer operator andb == 0as the right child. This matches C# precedence where bitwise is lower than comparison, but not GDScript's actual precedence.Expected AST (GDScript precedence):
Actual AST:
GDScript precedence reference
https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#operators