ast.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package expr
  2. import (
  3. `fmt`
  4. )
  5. // Type is tyep expression type.
  6. type Type int
  7. const (
  8. // CONST indicates that the expression is a constant.
  9. CONST Type = iota
  10. // TERM indicates that the expression is a Term reference.
  11. TERM
  12. // EXPR indicates that the expression is a unary or binary expression.
  13. EXPR
  14. )
  15. var typeNames = map[Type]string {
  16. EXPR : "Expr",
  17. TERM : "Term",
  18. CONST : "Const",
  19. }
  20. // String returns the string representation of a Type.
  21. func (self Type) String() string {
  22. if v, ok := typeNames[self]; ok {
  23. return v
  24. } else {
  25. return fmt.Sprintf("expr.Type(%d)", self)
  26. }
  27. }
  28. // Operator represents an operation to perform when Type is EXPR.
  29. type Operator uint8
  30. const (
  31. // ADD performs "Add Expr.Left and Expr.Right".
  32. ADD Operator = iota
  33. // SUB performs "Subtract Expr.Left by Expr.Right".
  34. SUB
  35. // MUL performs "Multiply Expr.Left by Expr.Right".
  36. MUL
  37. // DIV performs "Divide Expr.Left by Expr.Right".
  38. DIV
  39. // MOD performs "Modulo Expr.Left by Expr.Right".
  40. MOD
  41. // AND performs "Bitwise AND Expr.Left and Expr.Right".
  42. AND
  43. // OR performs "Bitwise OR Expr.Left and Expr.Right".
  44. OR
  45. // XOR performs "Bitwise XOR Expr.Left and Expr.Right".
  46. XOR
  47. // SHL performs "Bitwise Shift Expr.Left to the Left by Expr.Right Bits".
  48. SHL
  49. // SHR performs "Bitwise Shift Expr.Left to the Right by Expr.Right Bits".
  50. SHR
  51. // POW performs "Raise Expr.Left to the power of Expr.Right"
  52. POW
  53. // NOT performs "Bitwise Invert Expr.Left".
  54. NOT
  55. // NEG performs "Negate Expr.Left".
  56. NEG
  57. )
  58. var operatorNames = map[Operator]string {
  59. ADD : "Add",
  60. SUB : "Subtract",
  61. MUL : "Multiply",
  62. DIV : "Divide",
  63. MOD : "Modulo",
  64. AND : "And",
  65. OR : "Or",
  66. XOR : "ExclusiveOr",
  67. SHL : "ShiftLeft",
  68. SHR : "ShiftRight",
  69. POW : "Power",
  70. NOT : "Invert",
  71. NEG : "Negate",
  72. }
  73. // String returns the string representation of a Type.
  74. func (self Operator) String() string {
  75. if v, ok := operatorNames[self]; ok {
  76. return v
  77. } else {
  78. return fmt.Sprintf("expr.Operator(%d)", self)
  79. }
  80. }
  81. // Expr represents an expression node.
  82. type Expr struct {
  83. Type Type
  84. Term Term
  85. Op Operator
  86. Left *Expr
  87. Right *Expr
  88. Const int64
  89. }
  90. // Ref creates an expression from a Term.
  91. func Ref(t Term) (p *Expr) {
  92. p = newExpression()
  93. p.Term = t
  94. p.Type = TERM
  95. return
  96. }
  97. // Int creates an expression from an integer.
  98. func Int(v int64) (p *Expr) {
  99. p = newExpression()
  100. p.Type = CONST
  101. p.Const = v
  102. return
  103. }
  104. func (self *Expr) clear() {
  105. if self.Term != nil { self.Term.Free() }
  106. if self.Left != nil { self.Left.Free() }
  107. if self.Right != nil { self.Right.Free() }
  108. }
  109. // Free returns the Expr into pool.
  110. // Any operation performed after Free is undefined behavior.
  111. func (self *Expr) Free() {
  112. self.clear()
  113. freeExpression(self)
  114. }
  115. // Evaluate evaluates the expression into an integer.
  116. // It also implements the Term interface.
  117. func (self *Expr) Evaluate() (int64, error) {
  118. switch self.Type {
  119. case EXPR : return self.eval()
  120. case TERM : return self.Term.Evaluate()
  121. case CONST : return self.Const, nil
  122. default : panic("invalid expression type: " + self.Type.String())
  123. }
  124. }
  125. /** Expression Combinator **/
  126. func combine(a *Expr, op Operator, b *Expr) (r *Expr) {
  127. r = newExpression()
  128. r.Op = op
  129. r.Type = EXPR
  130. r.Left = a
  131. r.Right = b
  132. return
  133. }
  134. func (self *Expr) Add(v *Expr) *Expr { return combine(self, ADD, v) }
  135. func (self *Expr) Sub(v *Expr) *Expr { return combine(self, SUB, v) }
  136. func (self *Expr) Mul(v *Expr) *Expr { return combine(self, MUL, v) }
  137. func (self *Expr) Div(v *Expr) *Expr { return combine(self, DIV, v) }
  138. func (self *Expr) Mod(v *Expr) *Expr { return combine(self, MOD, v) }
  139. func (self *Expr) And(v *Expr) *Expr { return combine(self, AND, v) }
  140. func (self *Expr) Or (v *Expr) *Expr { return combine(self, OR , v) }
  141. func (self *Expr) Xor(v *Expr) *Expr { return combine(self, XOR, v) }
  142. func (self *Expr) Shl(v *Expr) *Expr { return combine(self, SHL, v) }
  143. func (self *Expr) Shr(v *Expr) *Expr { return combine(self, SHR, v) }
  144. func (self *Expr) Pow(v *Expr) *Expr { return combine(self, POW, v) }
  145. func (self *Expr) Not() *Expr { return combine(self, NOT, nil) }
  146. func (self *Expr) Neg() *Expr { return combine(self, NEG, nil) }
  147. /** Expression Evaluator **/
  148. var binaryEvaluators = [256]func(int64, int64) (int64, error) {
  149. ADD: func(a, b int64) (int64, error) { return a + b, nil },
  150. SUB: func(a, b int64) (int64, error) { return a - b, nil },
  151. MUL: func(a, b int64) (int64, error) { return a * b, nil },
  152. DIV: idiv,
  153. MOD: imod,
  154. AND: func(a, b int64) (int64, error) { return a & b, nil },
  155. OR: func(a, b int64) (int64, error) { return a | b, nil },
  156. XOR: func(a, b int64) (int64, error) { return a ^ b, nil },
  157. SHL: func(a, b int64) (int64, error) { return a << b, nil },
  158. SHR: func(a, b int64) (int64, error) { return a >> b, nil },
  159. POW: ipow,
  160. }
  161. func (self *Expr) eval() (int64, error) {
  162. var lhs int64
  163. var rhs int64
  164. var err error
  165. var vfn func(int64, int64) (int64, error)
  166. /* evaluate LHS */
  167. if lhs, err = self.Left.Evaluate(); err != nil {
  168. return 0, err
  169. }
  170. /* check for unary operators */
  171. switch self.Op {
  172. case NOT: return self.unaryNot(lhs)
  173. case NEG: return self.unaryNeg(lhs)
  174. }
  175. /* check for operators */
  176. if vfn = binaryEvaluators[self.Op]; vfn == nil {
  177. panic("invalid operator: " + self.Op.String())
  178. }
  179. /* must be a binary expression */
  180. if self.Right == nil {
  181. panic("operator " + self.Op.String() + " is a binary operator")
  182. }
  183. /* evaluate RHS, and call the operator */
  184. if rhs, err = self.Right.Evaluate(); err != nil {
  185. return 0, err
  186. } else {
  187. return vfn(lhs, rhs)
  188. }
  189. }
  190. func (self *Expr) unaryNot(v int64) (int64, error) {
  191. if self.Right == nil {
  192. return ^v, nil
  193. } else {
  194. panic("operator Invert is an unary operator")
  195. }
  196. }
  197. func (self *Expr) unaryNeg(v int64) (int64, error) {
  198. if self.Right == nil {
  199. return -v, nil
  200. } else {
  201. panic("operator Negate is an unary operator")
  202. }
  203. }