File: inspecttransitions.cc

package info (click to toggle)
bisonc%2B%2B 6.09.02-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,984 kB
  • sloc: cpp: 9,375; ansic: 1,505; fortran: 1,134; makefile: 1,062; sh: 526; yacc: 84; lex: 60
file content (46 lines) | stat: -rw-r--r-- 1,904 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "state.ih"

// All Next objects in the state's d_nextVector are inspected. The Next 
// objects hold 
//  - the state index of a state to transfer to from the current state
//  - a size_t vector of item transitions. Each element is the index of an
//    item in the current state (the source-item), its index is the index of a
//    (kernel) item of the state to transfer to (the destination index).
// If the LA set of the destination item is enlarged using the LA set of the
// source item then then the LA sets of the destination state's items must be
// recomputed. This is realized by inserting the destation state's index into
// the `todo' set.

void State::inspectTransitions(set<size_t> &todo)
{
    for (Next const &next: d_nextVector)
    {
        size_t nextStateIdx = next.next();
    
        if (nextStateIdx == string::npos)       // no transitions: try the
            continue;                           // next Next object

                                                // state to transfer to
        State &nextState = *s_state[nextStateIdx];
    
                                                // visit all source-destination
        for (                                   // item pairs
            size_t nextIdx = 0, end = next.kernel().size(); 
                nextIdx != end; 
                    ++nextIdx
        )                                   // if the dest. item's LA set is 
        {                                   // enlarged, recompute the LA sets 
            if (                            // of the dest. state's items.
                nextState.d_itemVector[nextIdx].enlargeLA(
                    d_itemVector[next.kernel()[nextIdx]].lookaheadSet()
                )
            )
                todo.insert(nextStateIdx); // kernel items were enlarged then
                                    // recompute its LA sets
        }
    }
}