我们如何为上下文无关语言构建 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(相互抵消)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...