You are browsing a version that is no longer maintained.

Simple Parser Example

Extend the Doctrine\Common\Lexer\AbstractLexer class and implement the getCatchablePatterns, getNonCatchablePatterns, and getType methods. Here is a very simple example lexer implementation named CharacterTypeLexer. It tokenizes a string to T_UPPER, T_LOWER andT_NUMBER tokens:

<?phpuse Doctrine\Common\Lexer\AbstractLexer;class CharacterTypeLexer extends AbstractLexer{    const T_UPPER =  1;    const T_LOWER =  2;    const T_NUMBER = 3;    protected function getCatchablePatterns()    {        return array(            '[a-bA-Z0-9]',        );    }    protected function getNonCatchablePatterns()    {        return array();    }    protected function getType(&$value)    {        if (is_numeric($value)) {            return self::T_NUMBER;        }        if (strtoupper($value) === $value) {            return self::T_UPPER;        }        if (strtolower($value) === $value) {            return self::T_LOWER;        }    }}

Use CharacterTypeLexer to extract an array of upper case characters:

<?phpclass UpperCaseCharacterExtracter{    private $lexer;    public function __construct(CharacterTypeLexer $lexer)    {        $this->lexer = $lexer;    }    public function getUpperCaseCharacters($string)    {        $this->lexer->setInput($string);        $this->lexer->moveNext();        $upperCaseChars = array();        while (true) {            if (!$this->lexer->lookahead) {                break;            }            $this->lexer->moveNext();            if ($this->lexer->token['type'] === CharacterTypeLexer::T_UPPER) {                $upperCaseChars[] = $this->lexer->token['value'];            }        }        return $upperCaseChars;    }}$upperCaseCharacterExtractor = new UpperCaseCharacterExtracter(new CharacterTypeLexer());$upperCaseCharacters = $upperCaseCharacterExtractor->getUpperCaseCharacters('1aBcdEfgHiJ12');print_r($upperCaseCharacters);

The variable $upperCaseCharacters contains all of the upper case characters:

Array(    [0] => B    [1] => E    [2] => H    [3] => J)

This is a simple example but it should demonstrate the low level API that can be used to build more complex parsers.