summaryrefslogtreecommitdiff
path: root/vendor/theseer/tokenizer/src/Tokenizer.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/theseer/tokenizer/src/Tokenizer.php')
-rw-r--r--vendor/theseer/tokenizer/src/Tokenizer.php142
1 files changed, 142 insertions, 0 deletions
diff --git a/vendor/theseer/tokenizer/src/Tokenizer.php b/vendor/theseer/tokenizer/src/Tokenizer.php
new file mode 100644
index 000000000..f582d9587
--- /dev/null
+++ b/vendor/theseer/tokenizer/src/Tokenizer.php
@@ -0,0 +1,142 @@
+<?php declare(strict_types = 1);
+namespace TheSeer\Tokenizer;
+
+class Tokenizer {
+
+ /**
+ * Token Map for "non-tokens"
+ *
+ * @var array
+ */
+ private $map = [
+ '(' => 'T_OPEN_BRACKET',
+ ')' => 'T_CLOSE_BRACKET',
+ '[' => 'T_OPEN_SQUARE',
+ ']' => 'T_CLOSE_SQUARE',
+ '{' => 'T_OPEN_CURLY',
+ '}' => 'T_CLOSE_CURLY',
+ ';' => 'T_SEMICOLON',
+ '.' => 'T_DOT',
+ ',' => 'T_COMMA',
+ '=' => 'T_EQUAL',
+ '<' => 'T_LT',
+ '>' => 'T_GT',
+ '+' => 'T_PLUS',
+ '-' => 'T_MINUS',
+ '*' => 'T_MULT',
+ '/' => 'T_DIV',
+ '?' => 'T_QUESTION_MARK',
+ '!' => 'T_EXCLAMATION_MARK',
+ ':' => 'T_COLON',
+ '"' => 'T_DOUBLE_QUOTES',
+ '@' => 'T_AT',
+ '&' => 'T_AMPERSAND',
+ '%' => 'T_PERCENT',
+ '|' => 'T_PIPE',
+ '$' => 'T_DOLLAR',
+ '^' => 'T_CARET',
+ '~' => 'T_TILDE',
+ '`' => 'T_BACKTICK'
+ ];
+
+ public function parse(string $source): TokenCollection {
+ $result = new TokenCollection();
+
+ if ($source === '') {
+ return $result;
+ }
+
+ $tokens = \token_get_all($source);
+
+ $lastToken = new Token(
+ $tokens[0][2],
+ 'Placeholder',
+ ''
+ );
+
+ foreach ($tokens as $pos => $tok) {
+ if (\is_string($tok)) {
+ $token = new Token(
+ $lastToken->getLine(),
+ $this->map[$tok],
+ $tok
+ );
+ $result->addToken($token);
+ $lastToken = $token;
+
+ continue;
+ }
+
+ $line = $tok[2];
+ $values = \preg_split('/\R+/Uu', $tok[1]);
+
+ foreach ($values as $v) {
+ $token = new Token(
+ $line,
+ \token_name($tok[0]),
+ $v
+ );
+ $lastToken = $token;
+ $line++;
+
+ if ($v === '') {
+ continue;
+ }
+
+ $result->addToken($token);
+ }
+ }
+
+ return $this->fillBlanks($result, $lastToken->getLine());
+ }
+
+ private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection {
+ $prev = new Token(
+ 0,
+ 'Placeholder',
+ ''
+ );
+
+ $final = new TokenCollection();
+
+ foreach ($tokens as $token) {
+ if ($prev === null) {
+ $final->addToken($token);
+ $prev = $token;
+
+ continue;
+ }
+
+ $gap = $token->getLine() - $prev->getLine();
+
+ while ($gap > 1) {
+ $linebreak = new Token(
+ $prev->getLine() + 1,
+ 'T_WHITESPACE',
+ ''
+ );
+ $final->addToken($linebreak);
+ $prev = $linebreak;
+ $gap--;
+ }
+
+ $final->addToken($token);
+ $prev = $token;
+ }
+
+ $gap = $maxLine - $prev->getLine();
+
+ while ($gap > 0) {
+ $linebreak = new Token(
+ $prev->getLine() + 1,
+ 'T_WHITESPACE',
+ ''
+ );
+ $final->addToken($linebreak);
+ $prev = $linebreak;
+ $gap--;
+ }
+
+ return $final;
+ }
+}