Test Failed
Push — master ( 690100...f55788 )
by Kirill
09:19
created

Frontend::bypass()   B

Complexity

Conditions 7
Paths 17

Size

Total Lines 39

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
nc 17
nop 2
dl 0
loc 39
rs 8.3626
c 0
b 0
f 0
1
<?php
2
/**
3
 * This file is part of Railt package.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
declare(strict_types=1);
9
10
namespace Railt\SDL\Frontend;
11
12
use Psr\Log\LoggerAwareInterface;
13
use Psr\Log\LoggerAwareTrait;
14
use Psr\Log\LoggerInterface;
15
use Railt\Io\Readable;
16
use Railt\Parser\Ast\RuleInterface;
17
use Railt\Parser\Exception\UnexpectedTokenException;
18
use Railt\Parser\Exception\UnrecognizedTokenException;
19
use Railt\SDL\Exception\CompilerException;
20
use Railt\SDL\Exception\SyntaxException;
21
use Railt\SDL\IR\Definition;
22
23
/**
24
 * Class Frontend
25
 */
26
class Frontend implements LoggerAwareInterface
27
{
28
    use LoggerAwareTrait;
29
30
    /**
31
     * @var Parser
32
     */
33
    private $parser;
34
35
    /**
36
     * @var Builder
37
     */
38
    private $builder;
39
40
    /**
41
     * Frontend constructor.
42
     */
43
    public function __construct()
44
    {
45
        $this->parser = new Parser();
46
        $this->builder = new Builder();
47
    }
48
49
    /**
50
     * @param Readable $readable
51
     * @return mixed|null
52
     * @throws SyntaxException
53
     * @throws CompilerException
54
     */
55
    public function load(Readable $readable)
56
    {
57
        $ast = $this->parse($readable);
58
59
        return $this->builder->reduce($readable, $ast);
60
    }
61
62
    /**
63
     * Parse the file using top-down parser and
64
     * return the Abstract Syntax Tree.
65
     *
66
     * @param Readable $file
67
     * @return RuleInterface
68
     * @throws SyntaxException
69
     */
70
    private function parse(Readable $file): RuleInterface
71
    {
72
        try {
73
            return $this->parser->parse($file);
74
        } catch (UnexpectedTokenException | UnrecognizedTokenException $e) {
75
            $error = new SyntaxException($e->getMessage(), $e->getCode());
76
            $error->throwsIn($file, $e->getLine(), $e->getColumn());
77
78
            throw $error;
79
        }
80
    }
81
82
    /**
83
     * @param LoggerInterface $logger
84
     * @return Frontend
85
     */
86
    public function setLogger(LoggerInterface $logger): self
87
    {
88
        $this->logger = $logger;
89
90
        return $this;
91
    }
92
}
93