diff options
Diffstat (limited to 'vendor/github.com/cloudwego/iasm/expr/ast.go')
-rw-r--r-- | vendor/github.com/cloudwego/iasm/expr/ast.go | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/vendor/github.com/cloudwego/iasm/expr/ast.go b/vendor/github.com/cloudwego/iasm/expr/ast.go deleted file mode 100644 index a91bb2e25..000000000 --- a/vendor/github.com/cloudwego/iasm/expr/ast.go +++ /dev/null @@ -1,261 +0,0 @@ -// -// Copyright 2024 CloudWeGo Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package expr - -import ( - `fmt` -) - -// Type is tyep expression type. -type Type int - -const ( - // CONST indicates that the expression is a constant. - CONST Type = iota - - // TERM indicates that the expression is a Term reference. - TERM - - // EXPR indicates that the expression is a unary or binary expression. - EXPR -) - -var typeNames = map[Type]string { - EXPR : "Expr", - TERM : "Term", - CONST : "Const", -} - -// String returns the string representation of a Type. -func (self Type) String() string { - if v, ok := typeNames[self]; ok { - return v - } else { - return fmt.Sprintf("expr.Type(%d)", self) - } -} - -// Operator represents an operation to perform when Type is EXPR. -type Operator uint8 - -const ( - // ADD performs "Add Expr.Left and Expr.Right". - ADD Operator = iota - - // SUB performs "Subtract Expr.Left by Expr.Right". - SUB - - // MUL performs "Multiply Expr.Left by Expr.Right". - MUL - - // DIV performs "Divide Expr.Left by Expr.Right". - DIV - - // MOD performs "Modulo Expr.Left by Expr.Right". - MOD - - // AND performs "Bitwise AND Expr.Left and Expr.Right". - AND - - // OR performs "Bitwise OR Expr.Left and Expr.Right". - OR - - // XOR performs "Bitwise XOR Expr.Left and Expr.Right". - XOR - - // SHL performs "Bitwise Shift Expr.Left to the Left by Expr.Right Bits". - SHL - - // SHR performs "Bitwise Shift Expr.Left to the Right by Expr.Right Bits". - SHR - - // POW performs "Raise Expr.Left to the power of Expr.Right" - POW - - // NOT performs "Bitwise Invert Expr.Left". - NOT - - // NEG performs "Negate Expr.Left". - NEG -) - -var operatorNames = map[Operator]string { - ADD : "Add", - SUB : "Subtract", - MUL : "Multiply", - DIV : "Divide", - MOD : "Modulo", - AND : "And", - OR : "Or", - XOR : "ExclusiveOr", - SHL : "ShiftLeft", - SHR : "ShiftRight", - POW : "Power", - NOT : "Invert", - NEG : "Negate", -} - -// String returns the string representation of a Type. -func (self Operator) String() string { - if v, ok := operatorNames[self]; ok { - return v - } else { - return fmt.Sprintf("expr.Operator(%d)", self) - } -} - -// Expr represents an expression node. -type Expr struct { - Type Type - Term Term - Op Operator - Left *Expr - Right *Expr - Const int64 -} - -// Ref creates an expression from a Term. -func Ref(t Term) (p *Expr) { - p = newExpression() - p.Term = t - p.Type = TERM - return -} - -// Int creates an expression from an integer. -func Int(v int64) (p *Expr) { - p = newExpression() - p.Type = CONST - p.Const = v - return -} - -func (self *Expr) clear() { - if self.Term != nil { self.Term.Free() } - if self.Left != nil { self.Left.Free() } - if self.Right != nil { self.Right.Free() } -} - -// Free returns the Expr into pool. -// Any operation performed after Free is undefined behavior. -func (self *Expr) Free() { - self.clear() - freeExpression(self) -} - -// Evaluate evaluates the expression into an integer. -// It also implements the Term interface. -func (self *Expr) Evaluate() (int64, error) { - switch self.Type { - case EXPR : return self.eval() - case TERM : return self.Term.Evaluate() - case CONST : return self.Const, nil - default : panic("invalid expression type: " + self.Type.String()) - } -} - -/** Expression Combinator **/ - -func combine(a *Expr, op Operator, b *Expr) (r *Expr) { - r = newExpression() - r.Op = op - r.Type = EXPR - r.Left = a - r.Right = b - return -} - -func (self *Expr) Add(v *Expr) *Expr { return combine(self, ADD, v) } -func (self *Expr) Sub(v *Expr) *Expr { return combine(self, SUB, v) } -func (self *Expr) Mul(v *Expr) *Expr { return combine(self, MUL, v) } -func (self *Expr) Div(v *Expr) *Expr { return combine(self, DIV, v) } -func (self *Expr) Mod(v *Expr) *Expr { return combine(self, MOD, v) } -func (self *Expr) And(v *Expr) *Expr { return combine(self, AND, v) } -func (self *Expr) Or (v *Expr) *Expr { return combine(self, OR , v) } -func (self *Expr) Xor(v *Expr) *Expr { return combine(self, XOR, v) } -func (self *Expr) Shl(v *Expr) *Expr { return combine(self, SHL, v) } -func (self *Expr) Shr(v *Expr) *Expr { return combine(self, SHR, v) } -func (self *Expr) Pow(v *Expr) *Expr { return combine(self, POW, v) } -func (self *Expr) Not() *Expr { return combine(self, NOT, nil) } -func (self *Expr) Neg() *Expr { return combine(self, NEG, nil) } - -/** Expression Evaluator **/ - -var binaryEvaluators = [256]func(int64, int64) (int64, error) { - ADD: func(a, b int64) (int64, error) { return a + b, nil }, - SUB: func(a, b int64) (int64, error) { return a - b, nil }, - MUL: func(a, b int64) (int64, error) { return a * b, nil }, - DIV: idiv, - MOD: imod, - AND: func(a, b int64) (int64, error) { return a & b, nil }, - OR: func(a, b int64) (int64, error) { return a | b, nil }, - XOR: func(a, b int64) (int64, error) { return a ^ b, nil }, - SHL: func(a, b int64) (int64, error) { return a << b, nil }, - SHR: func(a, b int64) (int64, error) { return a >> b, nil }, - POW: ipow, -} - -func (self *Expr) eval() (int64, error) { - var lhs int64 - var rhs int64 - var err error - var vfn func(int64, int64) (int64, error) - - /* evaluate LHS */ - if lhs, err = self.Left.Evaluate(); err != nil { - return 0, err - } - - /* check for unary operators */ - switch self.Op { - case NOT: return self.unaryNot(lhs) - case NEG: return self.unaryNeg(lhs) - } - - /* check for operators */ - if vfn = binaryEvaluators[self.Op]; vfn == nil { - panic("invalid operator: " + self.Op.String()) - } - - /* must be a binary expression */ - if self.Right == nil { - panic("operator " + self.Op.String() + " is a binary operator") - } - - /* evaluate RHS, and call the operator */ - if rhs, err = self.Right.Evaluate(); err != nil { - return 0, err - } else { - return vfn(lhs, rhs) - } -} - -func (self *Expr) unaryNot(v int64) (int64, error) { - if self.Right == nil { - return ^v, nil - } else { - panic("operator Invert is an unary operator") - } -} - -func (self *Expr) unaryNeg(v int64) (int64, error) { - if self.Right == nil { - return -v, nil - } else { - panic("operator Negate is an unary operator") - } -} |