Example #1
0
def build_LR0_automaton(G: Grammar):
    assert len(G.startSymbol.productions) == 1, 'Grammar must be augmented'

    start_production = G.startSymbol.productions[0]
    start_item = Item(start_production, 0)

    automaton = State(start_item, True)

    pending = [start_item]
    visited = {start_item: automaton}

    while pending:
        current_item = pending.pop()
        if current_item.IsReduceItem:
            continue

        current_state = visited[current_item]
        next_symbol = current_item.NextSymbol
        next_item = current_item.NextItem()

        #- $(X --> a.cB) ---c---> (X --> ac.B)  con c in V_T
        #- $(X --> a.YB) ---Y---> (X --> aY.B)  con Y in V_N
        next_state = get_state(visited, pending, next_item)
        current_state.add_transition(next_symbol.Name, next_state)

        if next_symbol in G.nonTerminals:
            sym_productions = G.symbDict[next_symbol.Name].productions
            #- $(X --> a.YB) ---e---> (Y --> .Z)  con Y in V_N
            for pr in [Item(x, 0) for x in sym_productions]:
                trans_state = get_state(visited, pending, pr)
                current_state.add_epsilon_transition(trans_state)

    return automaton.to_deterministic(lr0_formatter)
Example #2
0
 def _build_automaton(self):
     start = State('start')
     automatons = self.regexs
     for i in automatons:
         start.add_epsilon_transition(i)
     final = start.to_deterministic()
     return final
Example #3
0
    def _build_automaton(self):
        start = State('start')
        regexs = self.regexs

        for regex in regexs:
            start.add_epsilon_transition(regex)

        return start.to_deterministic()
Example #4
0
    def _build_automaton(self):
        start = State('start')
        for automaton in self.regexs:
            start.add_epsilon_transition(automaton)

        return start.to_deterministic()
 def _build_automaton(self):
     start = State('start')
     # Your code here!!!
     for x in self.regexs:
         start.add_epsilon_transition(self.regexs[x])
     return start.to_deterministic()