packages/sql-faker/src/Grammar/Model/TerminalInventory.php

1<?php
2
3declare(strict_types=1);
4
5namespace SqlFaker\Grammar\Model;
6
7/**
8 * Extracts every terminal required by a compiled grammar resource.
9 *
10 * @visibility root
11 */
12final class TerminalInventory
13{
14    /**
15     * @return list<string>
16     */
17    public static function fromGrammar(Grammar $grammar): array
18    {
19        $terminals = [];
20        foreach ($grammar->ruleMap as $rule) {
21            foreach ($rule->alternatives as $production) {
22                foreach ($production->symbols as $symbol) {
23                    if ($symbol instanceof Terminal) {
24                        $terminals[$symbol->value] = $symbol->value;
25                    } elseif ($symbol instanceof NonTerminal && !isset($grammar->ruleMap[$symbol->value])) {
26                        $terminals[$symbol->value] = $symbol->value;
27                    }
28                }
29            }
30        }
31
32        $result = array_keys($terminals);
33        sort($result);
34
35        return $result;
36    }
37}
38