1: <?php
2:
3: namespace BN\Compiler\Parser\Token;
4:
5: use BN\Compiler\Parser\TokenParser;
6: use BN\Compiler\Token\Token;
7: use BN\Compiler\Grammar\Operators;
8:
9: class ParseOperator extends TokenParser
10: {
11: private $operators = array();
12:
13: public function __construct($accumulator, Operators $operators)
14: {
15: $this->accumulator = $accumulator;
16: $this->operators = $operators;
17: }
18:
19: public function parse(Token $token)
20: {
21: $operatorSymbol = $token->value;
22: if ($this->operators->exists($operatorSymbol)) {
23: $operator = $this->operators->getOrder($operatorSymbol);
24: while ($this->isOperatorAtTopOfStack()) {
25: $stackOperator = $this->operators->getOrder($this->accumulator->valueAtStackPeek());
26: if ($operator->isNotPreceding($stackOperator)) {
27: $this->accumulator->pushTokenFromStackToQueue();
28: } else {
29: break;
30: }
31: }
32: $this->accumulator->pushTokenToStack($token);
33: } else {
34: $this->accumulator->stopParsing('unknownOperator', $operatorSymbol);
35: }
36: }
37:
38: private function isOperatorAtTopOfStack()
39: {
40: return !$this->accumulator->isStackEmpty() && $this->accumulator->isOperatorAtTopOfStack();
41: }
42: }
43: