diff options
Diffstat (limited to 'vendor/vlucas/phpdotenv/src/Parser/Lexer.php')
| -rw-r--r-- | vendor/vlucas/phpdotenv/src/Parser/Lexer.php | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/vendor/vlucas/phpdotenv/src/Parser/Lexer.php b/vendor/vlucas/phpdotenv/src/Parser/Lexer.php new file mode 100644 index 0000000..981af24 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/Lexer.php @@ -0,0 +1,58 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +final class Lexer +{ + /** + * The regex for each type of token. + */ + private const PATTERNS = [ + '[\r\n]{1,1000}', '[^\S\r\n]{1,1000}', '\\\\', '\'', '"', '\\#', '\\$', '([^(\s\\\\\'"\\#\\$)]|\\(|\\)){1,1000}', + ]; + + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Convert content into a token stream. + * + * Multibyte string processing is not needed here, and nether is error + * handling, for performance reasons. + * + * @param string $content + * + * @return \Generator<string> + */ + public static function lex(string $content) + { + static $regex; + + if ($regex === null) { + $regex = '(('.\implode(')|(', self::PATTERNS).'))A'; + } + + $offset = 0; + + while (isset($content[$offset])) { + if (!\preg_match($regex, $content, $matches, 0, $offset)) { + throw new \Error(\sprintf('Lexer encountered unexpected character [%s].', $content[$offset])); + } + + $offset += \strlen($matches[0]); + + yield $matches[0]; + } + } +} |
