Ejemplo n.º 1
0
 /**
  * @param \Carrooi\Tokenizer\Parsing\Lexer $lexer
  * @return int
  */
 function match(Lexer $lexer)
 {
     $tokens = [];
     foreach ($this->tokens as $token) {
         if ($token instanceof AbstractModifier || $token instanceof Matcher) {
             $token = $this->builder->_matchToken($lexer, $token);
             if (is_array($token) && Helpers::isListOfValidTokens($token)) {
                 return $token;
             } elseif ($token !== false) {
                 $tokens[] = $token;
             }
         } else {
             $tokens[] = $token;
         }
     }
     if (!$lexer->isNextToken($tokens)) {
         return false;
     }
     $result = [];
     while (true) {
         $peek = $lexer->peek();
         if (!$peek) {
             break;
         }
         if (Helpers::isTokenA($peek['type'], $tokens)) {
             $result[] = $peek;
         } else {
             $lexer->resetPeek();
             break;
         }
     }
     return count($result) ? $result : false;
 }
Ejemplo n.º 2
0
 /**
  * @param \Carrooi\Tokenizer\Parsing\Lexer $lexer
  * @return array|bool
  */
 function match(Lexer $lexer)
 {
     $startToken = $this->startToken instanceof AbstractModifier ? $this->builder->_matchToken($lexer, $this->startToken) : $this->startToken;
     $endToken = $this->endToken instanceof AbstractModifier ? $this->builder->_matchToken($lexer, $this->endToken) : $this->endToken;
     if (!$lexer->isNextToken($startToken)) {
         return false;
     }
     $openings = 0;
     $result = [];
     while (true) {
         $peek = $lexer->peek();
         if (!$peek) {
             break;
         }
         if (Helpers::isTokenA($peek['type'], $startToken)) {
             $openings++;
             if ($openings > 1 && $this->recursive) {
                 $subTokens = array_slice($lexer->tokens, $lexer->position + $lexer->peekPosition - 1);
                 $subLexer = new Lexer($subTokens);
                 $parenthesis = $this->match($subLexer);
                 if (!$parenthesis) {
                     return false;
                 }
                 $moveTo = $subLexer->peekPosition - 1;
                 for ($i = 0; $i < $moveTo; $i++) {
                     $lexer->peek();
                 }
                 $openings--;
                 $result[] = $parenthesis;
             } else {
                 $result[] = $peek;
             }
         } else {
             $result[] = $peek;
             if (Helpers::isTokenA($peek['type'], $endToken) && --$openings < 1) {
                 break;
             }
         }
     }
     return count($result) ? $result : false;
 }
Ejemplo n.º 3
0
 /**
  * @param int|array $type
  * @param int|array|null $stopAt
  * @return bool
  */
 public function skipUntil($type, $stopAt = null)
 {
     $type = is_array($type) ? $type : [$type];
     $stopAt = is_array($stopAt) ? $stopAt : ($stopAt ? [$stopAt] : []);
     while ($this->lookahead !== null && !Helpers::isTokenA($this->lookahead['type'], $type) && (empty($stopAt) || !Helpers::isTokenA($this->token['type'], $stopAt))) {
         $this->moveNext();
     }
     return $this->lookahead && Helpers::isTokenA($this->lookahead['type'], $type);
 }