Пример #1
0
 public function testLetter()
 {
     $scanner = new Scanner(new File(FILES_DIR . 'empty_file'));
     $this->assertFalse($scanner->isLetter(''));
     $this->assertFalse($scanner->isLetter('-'));
     $this->assertFalse($scanner->isLetter(9));
     $this->assertFalse($scanner->isLetter('9'));
     $this->assertTrue($scanner->isLetter('a'));
     $this->assertTrue($scanner->isLetter('A'));
 }
Пример #2
0
 public static function parse(Scanner $scanner)
 {
     $file = $scanner->getFile();
     $char = $file->nextChar();
     $state = 0;
     $value = '';
     while (true) {
         switch ($state) {
             case 0:
                 // T_ATTRIBUTE begins with [a-zA-Z] or _
                 if ($scanner->isLetter($char) || $char == '_') {
                     $state = 1;
                     $value .= $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 1:
                 // The second char can be [a-zA-Z0-9] or _
                 if ($scanner->isAlpha($char) || $char == '_') {
                     $state = 1;
                     $value .= $char;
                     $char = $file->nextChar();
                     // Space indicates the end of the T_ATTRIBUTE
                     // But we have to eat the next = char
                 } elseif ($scanner->isSpace($char)) {
                     $state = 2;
                     $char = $scanner->nextChar();
                     // If the next char is =, we're done
                 } elseif ($char == '=') {
                     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;
             case 2:
                 // If the next char is =, we're done
                 if ($char == '=') {
                     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_VALUE);
     // T_ATTRIBUTE token found
     return new SimpleToken(Token::T_ATTRIBUTE, $value);
 }
Пример #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);
 }