0
0
Compiler Designknowledge~6 mins

Finite automata (DFA and NFA) in Compiler Design - Full Explanation

Choose your learning style9 modes available
Introduction
Imagine trying to recognize patterns in text, like checking if a word belongs to a language or not. Finite automata help solve this by providing a simple machine model that reads input step-by-step and decides if the input fits the pattern.
Explanation
Deterministic Finite Automaton (DFA)
A DFA is a machine with a fixed number of states where for each state and input symbol, there is exactly one next state. It reads input symbols one by one, moving through states without any guesswork. If it ends in a special accepting state after reading all input, the input is accepted.
A DFA has exactly one possible move for each input symbol from every state.
Nondeterministic Finite Automaton (NFA)
An NFA is similar to a DFA but allows multiple possible next states for a given state and input symbol, including the option to move without reading any input (epsilon transitions). It accepts input if any possible path leads to an accepting state.
An NFA can have multiple or no moves for an input symbol, including moves without input.
Equivalence of DFA and NFA
Although NFAs seem more flexible, every NFA can be converted into an equivalent DFA that accepts the same language. This means both models recognize exactly the same set of patterns, called regular languages.
DFA and NFA recognize the same languages despite their operational differences.
Components of Finite Automata
Both DFA and NFA consist of states, an input alphabet, transition rules, a start state, and one or more accepting states. These components work together to process input strings and decide acceptance.
Finite automata are defined by states, input symbols, transitions, start, and accepting states.
Real World Analogy

Imagine a maze with rooms (states) and doors (transitions). In a DFA maze, from each room and door color (input), there is only one door to go through. In an NFA maze, some rooms have multiple doors of the same color or even secret passages that don't require a door color. You win if you find a path to the treasure room (accepting state).

Deterministic Finite Automaton (DFA) → Maze where each room has exactly one door of each color leading to the next room
Nondeterministic Finite Automaton (NFA) → Maze where rooms can have multiple doors of the same color or secret passages without doors
Equivalence of DFA and NFA → Both types of mazes can be rearranged so they lead to the same treasure rooms using different paths
Components of Finite Automata → Rooms (states), door colors (input symbols), doors (transitions), starting room (start state), treasure rooms (accepting states)
Diagram
Diagram
┌───────────────┐
│ Start State   │
└──────┬────────┘
       │ a
       ↓
┌───────────────┐       ┌───────────────┐
│ State 1       │ ──b─> │ Accept State  │
└───────────────┘       └───────────────┘

DFA example: each input leads to exactly one next state.
A simple DFA diagram showing states and transitions for inputs.
Key Facts
Deterministic Finite Automaton (DFA)A finite automaton with exactly one transition for each input symbol from every state.
Nondeterministic Finite Automaton (NFA)A finite automaton that can have multiple or zero transitions for an input symbol, including epsilon moves.
Accepting StateA state in a finite automaton where input is accepted if the machine stops there.
TransitionA rule that moves the automaton from one state to another based on input.
Regular LanguageA set of strings that can be recognized by some finite automaton.
Code Example
Compiler Design
class DFA:
    def __init__(self, states, alphabet, transition, start, accept):
        self.states = states
        self.alphabet = alphabet
        self.transition = transition
        self.start = start
        self.accept = accept

    def accepts(self, input_str):
        current = self.start
        for symbol in input_str:
            if (current, symbol) in self.transition:
                current = self.transition[(current, symbol)]
            else:
                return False
        return current in self.accept

# Define a DFA that accepts strings ending with 'ab'
states = {'q0', 'q1', 'q2'}
alphabet = {'a', 'b'}
transition = {('q0', 'a'): 'q1', ('q0', 'b'): 'q0',
              ('q1', 'a'): 'q1', ('q1', 'b'): 'q2',
              ('q2', 'a'): 'q1', ('q2', 'b'): 'q0'}
start = 'q0'
accept = {'q2'}
dfa = DFA(states, alphabet, transition, start, accept)

print(dfa.accepts('aab'))  # True
print(dfa.accepts('aba'))  # False
print(dfa.accepts('babab'))  # True
OutputSuccess
Common Confusions
Believing NFAs are more powerful than DFAs because they allow multiple moves.
Believing NFAs are more powerful than DFAs because they allow multiple moves. Both NFAs and DFAs recognize exactly the same languages; NFAs just offer a more flexible way to describe them.
Thinking epsilon transitions in NFAs consume input symbols.
Thinking epsilon transitions in NFAs consume input symbols. Epsilon transitions move between states without reading any input symbol.
Summary
Finite automata are simple machines that read input symbols and decide if the input matches a pattern.
DFAs have exactly one transition per input symbol from each state, while NFAs can have multiple or no transitions, including moves without input.
Despite differences, DFAs and NFAs recognize the same set of languages called regular languages.