Example #1
0
 public static function parse(Scanner $scanner)
 {
     $file = $scanner->getFile();
     // Must be /
     $char = $file->nextChar();
     // Unexpected char
     if ($char != '/') {
         // Unexpected EOF
         if ($char === false) {
             throw ExceptionFactory::createUnexpectedEOF(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
             // Unexpected char
         } else {
             throw ExceptionFactory::createUnexpectedChar(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine(), $char);
         }
     }
     // Must be >
     $char = $file->nextChar();
     // We have a problem here
     if ($char != '>') {
         // Illegal space
         if ($scanner->isSpace($char)) {
             throw ExceptionFactory::createIllegalSpace(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
             // Unexpected EOF
         } elseif ($char === false) {
             throw ExceptionFactory::createUnexpectedEOF(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
             // Unexpected char
         } else {
             throw ExceptionFactory::createUnexpectedChar(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine(), $char);
         }
     }
     // Next lookAhead
     $scanner->setLookAhead(Token::T_OPEN_TAG | Token::T_CLOSE_TAG | Token::T_TEXT);
     // T_CLOSE token found
     return new Token(Token::T_CLOSE);
 }
Example #2
0
 public function testCreateIllegalSpaceException()
 {
     $parserException = new ParserException('source.php', 8, 'Illegal space found in source.phpml on line 5');
     $exception = ExceptionFactory::createIllegalSpace('source.php', 8, 'source.phpml', 5);
     $this->assertSame($parserException->getFile(), $exception->getFile());
     $this->assertSame($parserException->getLine(), $exception->getLine());
     $this->assertSame($parserException->getMessage(), $exception->getMessage());
     $this->assertInstanceOf('PHPML\\Exception\\ParserException', $exception);
 }
Example #3
0
 public static function parse(Scanner $scanner)
 {
     $file = $scanner->getFile();
     $char = $file->nextChar();
     $state = 0;
     $ns = '';
     $name = '';
     while (true) {
         switch ($state) {
             case 0:
                 // Must start with <
                 if ($char == '<') {
                     $state = 1;
                     $char = $file->nextChar();
                     // Exception
                 } else {
                     // Unexpected EOF
                     if ($char == false) {
                         throw ExceptionFactory::createUnexpectedEOF(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
                         // Unexpected Char
                     } else {
                         throw ExceptionFactory::createUnexpectedChar(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine(), $char);
                     }
                 }
                 break;
             case 1:
                 // The first char after < can be [a-zA-Z] or _
                 if ($scanner->isLetter($char) || $char == '_') {
                     $state = 2;
                     $ns .= $char;
                     $char = $file->nextChar();
                     // Exception
                 } else {
                     // Unexpected EOF
                     if ($char == false) {
                         throw ExceptionFactory::createUnexpectedEOF(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
                         // Unexpected Char
                     } else {
                         throw ExceptionFactory::createUnexpectedChar(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine(), $char);
                     }
                 }
                 break;
             case 2:
                 // From the second char after < onwards can be [a-zA-Z0-9] or _
                 if ($scanner->isAlpha($char) || $char == '_') {
                     $state = 2;
                     $ns .= $char;
                     $char = $file->nextChar();
                     // If the next char is :, we already have the namespace
                 } elseif ($char == ':') {
                     $state = 3;
                     $char = $file->nextChar();
                     // Exception
                 } else {
                     // Unexpected EOF
                     if ($char == false) {
                         throw ExceptionFactory::createUnexpectedEOF(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
                         // Unexpected Char
                     } else {
                         throw ExceptionFactory::createUnexpectedChar(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine(), $char);
                     }
                 }
                 break;
             case 3:
                 // The first char after : can be [a-zA-Z] or _
                 if ($scanner->isLetter($char) || $char == '_') {
                     $state = 4;
                     $name .= $char;
                     $char = $file->nextChar();
                     // Exception
                 } else {
                     // Unexpected EOF
                     if ($char == false) {
                         throw ExceptionFactory::createUnexpectedEOF(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
                         // Illegal space after :
                     } elseif ($scanner->isSpace($char)) {
                         throw ExceptionFactory::createIllegalSpace(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
                         // Unexpected Char
                     } else {
                         throw ExceptionFactory::createUnexpectedChar(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine(), $char);
                     }
                 }
                 break;
             case 4:
                 // From the second char after : onwards can be [a-zA-Z0-9] or _
                 if ($scanner->isAlpha($char) || $char == '_') {
                     $state = 4;
                     $name .= $char;
                     $char = $file->nextChar();
                     // If the next char is \s, we got the name
                 } elseif ($scanner->isSpace($char)) {
                     break 2;
                     // If the next char is >, we got the T_END
                 } elseif ($char == '>') {
                     $file->goBack();
                     break 2;
                     // Exception
                 } else {
                     // Unexpected EOF
                     if ($char == false) {
                         throw ExceptionFactory::createUnexpectedEOF(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine());
                         // Unexpected Char
                     } else {
                         throw ExceptionFactory::createUnexpectedChar(__FILE__, __LINE__, $file->getFileName(), $file->getCurrentLine(), $char);
                     }
                 }
                 break;
         }
     }
     // Next lookAhead
     $scanner->setLookAhead(Token::T_ATTRIBUTE | Token::T_END | Token::T_CLOSE);
     // T_REGISTER
     if ($ns == 'php' && $name == 'Register') {
         return new TagToken(Token::T_REGISTER, $ns, $name);
     }
     // T_OPEN_TAG token found
     return new TagToken(Token::T_OPEN_TAG, $ns, $name);
 }