NfaReverser::reverseNfa()   A
last analyzed

Complexity

Conditions 6
Paths 18

Size

Total Lines 25
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 15
nc 18
nop 1
dl 0
loc 25
rs 9.2222
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Remorhaz\UniLex\RegExp\FSM;
6
7
final class NfaReverser
8
{
9
    public function reverseNfa(Nfa $sourceNfa): Nfa
10
    {
11
        $targetNfa = new Nfa();
12
        $targetNfa->setSymbolTable($sourceNfa->getSymbolTable());
13
        $sourceStateMap = $sourceNfa->getStateMap();
14
        $targetStateMap = $targetNfa->getStateMap();
15
        foreach ($sourceStateMap->getStateList() as $stateId) {
16
            $targetStateMap->importState($sourceStateMap->getStateValue($stateId), $stateId);
17
        }
18
        $targetStateMap->addFinishState(...$sourceStateMap->getStartStateList());
19
        $targetStateMap->addStartState(...$sourceStateMap->getFinishStateList());
20
21
        foreach ($sourceNfa->getEpsilonTransitionMap()->getTransitionList() as $sourceStateId => $targetStates) {
22
            foreach ($targetStates as $targetStateId => $value) {
23
                $targetNfa->getEpsilonTransitionMap()->addTransition($targetStateId, $sourceStateId, $value);
24
            }
25
        }
26
27
        foreach ($sourceNfa->getSymbolTransitionMap()->getTransitionList() as $sourceStateId => $targetStates) {
28
            foreach ($targetStates as $targetStateId => $value) {
29
                $targetNfa->getSymbolTransitionMap()->addTransition($targetStateId, $sourceStateId, $value);
30
            }
31
        }
32
33
        return $targetNfa;
34
    }
35
36
    public function reverseDfa(Dfa $sourceDfa): Nfa
37
    {
38
        $targetNfa = new Nfa();
39
        $targetNfa->setSymbolTable($sourceDfa->getSymbolTable());
40
        $sourceStateMap = $sourceDfa->getStateMap();
41
        $targetStateMap = $targetNfa->getStateMap();
42
        foreach ($sourceStateMap->getStateList() as $stateId) {
43
            $targetStateMap->importState($sourceStateMap->getStateValue($stateId), $stateId);
44
        }
45
        $targetStateMap->addFinishState(...$sourceStateMap->getStartStateList());
46
        $targetStateMap->addStartState(...$sourceStateMap->getFinishStateList());
47
48
        foreach ($sourceDfa->getTransitionMap()->getTransitionList() as $sourceStateId => $targetStates) {
49
            foreach ($targetStates as $targetStateId => $value) {
50
                $targetNfa->getSymbolTransitionMap()->addTransition($targetStateId, $sourceStateId, $value);
51
            }
52
        }
53
54
        return $targetNfa;
55
    }
56
}
57