3.3.5
(1) 正则表达式:define) other -> {bcdfghjklmnpqrstvwxyz}
answer:other* a(other|a)* e(other|e)* i(other|i)* o(other|o)* u(other|u)*
NFA: (由python代码生成,除了这个下面的DFA是基于开源工具绘制的)
from graphviz import Digraphdef create_nfa():nfa = Digraph(format="png", node_attr={"shape": "circle"}, edge_attr={"label": "ε"})nfa.attr(rankdir="LR") # 水平布局nfa.attr(size="64,64") nfa.attr(ranksep="2") nfa.attr(nodesep="1") nfa.attr(fontsize="12") # 定义状态states = ["start", "q0", "q1", "q2", "q3", "q4", "q5", "final"]for state in states:nfa.node(state)# 定义其他字符集合other = "bcdfghjklmnpqrstvwxyz"# 初始状态到q0的ε转移nfa.edge("start", "q0", label="ε")# q0: other* -> ε转移nfa.edge("q0", "q0", label=f"{other}|ε")# q0 -> q1: a(other|a)*nfa.edge("q0", "q1", label="a")nfa.edge("q1", "q1", label=f"{other}|a")# q1 -> q2: e(other|e)*nfa.edge("q1", "q2", label="e")nfa.edge("q2", "q2", label=f"{other}|e")# q2 -> q3: i(other|i)*nfa.edge("q2", "q3", label="i")nfa.edge("q3", "q3", label=f"{other}|i")# q3 -> q4: o(other|o)*nfa.edge("q3", "q4", label="o")nfa.edge("q4", "q4", label=f"{other}|o")# q4 -> q5: u(other|u)*nfa.edge("q4", "q5", label="u")nfa.edge("q5", "q5", label=f"{other}|u")# q5 -> final: ε转移nfa.edge("q5", "final", label="ε")return nfanfa = create_nfa()
nfa.render("nfa_diagram", view=True)
NFA转DFA表格:
l | la | le | li | lo | lu | lother | |
---|---|---|---|---|---|---|---|
q0 | q1 | q0 | |||||
q1 | q1 | q2 | q1 | ||||
q2 | q2 | q3 | q2 | ||||
q3 | q3 | q4 | q3 | ||||
q4 | q4 | q5 | q4 | ||||
q5 | q5 | q5 |
(6)
正则表达式:
(b|a (bb|aa)* (ba|ab)) (bb|aa|(ba|ab) (bb|aa)* (ba|ab)) *
NFA:(从这里往下面的第一个ε缺标,默认省略)
NFA转DFA表格:
l | la | lb | |
---|---|---|---|
3 | 0 3 | 1 3 | |
0 | 3 0 | 0 2 | |
2 | 2 1 | 0 2 | |
1 | 2 1 | 3 1 |
(8)
正则表达式:
b* (a+b?)*
NFA:
NFA转DFA表格:
l | la | lb | |
---|---|---|---|
1 | 2 | 1 | |
2 | 2 | 0 | |
0 | 2 | trap |
(9)
正则表达式:
b* | b* a + | b* a + b a*
NFA:
NFA转DFA表格:
l | la | lb | |
---|---|---|---|
1 | 2 | 1 | |
2 | 2 | 0 | |
0 | 0 | trap |