Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
lfa:2024:lab05 [2024/11/04 09:57]
stefan.sterea
lfa:2024:lab05 [2024/11/04 11:58] (current)
stefan.sterea
Line 31: Line 31:
   * ''​generatesEpsilon():​ bool''​ returns whether or not the initial state is a final state   * ''​generatesEpsilon():​ bool''​ returns whether or not the initial state is a final state
   * ''​toggleEpsilon(final:​ bool): NFA'' ​ returns the same NFA, but makes ''​initState()''​ final or non-final based on the parameter ''​final''​   * ''​toggleEpsilon(final:​ bool): NFA'' ​ returns the same NFA, but makes ''​initState()''​ final or non-final based on the parameter ''​final''​
-  * ''​merge(nfa2:​ NFA): NFA'' ​ returns an NFA constructed from this one by replacing all transitions to and/or from ''​endState()'' ​with transitions to and/or from ''​nfa2.initState()''​, deleting ​the  ​current ''​endState()''​ and replacing it with ''​nfa2.endState()''​unless ​they are the same state, in which case it is replaced with ''​nfa2.initState()''​ +  * ''​merge(nfa2:​ NFA): NFA'' ​ returns an NFA constructed from this one and ''​nfa2''​ where ''​endState()''​ and ''​initState()'' ​are merged together into a single state; ​the new end state will be ''​nfa2.endState()''​ unless ​it's been merged, in which case it will be the new merged state
-  * ''​adjoin(nfa2:​ NFA): NFA''​ returns an NFA constructed from this one by replacing all transitions from ''​nfa2.initState()''​ with transitions from ''​initState()'' ​and all transitions to ''​nfa2.endState()'' ​with transitions to ''​endState()'',​ then deleting ''​nfa2.initState()''​ and ''​nfa2.endState()''​; ''​initState()'' ​and ''​endState()''​ remain ​the same+  * ''​adjoin(nfa2:​ NFA): NFA''​ returns an NFA constructed from this one and ''​nfa2'' ​by merging the ''​initState()''​s together ​and the ''​endState()''​s together into 2 new states that will be the init state and end state of the new NFA.
  
 Using only these operations to create NFAs from other NFAs, try to find a recursive algorithm to convert a Regular Expression to an NFA without epsilon-transitions. Discuss base cases, construction steps and justify them. It may be useful to consider some invariants of the algorithm (one such invariant is, of course, the lack of epsilon-transitions,​ which explains the names of the ''​generatesEpsilon''​ and ''​toggleEpsilon''​ methods). Using only these operations to create NFAs from other NFAs, try to find a recursive algorithm to convert a Regular Expression to an NFA without epsilon-transitions. Discuss base cases, construction steps and justify them. It may be useful to consider some invariants of the algorithm (one such invariant is, of course, the lack of epsilon-transitions,​ which explains the names of the ''​generatesEpsilon''​ and ''​toggleEpsilon''​ methods).