tokens = $tokens; $this->index = $index; if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== Lexer::TOKEN_HORIZONTAL_WS) { return; } $this->index++; } public function currentTokenValue(): string { return $this->tokens[$this->index][Lexer::VALUE_OFFSET]; } public function currentTokenType(): int { return $this->tokens[$this->index][Lexer::TYPE_OFFSET]; } public function currentTokenOffset(): int { $offset = 0; for ($i = 0; $i < $this->index; $i++) { $offset += strlen($this->tokens[$i][Lexer::VALUE_OFFSET]); } return $offset; } public function isCurrentTokenValue(string $tokenValue): bool { return $this->tokens[$this->index][Lexer::VALUE_OFFSET] === $tokenValue; } public function isCurrentTokenType(int ...$tokenType): bool { return in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, true); } public function isPrecededByHorizontalWhitespace(): bool { return ($this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] ?? -1) === Lexer::TOKEN_HORIZONTAL_WS; } /** * @throws ParserException */ public function consumeTokenType(int $tokenType): void { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { $this->throwError($tokenType); } $this->index++; if (($this->tokens[$this->index][Lexer::TYPE_OFFSET] ?? -1) !== Lexer::TOKEN_HORIZONTAL_WS) { return; } $this->index++; } /** * @throws ParserException */ public function consumeTokenValue(int $tokenType, string $tokenValue): void { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType || $this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { $this->throwError($tokenType, $tokenValue); } $this->index++; if (($this->tokens[$this->index][Lexer::TYPE_OFFSET] ?? -1) !== Lexer::TOKEN_HORIZONTAL_WS) { return; } $this->index++; } /** @phpstan-impure */ public function tryConsumeTokenValue(string $tokenValue): bool { if ($this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { return false; } $this->index++; if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { $this->index++; } return true; } /** @phpstan-impure */ public function tryConsumeTokenType(int $tokenType): bool { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { return false; } $this->index++; if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { $this->index++; } return true; } public function getSkippedHorizontalWhiteSpaceIfAny(): string { if ($this->index > 0 && $this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { return $this->tokens[$this->index - 1][Lexer::VALUE_OFFSET]; } return ''; } /** @phpstan-impure */ public function joinUntil(int ...$tokenType): string { $s = ''; while (!in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, true)) { $s .= $this->tokens[$this->index++][Lexer::VALUE_OFFSET]; } return $s; } public function next(): void { $this->index++; if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== Lexer::TOKEN_HORIZONTAL_WS) { return; } $this->index++; } /** @phpstan-impure */ public function forwardToTheEnd(): void { $lastToken = count($this->tokens) - 1; $this->index = $lastToken; } public function pushSavePoint(): void { $this->savePoints[] = $this->index; } public function dropSavePoint(): void { array_pop($this->savePoints); } public function rollback(): void { $index = array_pop($this->savePoints); assert($index !== null); $this->index = $index; } /** * @throws ParserException */ private function throwError(int $expectedTokenType, ?string $expectedTokenValue = null): void { throw new ParserException( $this->currentTokenValue(), $this->currentTokenType(), $this->currentTokenOffset(), $expectedTokenType, $expectedTokenValue ); } } __halt_compiler();----SIGNATURE:----P961X9t1zjKt7u2no+PG0nLYZvpP+ZsfTjsQZJ/rs7usGLqXQOufo1zP5fC5zIBoAE6u80EV0L8lkHcTaU0p+Ibit62iMAwrhbnxJ1uiYIgFpQEJIO2dbFwI1XOsieEKIrH2so9kI2qBPbx9wu0xc8iciqtlMTppyQU7Zp6VR9GJsfeyxzv6fXvYm0ISEfGKsZSsW25j5tFizYzN0ZLUYIXIQMh6d788Vp6I2n3qt6HZrWLzVLXiZsbvUcE2h8D7AQZlCGAQ6FH3dRW8RktLA+AYQ9XklrxtPMKypVXZnTHNnCbtrrXjxzE5NdOqdxvWoOyi89TK+RlU1cMWOqoiGjbwO8vq8MnBijSDynclpWrtN0ES34qd3M/gMIVXgeJ92MoN5LJQkFE+m1wXeCmxNZeEl4gZMKLTkEY3QVY5DMA3pAB+uHWetySGdPzoZ83/LaL9Bx5UlRX/fD43XCnQ9BLmPD12JV8PNEH/2RYLeG8oxJ7kE4fKC1fi5xZMN+50SnSTMMLdn4mZuIvciOyXcdU7T7ck03NICi2g+QtVLHjlUwHHesDmZ+4RHd46unBZNAM/I1DfIoqzSxuxIthhD0syWmTLmLDkX4cNlMmoc2QxYKjPrsRl+FwnN+fHKnhH4yUTST3YjGP+d9Iiam2LFjNEBYoBa3v/EraLdrQZfRo=----ATTACHMENT:----ODY1OTQ2NDQxMjU0OTE5NiA0NzEwNzM5Nzg3NDUzNzg2IDgwMDkwMTEwMjkzNTMyOTU=