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];
- }
- }
|