/** * @param \Carrooi\Tokenizer\Parsing\Lexer $lexer * @return int */ function match(Lexer $lexer) { $tokens = []; foreach ($this->tokens as $token) { if ($token instanceof AbstractModifier || $token instanceof Matcher) { $token = $this->builder->_matchToken($lexer, $token); if (is_array($token) && Helpers::isListOfValidTokens($token)) { return $token; } elseif ($token !== false) { $tokens[] = $token; } } else { $tokens[] = $token; } } if (!$lexer->isNextToken($tokens)) { return false; } $result = []; while (true) { $peek = $lexer->peek(); if (!$peek) { break; } if (Helpers::isTokenA($peek['type'], $tokens)) { $result[] = $peek; } else { $lexer->resetPeek(); break; } } return count($result) ? $result : false; }
/** * @param \Carrooi\Tokenizer\Parsing\Lexer $lexer * @return array|bool */ function match(Lexer $lexer) { $startToken = $this->startToken instanceof AbstractModifier ? $this->builder->_matchToken($lexer, $this->startToken) : $this->startToken; $endToken = $this->endToken instanceof AbstractModifier ? $this->builder->_matchToken($lexer, $this->endToken) : $this->endToken; if (!$lexer->isNextToken($startToken)) { return false; } $openings = 0; $result = []; while (true) { $peek = $lexer->peek(); if (!$peek) { break; } if (Helpers::isTokenA($peek['type'], $startToken)) { $openings++; if ($openings > 1 && $this->recursive) { $subTokens = array_slice($lexer->tokens, $lexer->position + $lexer->peekPosition - 1); $subLexer = new Lexer($subTokens); $parenthesis = $this->match($subLexer); if (!$parenthesis) { return false; } $moveTo = $subLexer->peekPosition - 1; for ($i = 0; $i < $moveTo; $i++) { $lexer->peek(); } $openings--; $result[] = $parenthesis; } else { $result[] = $peek; } } else { $result[] = $peek; if (Helpers::isTokenA($peek['type'], $endToken) && --$openings < 1) { break; } } } return count($result) ? $result : false; }
/** * @param int|array $type * @param int|array|null $stopAt * @return bool */ public function skipUntil($type, $stopAt = null) { $type = is_array($type) ? $type : [$type]; $stopAt = is_array($stopAt) ? $stopAt : ($stopAt ? [$stopAt] : []); while ($this->lookahead !== null && !Helpers::isTokenA($this->lookahead['type'], $type) && (empty($stopAt) || !Helpers::isTokenA($this->token['type'], $stopAt))) { $this->moveNext(); } return $this->lookahead && Helpers::isTokenA($this->lookahead['type'], $type); }