java nfa dfa_编译原理-NFA构造DFA

本题摘自北邮的编译原理与技术。

12f20e4c770f2aba477df4b3f7ac1686.png

首先,根据此图构造状态转换表

bcb3ef5d9c6fc6a74d8c6b243a27078b.png

表中第一列第一行表示从第一个符号B通过任意个空转换能到达的节点,Ia表示由此行的状态数组({B,5,1}可以看作0状态)经过一个a可以到达的节点,同理,Ib表示由状态数组经过一个b可以到达的节点。

当然,有些人可能觉得{B,5,1}和{5,1,3}看作两个状态不合理,他们之间不是有交集嘛,实际上他们之间并无交集,因为输入a后,{B,5,1}能到达的新节点是3,之所以要写成{5,1,3},可能是要兼顾逻辑吧>_>

再仔细观察第一行,既然第一列可以看作一个状态,那么第二列就可以看作首状态输入一个a到达的另一个状态,所以可以把剩下两个{5,1,3}和{5,1,4}放入二三行的第一列作为状态1和状态2,简而言之,就是几个不同状态之间通过输入a,b来达到另一个状态。(不知道我用自己的理解来讲有没有讲清楚。。。)重复的状

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 程序设计: 一.DFA.javaDFA.java 中的 DFA 类实现成员函数 boolean recongnizeString(int move[][], int accept_state[], String word),函数功能和参数说明如下。 函数功能:如果 word 被 move 和 accept_state 所代表的 DFA 识别,则返回 true,否 则返回 false. 参数说明: 1) move[][]是状态迁移函数,move 的每一行代表一个状态,每一列代表一个输入符 号,第 0 列代表’a’,第 1 列代表’b’,……,依此类推. 例如:move ={{1,0}, {1,2}, …},则表示此 DFA 在状态 0 时,当输入为’a’时,迁移到状态 1,当输入为’b’ 时迁移到状态 0;而 DFA 在状态 1 时,当输入为’a’时,迁移到状态 1,当输入为’b’ 时迁移到状态 2. 注意:默认状态0是DFA的初始状态. 2) accept_state[]是接受状态的集合,如 accept_state[] = {2, 3},则表示状态 2 和状态 3 是接受状态. 3) word 是待识别的字符串. 注意事项: 1) 字符串 word 的长度在1到50之间. 2) move 的状态数在1到50之间,输入符号数在1到26之间. 3) 只须实现 recognizeString 函数,注意不要修改 DFA.java 文件中其它部分的内容(如 果修改了,请在提交之前改回来),更不要修改 recognizeString 的函数名,参数和 返回类型. 但可以为 DFA 类添加新的成员变量和成员函数. 4) DFA.in 文件是整个程序的输入文件,在本地机器上调试或测试程序时,可以修改 DFA.in 中的内容(用 Editplus 或记事本都可以打开修改),但遵照 DFA.in 的文件格 式. DFA.in 的格式示例如下: 4 2 ----DFA有4个状态,2个输入符号 1 0 ----接下来的 4 行 2 列代表状态迁移函数 1 2 1 3 1 0 3 ----这一行代表接收状态,若有多个用空格隔开 aaabb ----接下来的每行代表一个待识别的字符串 abbab abbaaabb abbb # ----‘#’号代表待识别的字符串到此结束 1 3 ----新的 DFA 开始,格式同上一个 DFA 0 0 0 0 cacba # 0 0 ----两个 0 代表所有输入的结束 5) 当 DFA.in 内容如 4) 时,屏幕应输出 YES NO YES NO YES
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值