Completed
Push — master ( a65034...5a3549 )
by Michal
03:28
created

Ternary::operate()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 20
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 20
rs 9.2
c 0
b 0
f 0
cc 4
eloc 16
nc 4
nop 2
1
<?php
2
/*
3
    Copyright (c) 2016 Michal Čihař <[email protected]>
4
5
    This file is part of SimpleMath.
6
7
    This program is free software; you can redistribute it and/or modify
8
    it under the terms of the GNU General Public License as published by
9
    the Free Software Foundation; either version 2 of the License, or
10
    (at your option) any later version.
11
12
    This program is distributed in the hope that it will be useful,
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
    GNU General Public License for more details.
16
17
    You should have received a copy of the GNU General Public License along
18
    with this program; if not, write to the Free Software Foundation, Inc.,
19
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
*/
21
namespace SimpleMath\Expressions;
22
23
class Ternary extends Operator {
24
25
    protected $precidence = 1;
26
    protected $leftAssoc = false;
27
28
    public function operate(\SimpleMath\Stack $stack, $variables=array()) {
29
        if (! $this->isOpen()) {
30
            $right = $stack->pop()->operate($stack, $variables);
31
            $left = $stack->pop()->operate($stack, $variables);
32
            return new TernaryIntermediate(array($left, $right));
33
        } else {
34
            $right = $stack->pop()->operate($stack, $variables);
35
            $left = $stack->pop()->operate($stack, $variables);
36
            if ($right instanceof TernaryIntermediate) {
37
                $right = $right->getValues();
38
            } else {
39
                throw new \RuntimeException('Mismatched ternary operator!');
40
            }
41
            if ($left) {
42
                return $right[0];
43
            } else {
44
                return $right[1];
45
            }
46
        }
47
    }
48
49
    public function isOpen() {
50
        return $this->value == '?';
51
    }
52
53
}
54
55
56