1: <?php
2:
3: namespace BN\Compiler;
4:
5: use BN\Compiler\Grammar\GrammarBuilder;
6:
7: class EvaluatorInteractor
8: {
9: private $scanner;
10: private $parser;
11: private $postfix;
12: private $responder;
13:
14: public function __construct(GrammarBuilder $grammar)
15: {
16: $operators = $grammar->buildOperators();
17:
18: $this->responder = new ResponderDecorator();
19: $this->scanner = $grammar->buildScanner();
20: $this->parser = new Parser\ShuntingYardParser($this->responder, $operators);
21: $this->postfix = new Postfix\PostfixEvaluator(
22: $this->responder,
23: $operators,
24: $grammar->buildConstants()
25: );
26: }
27:
28: public function __invoke($input, \stdClass $variables, EvaluatorResponder $responder)
29: {
30: try {
31: $this->evaluate($input, $variables, $responder);
32: } catch (\Exception $e) {
33: $this->responder->exception($e);
34: }
35: }
36:
37: private function evaluate($input, \stdClass $variables, EvaluatorResponder $responder)
38: {
39: $this->responder->setResponder($responder);
40: $statements = $this->scanner->tokenize($input);
41: foreach ($statements as $s) {
42: $this->responder->nextStatement($s->statement);
43: $queue = $this->parser->parse($s->tokens);
44: if ($queue) {
45: $result = $this->postfix->evaluate($queue, $variables);
46: $this->responder->result($result);
47: }
48: }
49: }
50: }
51: