44
55use Coduo \PHPMatcher \AST ;
66use Coduo \PHPMatcher \Exception \Exception ;
7- use Coduo \PHPMatcher \Exception \InvalidExpanderTypeException ;
87use Coduo \PHPMatcher \Exception \PatternException ;
9- use Coduo \PHPMatcher \Exception \UnknownExpanderClassException ;
108use Coduo \PHPMatcher \Exception \UnknownExpanderException ;
119use Coduo \PHPMatcher \Matcher \Pattern ;
10+ use Coduo \PHPMatcher \Parser \ExpanderInitializer ;
1211
1312class Parser
1413{
@@ -20,26 +19,17 @@ class Parser
2019 private $ lexer ;
2120
2221 /**
23- * @var array
22+ * @var ExpanderInitializer
2423 */
25- private $ expanderDefinitions = array (
26- "startsWith " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\StartsWith " ,
27- "endsWith " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\EndsWith " ,
28- "notEmpty " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\NotEmpty " ,
29- "lowerThan " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\LowerThan " ,
30- "greaterThan " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\GreaterThan " ,
31- "inArray " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\InArray " ,
32- "contains " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\Contains " ,
33-
34- "oneOf " => "Coduo \\PHPMatcher \\Matcher \\Pattern \\Expander \\OneOf "
35- );
24+ private $ expanderInitializer ;
3625
3726 /**
3827 * @param Lexer $lexer
3928 */
40- public function __construct (Lexer $ lexer )
29+ public function __construct (Lexer $ lexer, ExpanderInitializer $ expanderInitializer )
4130 {
4231 $ this ->lexer = $ lexer ;
32+ $ this ->expanderInitializer = $ expanderInitializer ;
4333 }
4434
4535 /**
@@ -66,11 +56,7 @@ public function parse($pattern)
6656 $ AST = $ this ->getAST ($ pattern );
6757 $ pattern = new Pattern \TypePattern ((string ) $ AST ->getType ());
6858 foreach ($ AST ->getExpanders () as $ expander ) {
69- if (!array_key_exists ($ expander ->getName (), $ this ->expanderDefinitions )) {
70- throw new UnknownExpanderException (sprintf ("Unknown expander \"%s \"" , $ expander ->getName ()));
71- }
72-
73- $ pattern ->addExpander ($ this ->initializeExpander ($ expander ));
59+ $ pattern ->addExpander ($ this ->expanderInitializer ->initialize ($ expander ));
7460 }
7561
7662 return $ pattern ;
@@ -86,20 +72,6 @@ public function getAST($pattern)
8672 return $ this ->getPattern ();
8773 }
8874
89- /**
90- * @param $expanderName
91- * @param $expanderFQCN Fully-Qualified Class Name that implements PatternExpander interface
92- * @throws UnknownExpanderClassException
93- */
94- public function addExpanderDefinition ($ expanderName , $ expanderFQCN )
95- {
96- if (!class_exists ($ expanderFQCN )) {
97- throw new UnknownExpanderClassException (sprintf ("Class \"%s \" does not exists. " , $ expanderFQCN ));
98- }
99-
100- $ this ->expanderDefinitions [$ expanderName ] = $ expanderFQCN ;
101- }
102-
10375 /**
10476 * Create AST root
10577 *
@@ -347,33 +319,4 @@ private function endOfPattern()
347319 {
348320 return is_null ($ this ->lexer ->lookahead );
349321 }
350-
351- /**
352- * @param AST\Expander $expanderNode
353- * @throws InvalidExpanderTypeException
354- * @return Pattern\PatternExpander
355- */
356- private function initializeExpander (AST \Expander $ expanderNode )
357- {
358- $ reflection = new \ReflectionClass ($ this ->expanderDefinitions [$ expanderNode ->getName ()]);
359-
360- if ($ expanderNode ->hasArguments ()) {
361- $ arguments = array ();
362- foreach ($ expanderNode ->getArguments () as $ argument ) {
363- $ arguments [] = ($ argument instanceof AST \Expander)
364- ? $ this ->initializeExpander ($ argument )
365- : $ argument ;
366- }
367-
368- $ expander = $ reflection ->newInstanceArgs ($ arguments );
369- } else {
370- $ expander = $ reflection ->newInstance ();
371- }
372-
373- if (!$ expander instanceof Pattern \PatternExpander) {
374- throw new InvalidExpanderTypeException ();
375- }
376-
377- return $ expander ;
378- }
379322}
0 commit comments