def toDFA(self): newStates = [] initialState = self.getInitialState() newStates.append( '|'.join( list( map(lambda x: x.label, self.clausura(initialState) ) ) ) ) alphabet = self.alphabet.split(',') stableTable = [] x = 0 for state in newStates: stableTable.append([None]*len(alphabet)) y = 0 for a in alphabet: stateTo = getStateTo(self, state, a) if(stateTo): stableTable[x][y] = stateTo newStates.append(stateTo) y = y+1 x = x+1 newDFA = DFA(self.name+"-toDFA", alphabet) newDFA.addState(normalizeState(newStates[0]), True) for i in range(1, len(newStates)): newDFA.addState(normalizeState(newStates[i]), False, lookForFinal(self, newStates[i])) for i in range( len(newStates) ): for j in range( len(stableTable[i]) ): if(stableTable[i][j]): newDFA.addTransition(alphabet[j], normalizeState(newStates[i]), normalizeState( stableTable[i][j]) ) return newDFA
def _NumberDFA(): dfa = DFA() dfa.addStates(["number_0", "NUMBER"]) dfa.state = dfa.states[0] dfa.final = dfa.states[-1] dfa.addTransition("number_0", "NUMBER", DIGITS) dfa.addTransition("NUMBER", "NUMBER", DIGITS) return dfa
def _IdentifierDFA(): dfa = DFA() dfa.addStates(["id0", "idfin"]) dfa.state = dfa.states[0] dfa.final = dfa.states[-1] dfa.addTransition("id0", "idfin", LETTERS + "_") dfa.addTransition("idfin", "idfin", DIGITS + LETTERS + "_") return dfa
def createDFA(): newDFA = DFA("newDFA", alphabet) print("nodes addState") for node in nodeList: newDFA.addState(str(node.label.text()), node.first, node.final) for con in conList: newDFA.addTransition(str(con.name), str(con.node.label.text()), str(con.nextNode.label.text())) return newDFA
def _LineCommentDFA(): dfa = DFA() dfa.addStates(["lc0", "lc1", "lcloop", "lcfin"]) dfa.state = dfa.states[0] dfa.setFinal("lcfin") dfa.addTransition("lc0", "lc1", "-") dfa.addTransition("lc1", "lcloop", "-") dfa.addTransition("lcloop", "lcloop", LETTERS + DIGITS + OTHERS + " \t") dfa.addTransition("lcloop", "lcfin", "\n") return dfa
def toDFA(self): newStates = [] initialState = self.getInitialState() newStates.append(initialState.label) alphabet = self.alphabet.split(',') stateTable = [] x = 0 stateTmp = '' for state in newStates: stateTable.append([None] * len(alphabet)) y = 0 for a in alphabet: print("ALPHAB ", a, " state ", state, " -- ", stateTmp) if stateTmp != state: stateTo = getStateTo(self, state, a) if stateTo: print("YES") stateTmp = state stateTable[x][y] = stateTo newStates.append(stateTo) y = y + 1 x = x + 1 newDFA = DFA(self.name + "-toDFA", alphabet) newDFA.addState(normalizeState(newStates[0]), True) for i in range(1, len(newStates)): newDFA.addState(normalizeState(newStates[i]), False, lookForFinal(self, newStates[i])) for i in range(len(stateTable)): for j in range(len(stateTable[i])): if (stateTable[i][j]): newDFA.addTransition(alphabet[j], normalizeState(newStates[i]), normalizeState(stateTable[i][j])) return newDFA
def _MultiLineCommentDFA(): dfa = DFA() dfa.addStates(["q0", "q1", "q2", "q3", "qloop", "q4", "q5"]) dfa.state = "q0" dfa.setFinal("q5") dfa.addTransition("q0", "q1", "-") dfa.addTransition("q1", "q2", "-") dfa.addTransition("q2", "q3", "[") dfa.addTransition("q3", "qloop", "[") loopchars = (LETTERS + DIGITS + OTHERS + " \t\n\r").replace("]", "") dfa.addTransition("qloop", "qloop", loopchars) dfa.addTransition("qloop", "q4", "]") dfa.addTransition("q4", "qloop", loopchars) dfa.addTransition("q4", "q5", "]") return dfa
def _LiteralDFA(): dfa = DFA() dfa.addStates(["l0", "lloop", "lescape", "lfin"]) dfa.state = dfa.states[0] dfa.setFinal("lfin") dfa.addTransition("l0", "lloop", "\"") loopchars = (LETTERS + DIGITS + OTHERS + " \n\r\t").replace("\\", "").replace("\"", "") dfa.addTransition("lloop", "lloop", loopchars) dfa.addTransition("lloop", "lescape", "\\") dfa.addTransition("l0", "lescape", "\\") dfa.addTransition("lescape", "lloop", "ntr\"\'\\") dfa.addTransition("lloop", "lfin", "\"") return dfa