in src/PatternParser/Parser.php [28:79]
private static function parseImpl(
vec<Token> $tokens,
): (PatternNode, vec<Token>) {
$nodes = vec[];
while (!C\is_empty($tokens)) {
list($type, $text) = C\firstx($tokens);
$tokens = Vec\drop($tokens, 1);
if ($type === TokenType::OPEN_BRACE) {
list($node, $tokens) = self::parseParameter($tokens);
$nodes[] = $node;
list($type, $_) = C\firstx($tokens);
invariant(
$type === TokenType::CLOSE_BRACE,
'Got %s without %s',
TokenType::OPEN_BRACE,
TokenType::CLOSE_BRACE,
);
$tokens = Vec\drop($tokens, 1);
continue;
}
if ($type === TokenType::OPEN_BRACKET) {
list($node, $tokens) = self::parseImpl($tokens);
$nodes[] = new OptionalNode($node);
list($type, $_) = C\firstx($tokens);
invariant(
$type === TokenType::CLOSE_BRACKET,
'Got %s without %s',
TokenType::OPEN_BRACKET,
TokenType::CLOSE_BRACKET,
);
$tokens = Vec\drop($tokens, 1);
continue;
}
if ($type === TokenType::CLOSE_BRACKET) {
$tokens = Vec\concat(vec[tuple($type, $text)], $tokens);
return tuple(new PatternNode($nodes), $tokens);
}
invariant(
$type === TokenType::STRING,
'Unexpected token type: %s',
$type,
);
$nodes[] = new LiteralNode($text);
}
return tuple(new PatternNode($nodes), $tokens);
}