从语言归纳语法的5种经验方法

本文介绍了从语言归纳语法的五种经验方法:对称法、逐步分解法、等价方法、电路状态转换法和混合方法。通过具体例子详细阐述了如何应用这些方法解决不同的语言构造问题,涉及回文数、数量相等或不等的语言构造等。

语言和语法回顾

参见我的另一篇博文:http://blog.csdn.net/cuiods/article/details/52442584
语言的构造方法有两种:全组合(full combination)和部分组合(partial combination)。
- 全组合:用字母表 Σ 的闭包表示( Σ *)
- 部分组合:基于规则的语法(rule-based grammar)
从语法可以推导出符合语法规则的语言:G==Derivation=>L(G)
极左推导示例:

Grammar:
E => E + F | F
F => F * G | G
G => (E) | i
Leftmost derivation:
E => E + F => F + F => G + F => i + F => i + G => i + i

最左规约是最右推导的逆过程。

从语言归纳到语法一般依靠经验方法,以下五种方法是常见的经验方法。

方法1:对称法(Symmetrical Method )

典型问题:明显的对称特征

Example1:Let L1={a2nbn|n>=1 and a,b VT},Try to construct the grammar G1 from L1
Let n=1, L1 =aab
n=2, L1 =aaaabb
n=3, L1 =aaaaaabbb
……

解决步骤:

  1. Find out axis - special case : 找到对称特例,比如在上面的问题中第一步找到的特例就是S->aab
  2. Find out the symmetrical properties: 我的理解就是找到对称轴,然后把对称的非终结符放在对称轴上,在上面的问题中,第二步就是S->aaSb

因此,Example1的答案就是S->aab|aaSb。(这种语法是之前提到的嵌入式语法(embedded grammar))

用这种方法可以方便地表示回文数(palindrome)。
1. axis: S -> 0|1|2|…|9| ϵ
2. Symmetrical properties: S->1A1|2A2|…|9A9; A-> ϵ |0|1|…|9|; A->0A0|1A1|…|9A9
如果要表示偶数回文数,只要修改S->2A2|4A4|…8A8; S -> 0|2|…|8| ϵ

方法2:逐步分解法(Step-wise Refinement Method)

典型问题:可分解、各部分之间没有联系

Example 2:Let L2={aibjck | i,j,k>=1 and a,b,c VT}, Try to construct the grammar G2 from L2.

解决方法:

自上而下法(top-down)

S -> A B C
A -> a A | a
B -> b B | b
C -> c C | c

这种方法非常好理解。

自左而右法(left-right)

这种方法看上去不好理解,但其实也非常自然,只是老师课上没有讲太清楚过程。

if i>=1,S=>a (a^m b^j c^k) => a S,  else S => a (b^j c^k) => a A;
if j>=1, A=>b (b^m c^k) => b A, else A => b c^k => b B;
if k>=1, B=>c c^m => c B, else B => c;

所以结果是S->a S | a A, A->b A | b B, B->c B | c

有时需要综合一些方法解决问题,比如ambncndm,把bncn看成A,有S->A|aSd, A-> ϵ |bAc。

方法3:等价方法(Equivalent Method)

典型问题:相等或不等问题

Example 3:Let L3={ ω | ω (a,b)* and there are as many a’s as b’s in ω },Try to construct the grammar G3 from L3.

解决方法:

There are same properties in the two sides of a production.

就是注意满足推导式两边的数量特征一致。

E -> a A | b B | $\epsilon$  =>  S:|a|=|b|, A:|a|+1=|b|, B:|b|+1=|a|
接下来满足刚刚推出的数量特征: A->aAA|bE|b, B->aE|bBB|a

若要求a、b数量不等,则可以:
S->A’| B’; A’->A|AA’; B’->B|BB’
A代表的是b多一个,B代表的是a多一个,不等的意识是a比b多n个或b比a多n个,一个A差一个,两个A就差两个,所以用多个A’或B’就可以实现a和b数量上的差距。

方法4:电路状态转换法(Circuit State Transfer Diagram Method)

典型问题:奇偶问题

Example 4:Let L4={ ω | ω (a,b,c,d)* and the number of a,b appeared in ω is even, the number of c appeared in ω is odd}.

解决步骤

1、Draw the circuit state transfer diagram.画出电路状态转换图。

特点是相邻状态只可以有一位变化
在这一题中我们关注的状态是a,b,c的数量,不关注d的数量。若关注n个量,则画出的状态图中有2n个状态。
step1

2、Determine the start and end states.选定起点和终点

其实起点和终点的选择并不是固定的,如果选择以000为起点,对于一个由a,b,c组成的字符串,若该字符串满足语法,则必定会经过偶数个a,b,奇数个c,因此到达的终点一定是001;相反,若选择001为起点,则最后的终点就是000。我们可以选择任意的状态作为起点,只要起点和终点是对应的。一般来说,我们选择000作为起点或终点。
这题中,我们选择000为起点,对应001为终点。

3、Naming each state in Vn. 命名状态

每个状态都命名为A,B,C这样的非终结符。
STEP3

每条边对应一个产生式,终点状态要加上推导出空的产生式。
step4
这种表述语义上可能有点问题,准确的表述应该是:
step4_1
因为每条边都是双向的,所以这两种说法也没有什么差别。
因此,这一题的最终答案是:

S -> a A | b B | c F | d S
A -> a S | b C | c E | d A
B -> a C | b G | c S | d B
.
.
.
F -> a E | b G | c S | d F | $\epsilon$

个数是(n+m)*2^n

方法5:混合方法(Hybrid Method)

综合使用上述方法解决问题。

Example 5: aibj (i >= 2*j+1, j >= 0)

分析:将i大于2*j+1的部分分开来(方法2),这样变成ama2jbj,把am看成A, 把a2jbj看成B,A是明显的循环,B是对称的(方法1),所以能得到:
S -> AB
A -> aA | a
B -> aaBb | ϵ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值