文章目录
相关文章:
句法模式识别/结构模式识别(一)—概述
句法模式识别/结构模式识别(二)—形式语言
句法模式识别/结构模式识别(三)—文法推断
句法模式识别/结构模式识别(四)—句法分析
一、自动机的概念
自动机就是一个句法模式识别器,作用是识别输入链是否符合与该机相对应的文法。其中,每类文法对应一类自动机:
链文法:
- 0型文法:图灵机
- 1型文法:线性有界自动机
- 2型文法:下推自动机
- 3型文法:有限态自动机
其他
- 树文法:树自动机
二、有限态自动机与正则文法
2.1 有限态自动机
2.2 有限态自动机接受语言的方式
2.3 有限态自动机与正则文法的对应状态
1)按正则文法构造有限态自动机
2)按有限态自动机确定正则文法
三、下推自动机与上下文无关文法
3.1下推自动机
例:设计识别
L
01
=
{
0
n
1
n
∣
n
⩾
1
}
\boldsymbol{L}_{01}=\left\{ 0^{\boldsymbol{n}}1^{\boldsymbol{n}}|\boldsymbol{n}\geqslant 1 \right\}
L01={0n1n∣n⩾1}的PDA。
解:
因为
0
n
1
n
0^{\boldsymbol{n}}1^{\boldsymbol{n}}
0n1n不是一个正则语言,所以不能使用有限自动机来识别。但是PDA具有一个栈的结构,我们可以用栈来保存一些信息,所以PDA可以识别
0
n
1
n
0^{\boldsymbol{n}}1^{\boldsymbol{n}}
0n1n这样的语言
,当PDA读入0的时候,我们将0全部都压入栈中,当读入一个1的时候,每读入一个1,从栈中弹出一个0,使得0和1的数量是相等的。当扫描完整个输入串的时候,如果刚好把栈底符号
Z
0
\boldsymbol{Z}_0
Z0露出来了,那么我们可以通过一个空转移跳转到一个接收状态,去接收这样一个串。
我们可以通过状态转移图来分析这个PDA:
① 利用开始状态来压入全部的0
其中,
0
,
Z
0
/
0
Z
0
0,\boldsymbol{Z}_0/0\boldsymbol{Z}_0
0,Z0/0Z0的意思是:当读入一个0的时候,如果当前的栈顶是
Z
0
\boldsymbol{Z}_0
Z0,那么我们就把
Z
0
\boldsymbol{Z}_0
Z0替换成0
Z
0
\boldsymbol{Z}_0
Z0
② 当读入一个0时,栈顶就已经不是
Z
0
\boldsymbol{Z}_0
Z0了,而是0了,所以其他剩下的0,要通过与第一个用0把
Z
0
\boldsymbol{Z}_0
Z0替换掉的相同的方法来处理,将栈顶的一个0替换成两个0:0,0/00
③ 此时,这个动作已经可以将前面的全部0压栈,因为我们所有的0都在1的前面,所以将0压入栈和将0弹出栈必须使用不同的状态,当读入一个1的时候,我们要求栈顶是0才能跳转过来,我们把0弹出
(
1
,
0
/
ε
)
\left( 1,0/\boldsymbol{\varepsilon } \right)
(1,0/ε),修改为状态
q
1
\boldsymbol{q}_1
q1
④ 接下来将其他的1和0进行匹配,当读入其他的1的时候,将其他的0弹出
(
1
,
0
/
ε
)
\left( 1,0/\boldsymbol{\varepsilon } \right)
(1,0/ε),在
q
1
\boldsymbol{q}_1
q1的时候就会保证所有的0和所有的1的数量都是相等的
⑤ 当扫描完整个输入串之后,刚好把栈底的符号
Z
0
\boldsymbol{Z}_0
Z0露出来了,我们利用空转移,通过栈顶的
Z
0
\boldsymbol{Z}_0
Z0不变
(
ε
,
Z
0
/
Z
0
)
\left( \boldsymbol{\varepsilon },\boldsymbol{Z}_0/\boldsymbol{Z}_0 \right)
(ε,Z0/Z0),跳转到一个接收状态
q
2
\boldsymbol{q}_2
q2,就完成了PDA的设计
接下来检验一下是否正确:比如00111,我们用所设计的PDA来处理他时,会不会被接受呢?当读入前面两个0时会被压栈。再读入前面两个1的时候刚好把前面两个0都弹出来了,这个时候已经把栈底符号
Z
0
\boldsymbol{Z}_0
Z0露出来了,并且可以通过空转移跳转到接收状态
q
2
\boldsymbol{q}_2
q2,那么就不会接收这个串00111,因为我们判断一个字符串是否被接收的时候,一定要在扫描完整个字符串之后,也就是读入最后一个1之后再去判断,但是如果在之前就经过空转移跳转到
q
2
\boldsymbol{q}_2
q2了,相当于会卡死,所以不接受这个输入串。