public function parse()
{
$sequence = new Ast\Selector\Sequence();
$token = $this->lookahead(array(Scanner\Token::IDENTIFIER, Scanner\Token::ID_SELECTOR, Scanner\Token::CLASS_SELECTOR, Scanner\Token::PSEUDO_CLASS, Scanner\Token::PSEUDO_ELEMENT, Scanner\Token::ATTRIBUTE_SELECTOR_START, Scanner\Token::COMBINATOR));
while (isset($token)) {
if ($selector = $this->createSelector($token)) {
$this->read($token->type);
$sequence->simples[] = $selector;
}
switch ($token->type) {
case Scanner\Token::SEPARATOR:
$this->read(Scanner\Token::SEPARATOR);
return $sequence;
case Scanner\Token::PSEUDO_CLASS:
$sequence->simples[] = $this->delegate(PseudoClass::CLASS);
break;
case Scanner\Token::PSEUDO_ELEMENT:
$sequence->simples[] = $this->createPseudoElement($token);
$this->read($token->type);
break;
case Scanner\Token::ATTRIBUTE_SELECTOR_START:
$this->read($token->type);
$sequence->simples[] = $this->delegate(Attribute::CLASS);
break;
case Scanner\Token::COMBINATOR:
case Scanner\Token::WHITESPACE:
$this->read($token->type);
$subSequence = $this->delegate(get_class($this));
/**
* @var Ast\Selector\Sequence $subSequence
*/
$sequence->combinator = $this->createCombinator($token, $subSequence);
return $sequence;
}
if ($this->endOfTokens()) {
$token = NULL;
continue;
}
$token = $this->lookahead(array(Scanner\Token::ID_SELECTOR, Scanner\Token::CLASS_SELECTOR, Scanner\Token::PSEUDO_CLASS, Scanner\Token::PSEUDO_ELEMENT, Scanner\Token::ATTRIBUTE_SELECTOR_START, Scanner\Token::COMBINATOR, Scanner\Token::WHITESPACE, Scanner\Token::SEPARATOR));
}
return $sequence;
}