1: <?php
2:
3: namespace Demo;
4:
5: use BN\Compiler\Grammar\GrammarBuilder;
6: use BN\OperatorsFactory;
7: use BN\NumberFactory;
8: use BN\Compiler\Scanner\Converter\LexemeToBNNumber;
9:
10: function grammar()
11: {
12: $numbers = new NumberFactory();
13: $operators = new OperatorsFactory();
14: $toNumber = new LexemeToBNNumber();
15: $grammar = new GrammarDecorator($toNumber);
16: return $grammar
17: ->statementsSeparator(';')
18: ->whiteSpace("\n", "\r", "\n\r", "\t", ',')
19: ->assign('=')
20: ->brackets('(', ')')
21: ->unarySigns('-', '+')
22: ->numberConstant('PI', $numbers->createPI())
23: ->numberConstant('π', $numbers->createPI())
24: ->numberConstant('e', $numbers->createEulerNumber())
25: ->operators(
26: $operators->getAll()
27: );
28: }
29:
30: class GrammarDecorator extends GrammarBuilder
31: {
32: public $keywordsLanguage = array();
33: public $keywordsConstants = array();
34:
35: public function statementsSeparator($statementsSeparator)
36: {
37: $this->keywordsLanguage[] = $statementsSeparator;
38: return parent::statementsSeparator($statementsSeparator);
39: }
40:
41: public function assign($assignOperator)
42: {
43: $this->keywordsLanguage[] = $assignOperator;
44: return parent::assign($assignOperator);
45: }
46:
47: public function keyword($symbol, $tokenType)
48: {
49: $this->keywordsLanguage[] = $symbol;
50: return parent::keyword($symbol, $tokenType);
51: }
52:
53: public function numberConstant($symbol, $value)
54: {
55: $this->keywordsConstants[] = $symbol;
56: return parent::numberConstant($symbol, $value);
57: }
58: }
59: