private static function parseImpl()

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);
  }