我是CFG的新手,
有人可以给我一些关于创建生成某种语言的CFG的提示
例如
L = {am bn | m >= n}
我得到的是:
So -> a | aSo | aS1 | e
S1 -> b | bS1 | e
但我认为这个区域是错误的,因为 b
的数量可能大于 a
的。
答案 0 :(得分:46)
L = {a m b n | m> = n}。
语言描述: a m b n 包含 a
,后跟 b
a
的数量等于或大于 b
的数量。
一些示例字符串:{^, a, aa, aab, aabb, aaaab, ab......}
因此,对于一个 a
总有一个 b
,但可能会有额外的 a
。感染字符串只能由 a
组成。另请注意 ^
null是语言的成员,因为在 ^
NumberOf(a) = NumberOf(b) = 0
如何编写接受字符串a m b n 形成的语言的语法?
在语法中,应该有规则,如果您添加 b
符号,您还可以添加 a
符号。
这可以通过以下方式完成:
S --> aSb
但这不完整,因为我们需要一条规则来生成额外的a
s:
A --> aA | a
将两个制作规则合并为一个语法 CFG。
S --> aSb | A
A --> aA | a
因此,您可以生成包含 a
以及 a
和 b
的任何字符串in(a m b n )模式。
但是在上面的语法中,没有方式可以生成 ^
字符串。
所以,改变这个语法:
S --> B | ^
B --> aBb | A
A --> aA | a
这个语法可以生成{a m b n | m> = n}语言。
注意:要生成^
空字符串,我添加了S--> B | ^
,在语法中添加了额外的第一步,因此您可以添加^
或者符号字符串 a
和 b
。 (现在B
扮演前一个语法S
的角色,生成相同数量的 a
和 b
)
编辑:感谢@Andy Hayden
您也可以为同一种语言编写等效语法{a m b n | m> = n}:
S --> aSb | A
A --> aA | ^
注意:此处A --> aA | ^
可以生成零个或任意数量的 a
。这应该比我的语法更好,因为它为同一个字符串生成一个较小的解析树
(较小的高度,因为有效的解析)
以下提示可能有助于为正式语言编写语法:
- 你应该清楚它所描述的语言(意义/模式)。
- 你可以记住一些基本问题的解决方案(这个想法是你可以编写新的语法)。
- 您可以为I have written for RE in this example to write Right-Linear-Grammmar等基本语言编写规则。规则将帮助您为新语言编写语法。
- 一种不同的方法是首先绘制自动机,然后将自动机转换为语法。我们有预定义的技术从任何一种形式语言的自动机编写语法。
- 就像一个通过阅读他人代码来学习的优秀程序员一样,同样可以学习为正式语言编写语法。
你写的语法也错了。
答案 1 :(得分:5)
您想为后续语言
创建语法 L= {an bm | m>=n }
这意味着' b'应该大于或等于' a' 或者你可以说每个' b'最多只能有一个' a'。不是其他方式。
这是这种语言的语法
S-> aSb | Sb | b | ab
这个语法中的每个' a'有一个'。但是b可以在不产生任何'的情况下生成。
你也可以试试这些语言:
L1= {an bm | m > n }
L2= {an bm | m >= 2n }
L3= {an bm | 2m >= n }
L4= {an bm | m != n }
我正在为每种语言提供语法。
表示L1
S-> aSb | Sb | b
for L2
S-> aSbb | Sb | abb
for L3
S-> AASb | Sb | aab | ab | b
表示L4
S-> S1 | S2
S1-> aS1b | S1b | b
S2-> aS2b | aS2 | a
答案 2 :(得分:2)
最少变量:S - > a S b |一个S | ë
答案 3 :(得分:0)
变量较少:
S - > a S b |一个S | a b | ë