summaryrefslogtreecommitdiff
path: root/vendor/vlucas/phpdotenv/src/Parser/Lexer.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/vlucas/phpdotenv/src/Parser/Lexer.php')
-rw-r--r--vendor/vlucas/phpdotenv/src/Parser/Lexer.php58
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];
+ }
+ }
+}