编译原理-词法分析 之 正则表达式、NFA与DFA

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 过程伪代码实现

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值