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