public static function generate($query, $type = 'parser')
{
/**
* Lexer used for tokenizing the query.
*
* @var Lexer $lexer
*/
$lexer = new Lexer($query);
/**
* Parsed used for analyzing the query.
* A new instance of parser is generated only if the test requires.
*
* @var Parser $parser
*/
$parser = $type === 'parser' ? new Parser($lexer->list) : null;
/**
* Lexer's errors.
*
* @var array $lexerErrors
*/
$lexerErrors = array();
/**
* Parser's errors.
*
* @var array $parserErrors
*/
$parserErrors = array();
// Both the lexer and the parser construct exception for errors.
// Usually, exceptions contain a full stack trace and other details that
// are not required.
// The code below extracts only the relevant information.
// Extracting lexer's errors.
if (!empty($lexer->errors)) {
foreach ($lexer->errors as $err) {
$lexerErrors[] = array($err->getMessage(), $err->ch, $err->pos, $err->getCode());
}
$lexer->errors = array();
}
// Extracting parser's errors.
if (!empty($parser->errors)) {
foreach ($parser->errors as $err) {
$parserErrors[] = array($err->getMessage(), $err->token, $err->getCode());
}
$parser->errors = array();
}
return array('query' => $query, 'lexer' => $lexer, 'parser' => $parser, 'errors' => array('lexer' => $lexerErrors, 'parser' => $parserErrors));
}