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

NfaReverser   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 28
dl 0
loc 49
rs 10
c 1
b 0
f 0
wmc 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A reverseNfa() 0 25 6
A reverseDfa() 0 19 4
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