编译原理与编译构造 由语言构造文法2

方法3 等价法

基本思想:产生的两边应该具有相同的特性

例1:

L={w|w(a,b),and there are same as and bs in w}

解:

  1. SaA|bB 这一步是说,句子可以以a|b开头,之后加一个ab数量不等的式子

其中,S:|a|=|b|A:|a|+1=|b|B:|a|=|b|+1

  1. AaAA 这一步比较神,但是我的理解是这样的,aA这个表达式,满足|a|=|b|,因此直接是在A之前加了一个aA来进行扩充

AbS 这一步我是这么理解的,其实与上一步没有什么区别,就是S满足|a|=|b|,前面加一个b进行扩充

Ab 这是前面提过的特殊情况

也就是说

AaAA|bS|b

  1. BaS|bBB|a 同前面

例2:

L={w|w(a,b),|a||b|}

解:

  1. SA|B

其中,A|a|<|b|B|b|<|a|

AA|AA BB|BB

其中,A:|a|+1=|b| B:|a|=|b|+1

  1. CaA|bB|ϵ

    AaAA|bC|b

    BaC|bBB|a

    其中,C:|a|=|b|

    可以看出,第2步就是例1

方法4 电路状态转换图法

这是翟老师独创的方法,主要用于解决奇偶性问题

例:

L={w|w(a,b,c,d),and the number as , bs and cs in w are odd}

方法:

  1. 构造转换图

这一步其实是最重要的,但是目前没有较好的展现形式

假设有n个符号关系到奇偶性,就有2n个状态

一系列的状态用0、1来表示,0表示为奇数,1表示为偶数,例如abcd分别为奇偶偶奇,那么就表示为1001

一个状态对应一个节点,一个转换关系对应一条边,如果通过一次变换能得到另外一个状态,那么这两个状态之间有一条边。在这里,一次变换是指将其中的一个1变成0,或者将其中的一个0变成1。就比如,0000可以变成0001,也可以变成0010,也可以变成0100,也可以变成1000。很显然,一个长度为n的串所表示的任意一个状态,有n条边与别的状态相连,也就是有n条与别的点相连的边。对于每个无关奇偶性的字符,每一个点对每一个字符串增加一个自环。例如题目中,d的奇偶性无关,那么就直接在每个点上增加一个d的自环。

注意,初始状态需要在外面加一个箭头,表示起始;结束状态需要在原来的圆外面再加一个圆表示结束。

假设有n个符号关系到奇偶性,就有2n(n+m)条边

  1. 确定开始状态和结束状态
    1. 结束状态为全零,开始状态根据需要来确定
      1. 开始状态为全零,结束状态根据需要来确定
  2. 命名每个状态

这里就用ABCD之类的来命名

用S表示开始,其余用大写字母即可。

  1. 写下每条边的过程

由1中的结论,我们知道显然是需要2n(n+m)条边的,但是结束状态还需要加一条边,就是Eϵ,因此总共需要写2n(n+m)+1个式子

终态必须加上ϵ 产生式

方法5 综合法

综合法就是综合运用方法1-4

你可能感兴趣的:(编译原理与编译构造)