3434use PackageFactory \ComponentEngine \Language \AST \Node \UnaryOperation \UnaryOperator ;
3535use PackageFactory \ComponentEngine \Language \Parser \BooleanLiteral \BooleanLiteralParser ;
3636use PackageFactory \ComponentEngine \Language \Parser \IntegerLiteral \IntegerLiteralParser ;
37+ use PackageFactory \ComponentEngine \Language \Parser \Match \MatchParser ;
3738use PackageFactory \ComponentEngine \Language \Parser \NullLiteral \NullLiteralParser ;
3839use PackageFactory \ComponentEngine \Language \Parser \StringLiteral \StringLiteralParser ;
3940use PackageFactory \ComponentEngine \Language \Parser \Tag \TagParser ;
@@ -54,6 +55,7 @@ final class ExpressionParser
5455 private readonly ValueReferenceParser $ valueReferenceParser ;
5556 private readonly TemplateLiteralParser $ templateLiteralParser ;
5657 private readonly TagParser $ tagParser ;
58+ private readonly MatchParser $ matchParser ;
5759
5860 public function __construct (
5961 private ?TokenType $ stopAt = null ,
@@ -66,6 +68,7 @@ public function __construct(
6668 $ this ->valueReferenceParser = new ValueReferenceParser ();
6769 $ this ->templateLiteralParser = new TemplateLiteralParser ();
6870 $ this ->tagParser = new TagParser ();
71+ $ this ->matchParser = new MatchParser ();
6972 }
7073
7174 /**
@@ -113,7 +116,7 @@ public function parse(\Iterator &$tokens): ExpressionNode
113116 * @param \Iterator<mixed,Token> $tokens
114117 * @return ExpressionNode
115118 */
116- public function parseUnaryStatement (\Iterator &$ tokens ): ExpressionNode
119+ private function parseUnaryStatement (\Iterator &$ tokens ): ExpressionNode
117120 {
118121 $ result = match (Scanner::type ($ tokens )) {
119122 TokenType::OPERATOR_BOOLEAN_NOT =>
@@ -136,6 +139,8 @@ public function parseUnaryStatement(\Iterator &$tokens): ExpressionNode
136139 $ this ->parseTag ($ tokens ),
137140 TokenType::TEMPLATE_LITERAL_START =>
138141 $ this ->parseTemplateLiteral ($ tokens ),
142+ TokenType::KEYWORD_MATCH =>
143+ $ this ->parseMatch ($ tokens ),
139144 TokenType::BRACKET_ROUND_OPEN =>
140145 $ this ->parseBracketedExpression ($ tokens ),
141146 default =>
@@ -152,6 +157,7 @@ public function parseUnaryStatement(\Iterator &$tokens): ExpressionNode
152157 TokenType::STRING ,
153158 TokenType::TAG_START_OPENING ,
154159 TokenType::TEMPLATE_LITERAL_START ,
160+ TokenType::KEYWORD_MATCH ,
155161 TokenType::BRACKET_ROUND_OPEN
156162 ),
157163 actualToken: $ tokens ->current ()
@@ -173,7 +179,7 @@ public function parseUnaryStatement(\Iterator &$tokens): ExpressionNode
173179 * @param \Iterator<mixed,Token> $tokens
174180 * @return ExpressionNode
175181 */
176- public function parseUnaryOperation (\Iterator &$ tokens ): ExpressionNode
182+ private function parseUnaryOperation (\Iterator &$ tokens ): ExpressionNode
177183 {
178184 $ startingToken = $ tokens ->current ();
179185
@@ -353,6 +359,20 @@ private function parseTemplateLiteral(\Iterator &$tokens): ExpressionNode
353359 );
354360 }
355361
362+ /**
363+ * @param \Iterator<mixed,Token> $tokens
364+ * @return ExpressionNode
365+ */
366+ private function parseMatch (\Iterator &$ tokens ): ExpressionNode
367+ {
368+ $ matchNode = $ this ->matchParser ->parse ($ tokens );
369+
370+ return new ExpressionNode (
371+ rangeInSource: $ matchNode ->rangeInSource ,
372+ root: $ matchNode
373+ );
374+ }
375+
356376 /**
357377 * @param \Iterator<mixed,Token> $tokens
358378 * @return ExpressionNode
0 commit comments