1<?php declare(strict_types=1);
2
3namespace PhpParser;
4
5use PhpParser\Parser\Php7;
6use PhpParser\Parser\Php8;
7
8class ParserFactory {
9    /**
10     * Create a parser targeting the given version on a best-effort basis. The parser will generally
11     * accept code for the newest supported version, but will try to accommodate code that becomes
12     * invalid in newer versions or changes in interpretation.
13     */
14    public function createForVersion(PhpVersion $version): Parser {
15        if ($version->isHostVersion()) {
16            $lexer = new Lexer();
17        } else {
18            $lexer = new Lexer\Emulative($version);
19        }
20        if ($version->id >= 80000) {
21            return new Php8($lexer, $version);
22        }
23        return new Php7($lexer, $version);
24    }
25
26    /**
27     * Create a parser targeting the newest version supported by this library. Code for older
28     * versions will be accepted if there have been no relevant backwards-compatibility breaks in
29     * PHP.
30     */
31    public function createForNewestSupportedVersion(): Parser {
32        return $this->createForVersion(PhpVersion::getNewestSupported());
33    }
34
35    /**
36     * Create a parser targeting the host PHP version, that is the PHP version we're currently
37     * running on. This parser will not use any token emulation.
38     */
39    public function createForHostVersion(): Parser {
40        return $this->createForVersion(PhpVersion::getHostVersion());
41    }
42}
43