首先简单介绍一下右线性文法和左线性文法:
上图是一个DFA(确定有限自动机),a是初始状态,f是终止状态。
文法中的“|”可以理解为“或者”。
对应的右线性文法:
A->0|0B|1D(A->0意思是A状态接收0到达终态,由于终态f没有转出,这时候终态f不需要写出来)
B->0D|1C(B->0D意思是B状态接收0到达D状态)
C->0|0B|1D(C->0意思是到达终态,终态f没有转出,不需要再写出来)
D->0D|1D(D->0D意思是D状态接收0到达D状态,就是到达自身)
右线性文法一般的规则:A->0B,A接收0到达B。当A状态接收1到达终态的时候,如果终态只是单纯的终点,没有转出状态,可以写成A->1,终态不用写。
对应的左线性文法:
B->C0|0(B->C0:B状态是C状态接收0得到的;B->0:B状态是初始状态接收0得到的,由于初始状态A没有转入,只有转出,所以可以不写)
C->B1(C状态是B状态接收1得到的)
D->D0|D1|C1|B0|1(D->0意思是D是初态接收0得到的,由于初态只是单纯的起始点,不用写出来)
左线性文法一般的规则:A->B0,B接收0到达A,A是B接收0得到的。当初始状态接收1到达A状态的时候,如果初始状态只是单纯的起点,没有转入状态,可以写成A->1,初始状态不用写。
当需要左右文法转换的时候,往往借助中间的图形进行过渡。
以一个题目来说明:(编译原理课本课后题,P65 15题)
给定右线性文法G:
S -> 0S | 1S | 1A | 0B
A -> 1C | 1
B -> 0C | 0
C -> 0C | 1C | 0 | 1
求一个与G等价的左线性文法。
首先根据右线性文法,画出状态转移图:
如下图,这是一个NFA(非确定的有限自动机):
这里,S是起始状态,但是不是单纯的起点,它接收0或者1能够到达S状态。F是终止状态,是单纯的终点。
根据图,可以写出对应的左线性文法:
F->A1|B0|C0|C1
C->A1|B0|C0|C1
B->S0(B是初始状态S接收0得到的,但是初始状态S并不是单纯的起点,它是状态S接收0/1得到的,所以需要写出来,如果写成B->0,是不对的,表达的不是一个意思,初始状态和终止状态写出来还是不写出来是严格确定的,如果写错,代表的是不同的自动机。)
A->S1
S->S0|S1
左右文法的转换是大差不差的,都可以这么做,只不过要特别注意起始状态和终止状态。