| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | <?php declare(strict_types=1);namespace PhpParser\Parser;use PhpParser\Error;use PhpParser\ErrorHandler;use PhpParser\Parser;class Multiple implements Parser{    /** @var Parser[] List of parsers to try, in order of preference */    private $parsers;    /**     * Create a parser which will try multiple parsers in an order of preference.     *     * Parsers will be invoked in the order they're provided to the constructor. If one of the     * parsers runs without throwing, it's output is returned. Otherwise the exception that the     * first parser generated is thrown.     *     * @param Parser[] $parsers     */    public function __construct(array $parsers) {        $this->parsers = $parsers;    }    public function parse(string $code, ErrorHandler $errorHandler = null) {        if (null === $errorHandler) {            $errorHandler = new ErrorHandler\Throwing;        }        list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code);        if ($firstError === null) {            return $firstStmts;        }        for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) {            list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code);            if ($error === null) {                return $stmts;            }        }        throw $firstError;    }    private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) {        $stmts = null;        $error = null;        try {            $stmts = $parser->parse($code, $errorHandler);        } catch (Error $error) {}        return [$stmts, $error];    }}
 |