public function testUntil() { $lexer = new Lexer('foo and bar "string\\"end".'); $this->assertEquals('foo and bar ', $lexer->until(Tokens::T_DOUBLE_QUOTE)); $lexer->match(Tokens::T_DOUBLE_QUOTE); $this->assertEquals('string\\"end', $lexer->until(Tokens::T_DOUBLE_QUOTE)); $lexer->match(Tokens::T_DOUBLE_QUOTE); $lexer = new Lexer('((abc def) (ghi))'); $this->assertEquals('(', $lexer->match(Tokens::T_COMPOSITE_BEGIN)); $this->assertEquals('(', $lexer->match(Tokens::T_COMPOSITE_BEGIN)); $this->assertEquals('abc', $lexer->until(array(Tokens::T_COMPOSITE_END, Tokens::T_COMPOSITE_SEPARATOR))); $this->assertEquals(' ', $lexer->match(Tokens::T_COMPOSITE_SEPARATOR)); $this->assertEquals('def', $lexer->until(array(Tokens::T_COMPOSITE_END, Tokens::T_COMPOSITE_SEPARATOR))); $this->assertEquals(')', $lexer->match(Tokens::T_COMPOSITE_END)); $this->assertEquals(' ', $lexer->match(Tokens::T_COMPOSITE_SEPARATOR)); $this->assertEquals('(', $lexer->match(Tokens::T_COMPOSITE_BEGIN)); $this->assertEquals('ghi', $lexer->until(array(Tokens::T_COMPOSITE_END, Tokens::T_COMPOSITE_SEPARATOR))); $this->assertEquals(')', $lexer->match(Tokens::T_COMPOSITE_END)); $this->assertEquals(')', $lexer->match(Tokens::T_COMPOSITE_END)); $this->assertTrue($lexer->isEol()); }
protected function parseCollection(Lexer $lexer) { $lexer->match(Tokens::T_COLLECTION_BEGIN); $depth = 1; $values = array(1 => array()); do { if ($lexer->isNextToken(Tokens::T_COLLECTION_BEGIN)) { $depth++; $lexer->match(Tokens::T_COLLECTION_BEGIN); $values[$depth] = array(); continue; } else { if ($lexer->isNextToken(Tokens::T_COLLECTION_END)) { $depth--; $lexer->match(Tokens::T_COLLECTION_END); if (0 == $depth) { break; } // merge closed level values into upper level $values[$depth][] = $values[$depth + 1]; } else { if ($lexer->isNextToken(Tokens::T_COLLECTION_SEPARATOR)) { $lexer->match(Tokens::T_COLLECTION_SEPARATOR); } } } // $literal = $lexer->until(array(Tokens::T_COLLECTION_SEPARATOR, Tokens::T_COLLECTION_END)); $values[$depth][] = $this->parseLiteral($this->createLexer($literal)); } while (!$lexer->isEol()); return $values[1]; }