Chris@0: self::S_OPENPARENTHESIS, Chris@0: ')' => self::S_CLOSEPARENTHESIS, Chris@0: '<' => self::S_LOWERTHAN, Chris@0: '>' => self::S_GREATERTHAN, Chris@0: '[' => self::S_OPENBRACKET, Chris@0: ']' => self::S_CLOSEBRACKET, Chris@0: ':' => self::S_COLON, Chris@0: ';' => self::S_SEMICOLON, Chris@0: '@' => self::S_AT, Chris@0: '\\' => self::S_BACKSLASH, Chris@0: '/' => self::S_SLASH, Chris@0: ',' => self::S_COMMA, Chris@0: '.' => self::S_DOT, Chris@0: '"' => self::S_DQUOTE, Chris@0: '-' => self::S_HYPHEN, Chris@0: '::' => self::S_DOUBLECOLON, Chris@0: ' ' => self::S_SP, Chris@0: "\t" => self::S_HTAB, Chris@0: "\r" => self::S_CR, Chris@0: "\n" => self::S_LF, Chris@0: "\r\n" => self::CRLF, Chris@0: 'IPv6' => self::S_IPV6TAG, Chris@0: '{' => self::S_OPENQBRACKET, Chris@0: '}' => self::S_CLOSEQBRACKET, Chris@0: '' => self::S_EMPTY, Chris@0: '\0' => self::C_NUL, Chris@0: ); Chris@0: Chris@0: protected $hasInvalidTokens = false; Chris@0: Chris@0: protected $previous; Chris@0: Chris@0: public function reset() Chris@0: { Chris@0: $this->hasInvalidTokens = false; Chris@0: parent::reset(); Chris@0: } Chris@0: Chris@0: public function hasInvalidTokens() Chris@0: { Chris@0: return $this->hasInvalidTokens; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param $type Chris@0: * @throws \UnexpectedValueException Chris@0: * @return boolean Chris@0: */ Chris@0: public function find($type) Chris@0: { Chris@0: $search = clone $this; Chris@0: $search->skipUntil($type); Chris@0: Chris@0: if (!$search->lookahead) { Chris@0: throw new \UnexpectedValueException($type . ' not found'); Chris@0: } Chris@0: return true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * getPrevious Chris@0: * Chris@0: * @return array token Chris@0: */ Chris@0: public function getPrevious() Chris@0: { Chris@0: return $this->previous; Chris@0: } Chris@0: Chris@0: /** Chris@0: * moveNext Chris@0: * Chris@0: * @return boolean Chris@0: */ Chris@0: public function moveNext() Chris@0: { Chris@0: $this->previous = $this->token; Chris@0: Chris@0: return parent::moveNext(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Lexical catchable patterns. Chris@0: * Chris@0: * @return string[] Chris@0: */ Chris@0: protected function getCatchablePatterns() Chris@0: { Chris@0: return array( Chris@0: '[a-zA-Z_]+[46]?', //ASCII and domain literal Chris@0: '[^\x00-\x7F]', //UTF-8 Chris@0: '[0-9]+', Chris@0: '\r\n', Chris@0: '::', Chris@0: '\s+?', Chris@0: '.', Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Lexical non-catchable patterns. Chris@0: * Chris@0: * @return string[] Chris@0: */ Chris@0: protected function getNonCatchablePatterns() Chris@0: { Chris@0: return array('[\xA0-\xff]+'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Retrieve token type. Also processes the token value if necessary. Chris@0: * Chris@0: * @param string $value Chris@0: * @throws \InvalidArgumentException Chris@0: * @return integer Chris@0: */ Chris@0: protected function getType(&$value) Chris@0: { Chris@0: if ($this->isNullType($value)) { Chris@0: return self::C_NUL; Chris@0: } Chris@0: Chris@0: if ($this->isValid($value)) { Chris@0: return $this->charValue[$value]; Chris@0: } Chris@0: Chris@0: if ($this->isUTF8Invalid($value)) { Chris@0: $this->hasInvalidTokens = true; Chris@0: return self::INVALID; Chris@0: } Chris@0: Chris@0: return self::GENERIC; Chris@0: } Chris@0: Chris@0: protected function isValid($value) Chris@0: { Chris@0: if (isset($this->charValue[$value])) { Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param $value Chris@0: * @return bool Chris@0: */ Chris@0: protected function isNullType($value) Chris@0: { Chris@0: if ($value === "\0") { Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param $value Chris@0: * @return bool Chris@0: */ Chris@0: protected function isUTF8Invalid($value) Chris@0: { Chris@0: if (preg_match('/\p{Cc}+/u', $value)) { Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: Chris@0: protected function getModifiers() Chris@0: { Chris@0: return 'iu'; Chris@0: } Chris@0: }