-
Notifications
You must be signed in to change notification settings - Fork 20
/
container.php
119 lines (97 loc) · 3.3 KB
/
container.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php declare(strict_types=1);
/**
* @license http://opensource.org/licenses/mit-license.php MIT
* @link https://github.com/nicoSWD
* @author Nicolas Oelgart <nico@oelgart.com>
*/
namespace nicoSWD\Rule;
use nicoSWD\Rule\Grammar\JavaScript\JavaScript;
use nicoSWD\Rule\TokenStream\AST;
use nicoSWD\Rule\Compiler\CompilerFactory;
use nicoSWD\Rule\Evaluator\Evaluator;
use nicoSWD\Rule\Evaluator\EvaluatorInterface;
use nicoSWD\Rule\Expression\ExpressionFactory;
use nicoSWD\Rule\Tokenizer\Tokenizer;
use nicoSWD\Rule\TokenStream\Token\TokenFactory;
use nicoSWD\Rule\TokenStream\TokenStreamFactory;
use nicoSWD\Rule\TokenStream\CallableUserMethodFactory;
return new class {
private static TokenStreamFactory $tokenStreamFactory;
private static TokenFactory $tokenFactory;
private static CompilerFactory $compiler;
private static JavaScript $javaScript;
private static ExpressionFactory $expressionFactory;
private static CallableUserMethodFactory $userMethodFactory;
private static Tokenizer $tokenizer;
private static Evaluator $evaluator;
public function parser(array $variables): Parser\Parser
{
return new Parser\Parser(
self::ast($variables),
self::expressionFactory(),
self::compiler()
);
}
public function evaluator(): EvaluatorInterface
{
if (!isset(self::$evaluator)) {
self::$evaluator = new Evaluator();
}
return self::$evaluator;
}
private static function tokenFactory(): TokenFactory
{
if (!isset(self::$tokenFactory)) {
self::$tokenFactory = new TokenFactory();
}
return self::$tokenFactory;
}
private static function compiler(): CompilerFactory
{
if (!isset(self::$compiler)) {
self::$compiler = new CompilerFactory();
}
return self::$compiler;
}
private static function ast(array $variables): AST
{
$ast = new AST(self::tokenizer(), self::tokenFactory(), self::tokenStreamFactory(), self::userMethodFactory());
$ast->setVariables($variables);
return $ast;
}
private static function tokenizer(): Tokenizer
{
if (!isset(self::$tokenizer)) {
self::$tokenizer = new Tokenizer(self::javascript(), self::tokenFactory());
}
return self::$tokenizer;
}
private static function javascript(): JavaScript
{
if (!isset(self::$javaScript)) {
self::$javaScript = new JavaScript();
}
return self::$javaScript;
}
private static function tokenStreamFactory(): TokenStreamFactory
{
if (!isset(self::$tokenStreamFactory)) {
self::$tokenStreamFactory = new TokenStreamFactory();
}
return self::$tokenStreamFactory;
}
private static function expressionFactory(): ExpressionFactory
{
if (!isset(self::$expressionFactory)) {
self::$expressionFactory = new ExpressionFactory();
}
return self::$expressionFactory;
}
private static function userMethodFactory(): CallableUserMethodFactory
{
if (!isset(self::$userMethodFactory)) {
self::$userMethodFactory = new CallableUserMethodFactory();
}
return self::$userMethodFactory;
}
};