Differences
This shows you the differences between two versions of the page.
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). |