annotate vendor/theseer/tokenizer/src/Tokenizer.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents 5311817fb629
children
rev   line source
Chris@2 1 <?php declare(strict_types = 1);
Chris@2 2 namespace TheSeer\Tokenizer;
Chris@2 3
Chris@2 4 class Tokenizer {
Chris@2 5
Chris@2 6 /**
Chris@2 7 * Token Map for "non-tokens"
Chris@2 8 *
Chris@2 9 * @var array
Chris@2 10 */
Chris@2 11 private $map = [
Chris@2 12 '(' => 'T_OPEN_BRACKET',
Chris@2 13 ')' => 'T_CLOSE_BRACKET',
Chris@2 14 '[' => 'T_OPEN_SQUARE',
Chris@2 15 ']' => 'T_CLOSE_SQUARE',
Chris@2 16 '{' => 'T_OPEN_CURLY',
Chris@2 17 '}' => 'T_CLOSE_CURLY',
Chris@2 18 ';' => 'T_SEMICOLON',
Chris@2 19 '.' => 'T_DOT',
Chris@2 20 ',' => 'T_COMMA',
Chris@2 21 '=' => 'T_EQUAL',
Chris@2 22 '<' => 'T_LT',
Chris@2 23 '>' => 'T_GT',
Chris@2 24 '+' => 'T_PLUS',
Chris@2 25 '-' => 'T_MINUS',
Chris@2 26 '*' => 'T_MULT',
Chris@2 27 '/' => 'T_DIV',
Chris@2 28 '?' => 'T_QUESTION_MARK',
Chris@2 29 '!' => 'T_EXCLAMATION_MARK',
Chris@2 30 ':' => 'T_COLON',
Chris@2 31 '"' => 'T_DOUBLE_QUOTES',
Chris@2 32 '@' => 'T_AT',
Chris@2 33 '&' => 'T_AMPERSAND',
Chris@2 34 '%' => 'T_PERCENT',
Chris@2 35 '|' => 'T_PIPE',
Chris@2 36 '$' => 'T_DOLLAR',
Chris@2 37 '^' => 'T_CARET',
Chris@2 38 '~' => 'T_TILDE',
Chris@2 39 '`' => 'T_BACKTICK'
Chris@2 40 ];
Chris@2 41
Chris@2 42 public function parse(string $source): TokenCollection {
Chris@2 43 $result = new TokenCollection();
Chris@5 44
Chris@5 45 if ($source === '') {
Chris@5 46 return $result;
Chris@5 47 }
Chris@5 48
Chris@2 49 $tokens = token_get_all($source);
Chris@2 50
Chris@2 51 $lastToken = new Token(
Chris@2 52 $tokens[0][2],
Chris@2 53 'Placeholder',
Chris@2 54 ''
Chris@2 55 );
Chris@2 56
Chris@2 57 foreach ($tokens as $pos => $tok) {
Chris@2 58 if (is_string($tok)) {
Chris@2 59 $token = new Token(
Chris@2 60 $lastToken->getLine(),
Chris@2 61 $this->map[$tok],
Chris@2 62 $tok
Chris@2 63 );
Chris@2 64 $result->addToken($token);
Chris@2 65 $lastToken = $token;
Chris@2 66 continue;
Chris@2 67 }
Chris@2 68
Chris@2 69 $line = $tok[2];
Chris@2 70 $values = preg_split('/\R+/Uu', $tok[1]);
Chris@2 71
Chris@2 72 foreach ($values as $v) {
Chris@2 73 $token = new Token(
Chris@2 74 $line,
Chris@2 75 token_name($tok[0]),
Chris@2 76 $v
Chris@2 77 );
Chris@2 78 $result->addToken($token);
Chris@2 79 $line++;
Chris@2 80 $lastToken = $token;
Chris@2 81 }
Chris@2 82 }
Chris@2 83
Chris@2 84 return $result;
Chris@2 85 }
Chris@2 86
Chris@2 87 }