繁体   English   中英

为最多两个 0 的偶数长度字构造 CFG

[英]Constructing CFG for even length words with maximum of two 0's

我正在努力为L={xE{0,1}* |构建一个好的 CFG 它的长度是偶数,最多有两个 0}

所以像L={11, 10, 0011...}这样的词

我正在尝试以下尝试。

S -> E | E0A | A0E | E0E0E | 00EA | EA00

E-> 1A | e

A -> 1E

我正在运行不同的推导,它们似乎很有意义,但我仍然不确定我的语法是否正确,或者是否有更好的方法来改进它? 非常感谢,我一直在努力学习 CFG,我正在努力练习更多来帮助我理解。

您的 CFG 似乎不正确,因为我没有看到 1001 的推导。可能还有其他问题。

我们可以从 0 和 1 的偶数长度字符串语言的 CFG 开始:

S -> 0S0 | 0S1 | 1S0 | 1S1 | e

这个语法的唯一问题是它可以产生两个许多 0。 我们可以通过在每次添加零的产生式之后引入新的非终结符来避免这种情况。 然后,那些其他非终结符可以“记住”我们已经看到了 0,并且有效产生式更少。 所以...

S -> 0A0 | 0B1 | 1B0 | 1S1 | e
A -> 1A1 | e
B -> 0A1 | 1A0 | 1B1 | e

在这个文法中,S 表示到目前为止还没有引入零; A 引入了两个允许的零; B 只介绍了一个。

让 X 代表“偶数个 1”,Y 代表“奇数个 1”。

您有 0、1 或 2 个零,分隔 1、2 或 3 组 1。 这些 1 组以及 0 必须有偶数个字符。 由于每个 X 有偶数个字符,我们必须有偶数个 0 和 Y。

现在写下所有可能的情况。

这里的另一种选择:您在此处描述的语言是常规的。 这意味着你可以...

  • ...为该语言编写一个正则表达式,然后将其转换为 CFG。 有一个非常好的方法可以做到这一点 - 连接被保留为连接,联合变成不同的生产选项,并且星号被重写为一个新的非终结符,该非终结符扩展到“被加星标的任何数量的副本”。
  • ...为该语言设计一个 DFA 或 NFA,然后将其转换为右线性语法。 也就是说,为每个 state 创建一个非终结符。 在字符 b 上为自动机中从 state A 到 state B 的每个转换添加形式 A → bB 的产生式,然后为每个接受 Z9ED39E2EA9314586B6A985A6E 添加形式 A → ε 的产生式

我怀疑这些选项中的第二个将为您提供一个相当简单的 CFG,其中包含可管理数量的非终结符。 具体来说,将 DFA 形成为计算 0 数量的简单 DFA 和跟踪奇偶校验的简单 DFA 的叉积,然后将其转换为 CFG。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM