protected function lexData()
    {
        if ($this->position == count($this->positions[0]) - 1) {
            $this->addCode(substr($this->code, $this->cursor));
            $this->cursor = $this->end;
            return;
        }

        $position = $this->positions[0][++$this->position];

        while ($position[1] < $this->cursor) {
            if ($this->position == count($this->positions[0]) - 1) {
                return;
            }
            $position = $this->positions[0][++$this->position];
        }

        $this->addCode($text = substr($this->code, $this->cursor, $position[1] - $this->cursor));
        $this->moveCursor($text);
        $this->cursor++;

        if (preg_match(self::REGEX_START, $this->code, $match, null, $this->cursor)) {
            if (isset($match[1])) {

                $this->addCode('<?php /* DIRECTIVE */');
                $this->pushState(self::STATE_DIRECTIVE);
                $this->addCode($match[1]);
                $this->moveCursor($match[1]);

                if (isset($match[2])) {
                    $this->moveCursor(rtrim($match[2], '('));
                    $this->lexExpression();
                }

            } else {

                $this->addCode('<?php /* OUTPUT */');
                $this->pushState(self::STATE_OUTPUT);
                $this->lexExpression();

            }
        }
    }