请问编译原理中a(a|b)*a和aa*b*a有什么区别,谢谢。

本文解析了两种正则表达式的不同之处:a(a|b)*a 和 aa*b*a。前者接受两个a间任意长度的{a,b}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://zhidao.baidu.com/question/550242926.html

请问编译原理中a(a|b)*a和aa*b*a有什么区别,谢谢。

2013-05-14 10:15 weryk11  |  分类:穿越火线  |  浏览104次
2013-05-14 18:13 提问者采纳
涉及到一个优先序问题,前一个正则式接受两个a之间有0长度或任意长度的{a,b}字符串序列,而后一个正则式则只允许两个a之间有的{a,b}序列必须满足:如果a、b同时存在,则a必须在b前面,也就是只接受左右两端全是a,只有中间是b这种夹心饼干的形式。举个栗子你就明白了:
a(a|b)*a可以接受的输入序列有:aa aaa aba abba aaba abaa
aa*b*a 可以接受的输入序列有:aa aaa aaba aba aaabba 不能接受abaa
提问者评价
非常感谢,这个问题困扰我很长时间了。
### 回答1: 首先,我们需要构造该文法的 LR(0) 项集族 SLR(1) 分析表。 构造 LR(0) 项集族: $I_0 = \{A' → ·A\}$ $I_1 = \{A → ·fAa, A → ·fAg, A → ·b\}$ $I_2 = \{A → f·Aa, A → f·Ag\}$ $I_3 = \{A → fa·a, A → fa·g\}$ $I_4 = \{A → fA·a, A → fA·g\}$ $I_5 = \{A → fAg·\}$ $I_6 = \{A → fAa·\}$ $I_7 = \{A' → A·\}$ 构造 SLR(1) 分析表: | 状态 | f | a | g | b | $ | A | | ---- | --- | --- | --- | --- | --- | --- | | 0 | s1 | | | | | G | | 1 | | s3 | s4 | | | | | 2 | s6 | | | | acc | | | 3 | | | | r2 | r2 | | | 4 | | | | r3 | r3 | | | 5 | | | | r1 | r1 | | | 6 | | | | r4 | r4 | | 其中,状态 0 的状态标记为 G,表示文法的起始符号。对于状态转移,例如状态 1 的 $f$ 转移 $s1$ 表示在状态 1 读入 $f$ 后转移到状态 1。对于归约操作,例如状态 3 的 $b$ 转移 $r2$ 表示在状态 3 读入 $b$ 后执行 $A → fAg$ 的归约操作。 在 SLR(1) 分析表中,出现了状态 1 状态 2 之间的归约-移进冲突,这说明该文法不是 SLR(1) 文法。因此,该文法不是 SLR(1) 文法。 ### 回答2: 要判断一个文法是否是SLR(1)文法,需要经过以下步骤: 1. 对于文法中的每一个产生式,将其扩展成项目集。对于给定的文法A→fAa|fAg|b,将其转化为项目集如下: I0: A'→·A, A→·fAa, A→·fAg, A→·b I1: A→f·Aa, A→f·Ag I2: A→fA·a, A→fA·g I3: A→b· 2. 构建DFA。从初始项目集I0开始,依据项目的闭包Go函数构建DFA。其中,闭包操作会将所有可达的项目都加入到项目集中,Go函数表示在给定一个符号后,能够转移到哪个项目集。 初始状态是I0,根据Go函数可得到: Go(I0, f) = I1 Go(I0, b) = I3 Go(I1, A) = I2 Go(I2, a) = I1 Go(I2, g) = I1 构建DFA如下: I0 -f-> I1 I0 -b-> I3 I1 -A-> I2 I2 -a-> I1 I2 -g-> I1 3. 分析DFA中的冲突。对于SLR(1)文法,不应该存在移进-归约冲突归约-归约冲突。具体分析如下: - 在I1状态中,存在移进-归约冲突,即Go(I1, a)Go(I1, g)都指向了I1。这是因为在该文法中,存在一个前缀相同的产生式A→fAaA→fAg,因此无法消除冲突。 因此,根据以上分析,该文法不是SLR(1)文法。 ### 回答3: 编译原理中的SLR(1)文法是指可以通过SLR(1)分析方法进行分析的文法。而SLR(1)分析方法是一种自底向上的语法分析方法,通过构造分析表来实现对文法的分析。 判断一个文法是否是SLR(1)文法,需要满足以下两个条件: 1. 没有移进-归约冲突:对于文法中的任何一个项目 X → α•aβ,如果存在一个状态 i,在状态 i 中既有一个归约项目 X → α• 一个移进项目 a,那么该文法就不是SLR(1)文法。 2. 没有归约-归约冲突:对于文法中的任何两个归约项目 X → α• Y → β•,如果存在一个状态 i,在状态 i 中既有归约项目 X → α• ,又有归约项目 Y → β•,那么该文法就不是SLR(1)文法。 对于给出的文法 A → fAa|fAg|b,我们来进行判断: 1. 构造项目集规范族: I0: A' → •A, A → •fAa, A → •fAg, A → •b I1: A' → A•, A → f•Aa, A → f•Ag, A → •fAa, A → •fAg, A → •b I2: A → fA•a, A → fA•g I3: A → fAg• 2. 构造LR(0)分析表: f g a b $ ------------------------ 0 s2 s3 1 1 acc 2 s2 s3 4 3 s5 4 r1 5 r2 分析表中的s表示移进,r表示归约,acc表示接受,空表示报错。 3. 判断是否有移进-归约冲突归约-归约冲突: - 对于状态1,存在移进项目f归约项目A → •fAa,存在移进-归约冲突,所以该文法不是SLR(1)文法。 综上所述,给出的文法 A → fAa|fAg|b 不是SLR(1)文法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值