예제 #1
0
 /**
  *
  * {@inheritdoc}
  *
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $match = $reader->findPattern('~^[ \\t\\r\\n\\f]+~');
     if (false === $match) {
         return false;
     }
     $stream->push(new Token(Token::TYPE_WHITESPACE, $match[0], $reader->getPosition()));
     $reader->moveForward(strlen($match[0]));
     return true;
 }
예제 #2
0
 /**
  * {@inheritdoc}
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $match = $reader->findPattern($this->patterns->getNumberPattern());
     if (!$match) {
         return false;
     }
     $stream->push(new Token(Token::TYPE_NUMBER, $match[0], $reader->getPosition()));
     $reader->moveForward(strlen($match[0]));
     return true;
 }
예제 #3
0
 protected function assertRemainingContent(Reader $reader, $remainingContent)
 {
     if ('' === $remainingContent) {
         $this->assertEquals(0, $reader->getRemainingLength());
         $this->assertTrue($reader->isEOF());
     } else {
         $this->assertEquals(strlen($remainingContent), $reader->getRemainingLength());
         $this->assertEquals(0, $reader->getOffset($remainingContent));
     }
 }
예제 #4
0
 /**
  * {@inheritdoc}
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $match = $reader->findPattern($this->patterns->getIdentifierPattern());
     if (!$match) {
         return false;
     }
     $value = $this->escaping->escapeUnicode($match[0]);
     $stream->push(new Token(Token::TYPE_IDENTIFIER, $value, $reader->getPosition()));
     $reader->moveForward(strlen($match[0]));
     return true;
 }
 /**
  * {@inheritdoc}
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     if ('/*' !== $reader->getSubstring(2)) {
         return false;
     }
     $offset = $reader->getOffset('*/');
     if (false === $offset) {
         $reader->moveToEnd();
     } else {
         $reader->moveForward($offset + 2);
     }
     return true;
 }
예제 #6
0
 /**
  * Tokenize selector source code.
  *
  * @param Reader $reader
  *
  * @return TokenStream
  */
 public function tokenize(Reader $reader)
 {
     $stream = new TokenStream();
     while (!$reader->isEOF()) {
         foreach ($this->handlers as $handler) {
             if ($handler->handle($reader, $stream)) {
                 continue 2;
             }
         }
         $stream->push(new Token(Token::TYPE_DELIMITER, $reader->getSubstring(1), $reader->getPosition()));
         $reader->moveForward(1);
     }
     return $stream->push(new Token(Token::TYPE_FILE_END, null, $reader->getPosition()))->freeze();
 }
예제 #7
0
 /**
  * {@inheritdoc}
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $quote = $reader->getSubstring(1);
     if (!in_array($quote, array("'", '"'))) {
         return false;
     }
     $reader->moveForward(1);
     $match = $reader->findPattern($this->patterns->getQuotedStringPattern($quote));
     if (!$match) {
         throw new InternalErrorException(sprintf('Should have found at least an empty match at %s.', $reader->getPosition()));
     }
     // check unclosed strings
     if (strlen($match[0]) === $reader->getRemainingLength()) {
         throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
     }
     // check quotes pairs validity
     if ($quote !== $reader->getSubstring(1, strlen($match[0]))) {
         throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
     }
     $string = $this->escaping->escapeUnicodeAndNewLine($match[0]);
     $stream->push(new Token(Token::TYPE_STRING, $string, $reader->getPosition()));
     $reader->moveForward(strlen($match[0]) + 1);
     return true;
 }
예제 #8
0
 public function testToEnd()
 {
     $reader = new Reader('hello');
     $reader->moveToEnd();
     $this->assertTrue($reader->isEOF());
 }