微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们如何为上下文无关语言构建 CFG

如何解决我们如何为上下文无关语言构建 CFG

为以下语言构建 CFG:{a^i b^j c^k | j 不等于 i + k}。我已经尝试了以下CFG,但它错过了一些情况。

S---> AB
A---> ab|aAb|aA|NULL
B---> bc|bBc|cB|NULL

解决方法

您当前的 CFG 会生成一些该语言中没有的字符串。例如,字符串 ab 是 i = 1、j = 1、k = 0 的字符串,所以 i+j = k。此字符串由您的语法生成。

解决这个问题的一种方法是将语言拆分为两种语言的联合:{a^i b^j c^k | i+k j}。然后我们可以为每种语言构建一个 CFG。设 S 为起始状态,L 为 i+k j 的语法规则。

考虑使用字符串中的“a”或“c”取消每个“b”对我很有帮助。一旦你尽可能多地抵消了,要么应该有一些剩余的 b's (i+j k)。

S ---> L | G
L ---> HBF
乙 ---> 乙 | bB
G ---> aG | GC |高频 |高频
H ---> aHb |空
F ---> bHc |空

H 生成所有 a 和 b 数量平衡的字符串,F 生成 b 和 c 数量平衡的所有字符串。因此,将 L 视为 a 和 b 的平衡数量,然后是 1 个或多个额外的 b,然后是 b 和 C 的平衡数量。

与 G 类似,您可以在开头生成 1 个或多个额外的 a 和/或在结尾生成 1 个或多个额外的 c。在中间,您有平衡数量的 a 和 b(相互抵消)以及平衡数量的 b 和 c(相互抵消)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。