java实现有限自动机_非确定有限状态自动机的构建(二)——将CharVal转换为NFA...

将上下文无关文法读入内存之后,可以将它转换成非确定有限状态自动机。当然,不是所有的上下文无关文法都能够转换成自动机的,前提条件是这个上下文无关文法能够与正则定义等价。因此,在进行转换之前,我们需要先挑选出上下文无关文法中符合正则定义的规则。(参考博文http://blog.csdn.net/panjunbiao/article/details/9364837)

如何将正则表达式转换为NFA呢?我们从最简单的CharVal类型开始(有关CharVal请参考http://blog.csdn.net/panjunbiao/article/details/9087665)。CharVal就是一对双引号包含的字符串,因此在转为NFA的时候,只需要将字符串中的字符按顺序生成NFA状态节点即可。

例如一个CharVal为"ABC",假设文法是大小写不敏感的,这意味着abc也是符合这个文法定义的。转换为NFA应该是这样:

6ff03342b8d9e940fdf5393e3cdc5ce1.png

在CharVal类中,下面的方法完成从CharVal到NFA的转换:

@Override

public NFA toNFA(Map rules) throws IllegalAbnfException {

NFAState startState = new NFAState();

NFAState acceptingState = new NFAState();

this.toNFA(startState, acceptingState, rules);

return new NFA(startState, acceptingState);

}

@Override

public void toNFA(NFAState startState, NFAState acceptingState, Map rules) {

//若CharVal的内容为空,则创建一条从开始状态到接受状态的epsilon迁移。

if (value.length() == 0) {

startState.addTransit(acceptingState);

return;

}

NFAState current = startState;

for(int j = 0; j < value.length(); j ++) {

//最后一个节点使用方法参数中的acceptingState,中间节点自行创建

if (j < value.length() - 1) current = current.addTransit(value.charAt(j));

else current = current.addTransit(value.charAt(j), acceptingState);

}

}

可见,生成NFA并不复杂,但转换之后我们要考虑如何判断两个NFA的等价性,以便单元测试检验NFA是否正确生成?另外也要考虑NFA如何输出为我们可以阅读的方式,例如用文本或者用图来表示。因此,在学习转换其他类型的文法元素之前,我们要先解决上面两个问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值