Grammar for Automata
The here introduced grammar describes the exact syntax of how to write automata by hand. It can either be used to write an automaton in a normal text file or when creating a new automaton within the tool.In that context we use a slightly modified version of the EBNF notation, say EBNF*, with the following conventions:
- Nonterminals are written in plain text.
- Terminals are written in blue color.
- An optional element is indicated by surrounding squared brackets [ and ].
- A repetition element (can occur arbitrarily often, including zero times) is indicated by surrounding curly braces { and }.
- A permutation element is indicated by ∏ and surrounding brackets ( and ).
Grammar in EBNF* notation:
| automaton_grammar | ::= | dfa | nfa | ||
| dfa | ::= | DFA [automaton_name] = { dfa_stage } | ||
| nfa | ::= | NFA [automaton_name] = { nfa_stage } | ||
| dfa_stage | ::= | ∏([states] mandatory_choice_d initial_state [final_states]) | ||
| nfa_stage | ::= | ∏([states] mandatory_choice_nd initial_state [final_states]) | ||
| mandatory_choice_d | ::= | alphabet [transitions_d] | [alphabet] transitions_d | ||
| mandatory_choice_nd | ::= | alphabet [transitions_nd] | [alphabet] transitions_nd | ||
| states | ::= | states = { state {state} } | ||
| alphabet | ::= | alphabet = { entry {entry} } | ||
| transitions_d | ::= | transitions = { {transition_d} } | ||
| transitions_nd | ::= | transitions = { {transition_nd} } | ||
| initial_state | ::= | initial state = state | ||
| final_states | ::= | final states = { {state} } | ||
| state | ::= | state_def {state_def} | ||
| entry | ::= | entry_def {entry_def} | ||
| transition_d | ::= | state - entry -> state | ||
| transition_nd | ::= | state - entry -> set_states_option | ||
| set_states_option | ::= | state | { state {state} } | ||
| automaton_name | ::= | letter { letter | digit | _ | ( | ) | , } | ||
| state_def | ::= | letter | digit | _ | ( | ) | , | ' | ||
| entry_def | ::= | letter | digit |
Example:
Here is a concrete example of an NFA where state q1 has no outgoing transitions on input a, but two outgoing transitions on input b.
NFA myNFA = {
states = {q0 q1 q2}
alphabet = {a b}
transitions = {
q0-a->{q0 q1}
q0-b->q1
q1-b->{q0 q2}
q2-a->q2
q2-b->q2
}
initial state = q0
final states = {q2}
}