1.正则表达式:正则表达式是一种更紧凑的正则文法,正则表达式、正则文法、NFA、DFA他们存在一一对应关系
2.什么是DFA:DFA有如下几个部分构成,初始状态、终态、输入字母表(可以理解成合法的输入)、状态集、以及状态转换表(状态集与合法输入笛卡尔积而成,每一个状态接收到一个合法的输入后都会得到一个唯一确定的状态)。
什么是NFA:基本与DFA相同,不同点是,NFA的状态转换规则,一个状态接收一个合法输入后,转换成一个状态集合而不是唯一一个状态
3.NFA与DFA可以等价、可以相互转化
DFA伪代码实现
//状态集
List<Status> statusList;
//状态转换规则
Map<Status,<Input,Status>> statusConverMap;
//输入字母表
List<Input> inputList
in = inputList.get(0)
//初态
Status s0;
Status s = s0;
//迭代转换
while(!endInput(in)){
if(!legelInput(in)){
Status s = doConver(s,in);
if(s!=null){
//状态转换成功继续处理输入
in=inputList.next();
}else{
return false;
}
}
else{
return false;
}
}
if s = 终态{
return true;
}
else{
return false;
}
//根据规则进行状态转换,返回转换后的状态
public abstract Status doConver(Status now,Input in);
//判断输入是否合法
public abstract boolean legelInput(Input in);
//判断状态是否合法
public abstract boolean legelStatus(Status s);
//判断输入是否结束
public abstract boolean endInput(Input in);
4.NFA到DFA
要点:4.1.根据转换规则,寻找所有转换后状态集的组合
4.2.将这些不同的状态集每个都当作一个新的状态,根据原来的转换规则,构造新的状态转换表(包含这些新加入的状态),这个状态转换表就是符合DFA的状态转换表了
NFA -> DFA 过程伪代码实现