context-free-grammar - 需要一种上下文无关语法,其中一个字符的数量是另一个字符的 5 倍

标签 context-free-grammar pushdown-automaton

我很确定我确实有一个,但它有 42 条构造规则并且不能很好地概括。我怎样才能用更少的构建规则来做到这一点?

语言为 {a,b}*,其中 a 的数量是 b 数量的五倍。

我知道对于一种语言 {a^n (连接) b^m; m = 5n} 就这样

S = aSbbbbb | λ

但是当字符可以按任何顺序排列时,我就迷路了。

最佳答案

首先,观察一下,如果一个句子的字符数是另一个句子的 5 倍,它总是看起来像 aaabaabaaaaa。因此一个句子可以是 aaaaabaaabaa。另一个观察结果是,每当我们添加 b 时,我们都必须添加五个 a 字符。

以下语法的 a 字符数量确实是 b 字符数量的五倍:

S = AS | λ
A = Baaaaa | aBaaaa | aaBaaa | aaaBaa | aaaaBa | aaaaaB
B = bS | Sb

我们从S开始,它可以是空(满足要求)或A

A 的规则生成至少 5 个 a 字符和一个 B。现在对于 B,我们可以放置 b 并在那里停止(通过为 S 选择空字符串)或重新开始(通过选择 A代表S)。这保证了我们放置的 a 字符数始终是 b 字符数的 5 倍。

最后,这种语法可以很容易地推广到一种语法,它需要包含一个语法的 n 倍于另一个语法的字符(通过直接扩展规则 A)。

关于context-free-grammar - 需要一种上下文无关语法,其中一个字符的数量是另一个字符的 5 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810822/

相关文章:

javascript - EcmaScript语法中的[Yield, Await, In, Return]是什么

支持歧义的 Java CFG 解析器

c - 编程语言中的术语 "context"以及加载和更新如何影响上下文?

c++ - FSM 中的状态应该与上下文类型成为 friend 吗?

java - 如何识别来自PDA/桌面/服务器的Web请求?

c++ - 在 C++ 中模拟确定性下推自动机 (PDA)

ANTLR - 永远无法匹配以下替代方案

regex - 什么是上下文无关语法?

c - 下推自动机的结构问题

finite-automata - 有限自动机、下推自动机和图灵机示例