4848
4949final class ExpressionParser
5050{
51- private readonly BooleanLiteralParser $ booleanLiteralParser ;
52- private readonly NullLiteralParser $ nullLiteralParser ;
53- private readonly StringLiteralParser $ stringLiteralParser ;
54- private readonly IntegerLiteralParser $ integerLiteralParser ;
55- private readonly ValueReferenceParser $ valueReferenceParser ;
56- private readonly TemplateLiteralParser $ templateLiteralParser ;
57- private readonly TagParser $ tagParser ;
58- private readonly MatchParser $ matchParser ;
51+ private ? BooleanLiteralParser $ booleanLiteralParser = null ;
52+ private ? IntegerLiteralParser $ integerLiteralParser = null ;
53+ private ? MatchParser $ matchParser = null ;
54+ private ? NullLiteralParser $ nullLiteralParser = null ;
55+ private ? StringLiteralParser $ stringLiteralParser = null ;
56+ private ? TagParser $ tagParser = null ;
57+ private ? TemplateLiteralParser $ templateLiteralParser = null ;
58+ private ? ValueReferenceParser $ valueReferenceParser = null ;
5959
6060 public function __construct (
6161 private ?TokenType $ stopAt = null ,
6262 private Precedence $ precedence = Precedence::SEQUENCE
6363 ) {
64- $ this ->booleanLiteralParser = new BooleanLiteralParser ();
65- $ this ->nullLiteralParser = new NullLiteralParser ();
66- $ this ->stringLiteralParser = new StringLiteralParser ();
67- $ this ->integerLiteralParser = new IntegerLiteralParser ();
68- $ this ->valueReferenceParser = new ValueReferenceParser ();
69- $ this ->templateLiteralParser = new TemplateLiteralParser ();
70- $ this ->tagParser = new TagParser ();
71- $ this ->matchParser = new MatchParser ();
7264 }
7365
7466 /**
@@ -267,6 +259,8 @@ private function shouldStop(\Iterator &$tokens): bool
267259 */
268260 private function parseBooleanLiteral (\Iterator &$ tokens ): ExpressionNode
269261 {
262+ $ this ->booleanLiteralParser ??= BooleanLiteralParser::singleton ();
263+
270264 $ booleanLiteralNode = $ this ->booleanLiteralParser ->parse ($ tokens );
271265
272266 return new ExpressionNode (
@@ -281,6 +275,9 @@ private function parseBooleanLiteral(\Iterator &$tokens): ExpressionNode
281275 */
282276 private function parseNullLiteral (\Iterator &$ tokens ): ExpressionNode
283277 {
278+
279+ $ this ->nullLiteralParser ??= NullLiteralParser::singleton ();
280+
284281 $ nullLiteralNode = $ this ->nullLiteralParser ->parse ($ tokens );
285282
286283 return new ExpressionNode (
@@ -295,6 +292,8 @@ private function parseNullLiteral(\Iterator &$tokens): ExpressionNode
295292 */
296293 private function parseStringLiteral (\Iterator &$ tokens ): ExpressionNode
297294 {
295+ $ this ->stringLiteralParser ??= StringLiteralParser::singleton ();
296+
298297 $ stringLiteralNode = $ this ->stringLiteralParser ->parse ($ tokens );
299298
300299 return new ExpressionNode (
@@ -309,6 +308,8 @@ private function parseStringLiteral(\Iterator &$tokens): ExpressionNode
309308 */
310309 private function parseIntegerLiteral (\Iterator &$ tokens ): ExpressionNode
311310 {
311+ $ this ->integerLiteralParser ??= IntegerLiteralParser::singleton ();
312+
312313 $ integerLiteralNode = $ this ->integerLiteralParser ->parse ($ tokens );
313314
314315 return new ExpressionNode (
@@ -323,6 +324,8 @@ private function parseIntegerLiteral(\Iterator &$tokens): ExpressionNode
323324 */
324325 private function parseValueReference (\Iterator &$ tokens ): ExpressionNode
325326 {
327+ $ this ->valueReferenceParser ??= ValueReferenceParser::singleton ();
328+
326329 $ valueReferenceNode = $ this ->valueReferenceParser ->parse ($ tokens );
327330
328331 return new ExpressionNode (
@@ -337,6 +340,8 @@ private function parseValueReference(\Iterator &$tokens): ExpressionNode
337340 */
338341 private function parseTag (\Iterator &$ tokens ): ExpressionNode
339342 {
343+ $ this ->tagParser ??= TagParser::singleton ();
344+
340345 $ tagNode = $ this ->tagParser ->parse ($ tokens );
341346
342347 return new ExpressionNode (
@@ -351,6 +356,8 @@ private function parseTag(\Iterator &$tokens): ExpressionNode
351356 */
352357 private function parseTemplateLiteral (\Iterator &$ tokens ): ExpressionNode
353358 {
359+ $ this ->templateLiteralParser ??= TemplateLiteralParser::singleton ();
360+
354361 $ templateLiteralNode = $ this ->templateLiteralParser ->parse ($ tokens );
355362
356363 return new ExpressionNode (
@@ -365,6 +372,8 @@ private function parseTemplateLiteral(\Iterator &$tokens): ExpressionNode
365372 */
366373 private function parseMatch (\Iterator &$ tokens ): ExpressionNode
367374 {
375+ $ this ->matchParser ??= MatchParser::singleton ();
376+
368377 $ matchNode = $ this ->matchParser ->parse ($ tokens );
369378
370379 return new ExpressionNode (
0 commit comments