Пример #1
0
def compute_with_target_gen(target, nfa):
    _, start, trans = nfa
    trace = compute_tr_with_target(start, target, nfa)
    for S in trace[1:]:
        yield S
    while True:
        trace = compute_tr_with_target(target, target, nfa)
        for S in trace[1:]:
            yield S
Пример #2
0
def compute_with_target_gen(target, nfa):
    _, start, trans = nfa
    trace = compute_tr_with_target(start, target, nfa)
    for S in trace[1:]:
        yield S
    while True:
        trace = compute_tr_with_target(target, target, nfa)
        for S in trace[1:]:
            yield S
Пример #3
0
def compute_minimal_state_traces(nfa):
    _, start, trans = nfa
    states = set()
    traces = []
    for S in trans:
        if S == start:
            continue
        T1 = compute_tr_with_target(start, S, nfa)
        if (FIN, "-", start[0]) in trans[S]:
            traces.append(T1[1:])
        else:
            T2 = compute_tr_with_target(S, (FIN, FEX, 0, start[0]), nfa)
            T = T1[1:] + T2[1:-1]
            traces.append(T)
    return traces
Пример #4
0
def compute_minimal_state_traces(nfa):
    _, start, trans = nfa
    states = set()
    traces = []
    for S in trans:
        if S == start:
            continue
        T1 = compute_tr_with_target(start, S, nfa)
        if (FIN, '-', start[0]) in trans[S]:
            traces.append(T1[1:])
        else:
            T2 = compute_tr_with_target(S, (FIN, FEX, 0, start[0]), nfa)
            T = T1[1:] + T2[1:-1]
            traces.append(T)
    return traces
Пример #5
0
def compute_super_tr(langlet, start_state, state_traces, segtree, running_cycle, start_symbols=None):
    nid = start_state[0]
    nfa = langlet.parse_nfa.nfas[nid]
    cyclic = compute_in_cycle(nfa)
    trace = []
    if not start_symbols:
        start_symbols = langlet.parse_nfa.start_symbols[1]
    for S in cyclic:
        if is_symbol(S[0]):
            cycle_gen = compute_with_target_gen(S, nfa)
            while True:
                state = cycle_gen.next()
                if is_symbol(state[0]):
                    tr = _compute_next_tr(langlet, state, state_traces, segtree, start_symbols)
                    if tr:
                        trace += tr
                    else:
                        trace.append(state)
                        if state == S:
                            # compute tail
                            trace += compute_tr_with_target(S, (FIN, FEX, 0, nid), nfa)[1:-1]
                            break
                else:
                    trace.append(state)
    return trace
Пример #6
0
def compute_super_tr(langlet,
                     start_state,
                     state_traces,
                     segtree,
                     running_cycle,
                     start_symbols=None):
    nid = start_state[0]
    nfa = langlet.parse_nfa.nfas[nid]
    cyclic = compute_in_cycle(nfa)
    trace = []
    if not start_symbols:
        start_symbols = langlet.parse_nfa.start_symbols[1]
    for S in cyclic:
        if is_symbol(S[0]):
            cycle_gen = compute_with_target_gen(S, nfa)
            while True:
                state = cycle_gen.next()
                if is_symbol(state[0]):
                    tr = _compute_next_tr(langlet, state, state_traces,
                                          segtree, start_symbols)
                    if tr:
                        trace += tr
                    else:
                        trace.append(state)
                        if state == S:
                            # compute tail
                            trace += compute_tr_with_target(
                                S, (FIN, FEX, 0, nid), nfa)[1:-1]
                            break
                else:
                    trace.append(state)
    return trace