Passed
Push — master ( c01dfe...f39ce2 )
by Edward
04:04
created

NfaReverser::reverseDfa()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

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