给定一种语言,定义其CFG

时间:2011-06-25 08:39:46

标签: compiler-construction grammar

给出

L1 = {w belongs to {a,b}* | has as many a as b}

定义CFG G,使得L(G)= L1

在我看来,这些作品应该是正确的答案

1) S → aSa

2) S → bSb

3) S → ε

我的理由是:

L1包含{ab,aabb,aaabbb,... etc}等字符串

现在我有一个疑问:如果我应用上述作品,简而言之:

S → aSa
我应用1)所以我得到S → aSa → aaSaa我选择2)得到S → aSa → aaSaa → aabSbaa然后使用空字符串我得到最后一个字符串S → aSa → aaSaa → aabSbaa → aabbaa

现在,也许我错了,但在字符串aabbaa中,a的数量不等于b的数量

任何帮助都将受到高度赞赏

勒夫

3 个答案:

答案 0 :(得分:1)

这是一个标准的练习,但还没有正确的答案。

1) S -> aSb
2) S -> bSa
3) S -> SS
4) S -> ε

任意数量的a和b,包括空字符串。

<小时/> 有很多在线课堂笔记的答案和证据。例子: herehereherehere以显示一些内容。

答案 1 :(得分:0)

假设L1实际上是{a^nb^n | n ≥ 0},你提供的语法不能(正如你自己证明的那样)产生精确的L1。为了满足松散表达的要求,“单词左侧a的数量必须等于右侧b的数量”,您的目标是找到一个语法,在每个产品的每个产品之后强制执行该要求。

另一种思考方式是:不允许您在语法中使用不会产生相同数量ab的作品。

编辑:由于这不是作业,我会继续给出答案:

V = {A}, Σ = {a, b}, S = A, and R the set of rules:

(1) A -> aAbA | bAaA
(2) A -> ε

答案 2 :(得分:-1)

抱歉也许我错了,但Michael Foukarakis的解决方案不起作用

基本上这两条规则不提供具有相同数量的a和b的字符串。

(1) A -> aAb

(2) A -> ε

拿A - &gt; aAb然后应用1)规则,你有A -> aAb ->aaAb然后??? 如果你申请2),你最终得到A -> aAb ->aaAb ->aab

我认为正确的答案是:

1)S->aSbS

2)S->bSaS

3) S->ε

即使我收到如下字符:ababaababb 实际上他们都满足了最初的要求,即:

the string must contain the same number of a and b.

(元素的排列方式无关紧要。)

评论当然受到欢迎和鼓励。