context-free-grammar - 从语言生成上下文无关语法
问题描述
我需要为每个示例提供一个上下文无关的语法:
L1 = {a^hb^ka^mb^n : h + k = m + n}
L2 = {a^ib^ja^k : (i = j and k >= 0) or (i >= 0 and j > k)}
我已经完成了许多简单的示例,并且提高了从语法生成 CFG 的技能。我通常从解决最简单的情况开始,然后从那里开始构建。但是,我很困惑我可以从哪里开始找到这些问题的解决方案。
解决方案
对于第一个,想象从外向内剥离符号。我们开始剥离 a 和 b 对:
S -> aSb
如果我们先剥离所有的第一,我们需要进入一个新的状态;否则,如果我们先剥掉所有的b,我们需要进入一个新的状态;否则,如果我们同时剥离两个,我们可以切换到剥离反向对:
S -> aSb
S -> aXa | bYb
S -> bZa
如果我们最终做 S -> aXa,我们需要用尽左边的 a 才能接受;否则,我们可以继续从两端剥离 a:
S -> aSb | aXa | bYb | bZa
X -> aXa | bZa
同样对于 Y:
S -> aSb | aXa | bYb | bZa
X -> aXa | bZa
Y -> bYb | bZa
现在对于 Z,我们只需要确保以空字符串结尾:
S -> aSb | aXa | bYb | bZa
X -> aXa | bZa
Y -> bYb | bZa
Z -> bZa | e
如何证明这是正确的?首先,争辩说这只会产生语言中的字符串。这里的一个证明想法是注意最后一个产生式是 Z -> e 并且到目前为止,我们总是在它的两侧添加相同数量的符号;同样,在左边,我们只能在 a 之后添加 b,而在右边,我们只能在 b 之前添加 a。然后,争辩说这会产生语言中的所有字符串。这里的一个证明思路是描述在一般情况下如何推导出 a^hb^ka^mb^n。分别考虑 h < n、h = n 和 h > n,并且在每种情况下分别考虑 k < m、k = m 和 k > m。
对于第二个,您的第一步应该是将其拆分为两种语言并摆脱析取:
L2 = A union B
A = {a^ib^ja^k : (i = j and k >= 0)}
B = {a^ib^ja^k : (i >= 0 and j > k)}
现在,找到 A 的语法:
A -> Aa | A'
A' -> aA'b | e
接下来,找到 B 的语法:
B -> aB | B'
B' -> bB'a | b
然后,编写将 S 连接到 A 或 B 的 S 的语法:
S -> A | B
A -> Aa | A'
A' -> aA'b | e
B -> aB | B'
B' -> bB'a | b
这一点的证明留作练习。
推荐阅读
- sorting - AutoHotkey如何在对第一列中的数字进行降序排序的同时保持第二列的顺序?
- python - 有没有办法使用 python 将更新的图表样式应用于 powerpoint 中的图表?
- javascript - 如何在javascript中将字符串转换为对象数组
- sql-server - SQL Server 2019 标准 - 更改版本选择的输出
- python - 如何在不读取 Django 中的所有对象的情况下从 DB 中获取一些最后的对象?
- java - 尝试将图像从 firebase 数据库获取到存储时发生 StorageException
- perforce - 如何获取 perforce 的变更列表编号?
- dart - 如何在发送数据之前使用自定义加密对 GRPC 消息进行加密?
- java - java - 如何在java中为多行获取n间隔输入?
- java - JavaFX Clipboard 类不会将字符串放入系统剪贴板