DslOperation.class.php (1511B)
1 <?php 2 3 namespace dsl\ast; 4 5 use dsl\DslParserException; 6 use dsl\DslRuntimeException; 7 use dsl\DslToken; 8 9 class DslOperation implements DslStatement 10 { 11 private $operator; 12 private $left; 13 private $right; 14 15 /** 16 * DslOperation constructor. 17 * @param $operator 18 * @param $left 19 * @param $right 20 */ 21 public function __construct($operator, $left, $right) 22 { 23 $this->operator = $operator; 24 $this->left = new DslExpression( $left ); 25 $this->right = new DslExpression( $right ); 26 } 27 28 29 /** 30 * @throws DslRuntimeException 31 */ 32 public function execute(& $context ) { 33 34 $left = $this->left->execute( $context ); 35 $right = $this->right->execute( $context ); 36 37 switch( $this->operator ) { 38 case '+': 39 if ( is_string($left) ) 40 return $left . (string)$right; 41 else 42 return intval($left) + intval($right); 43 44 case '-': 45 return intval($left) - intval($right); 46 47 case '*': 48 return $left * $right; 49 50 case '/': 51 return $left / $right; 52 53 case '==': 54 return $left == $right; 55 case '!=': 56 return $left != $right; 57 case '<': 58 return $left < $right; 59 case '<=': 60 return $left <= $right; 61 case '>': 62 return $left > $right; 63 case '>=': 64 return $left >= $right; 65 66 case '||': 67 return $left || $right; 68 case '&&': 69 return $left && $right; 70 71 case '%': 72 return $left % $right; 73 74 case '!': 75 return ! $left; 76 77 default: 78 throw new DslRuntimeException('Unknown operator \''.$this->operator.'\''); 79 } 80 81 } 82 83 84 public function parse($tokens) 85 { 86 } 87 }