编译原理--正则文法与正则表达式

  • 对任何正则文法G,存在定义同一语言的正则表达式r
  • 对任何正则表达式r,存在生成同一语言的正则文法G

正则文法到正则表达式的转换

  1. 将正则文法中的每个非终结符表示成关于它的一个正则表达式方程,获得一个联立方程组
  2. 依照求解规则:
    • x = α x ∣ β x=\alpha x | \beta x=αxβ(若 x = α x + β x=\alpha x + \beta x=αx+β),则解为: x = α ∗ β x=\alpha^*\beta x=αβ
    • x = x α ∣ β x=x\alpha | \beta x=xαβ(若 x = x α + β x=x\alpha + \beta x=xα+β),则解为 x = β x ∗ x=\beta x^* x=βx

以及正则表达式的代数定理,求文法开始符号的正规式方程组的解。这个解释关于该文法开始符号S的一个正规式。

例:

设有正则文法G:
Z → 0 A Z \to 0A Z0A

A → 0 A ∣ 0 B A \to 0A | 0B A0A0B

B → 1 A ∣ ϵ B\to 1A|\epsilon B1Aϵ

试给出该文法生成语言的正则表达式

  • 首先给出相应正则表达式方程组(即用+代替正则表达式|

Z → 0 A Z \to 0A Z0A
2.
A → 0 A + 0 B A \to 0A + 0B A0A+0B
3.
B → 1 A + ϵ B\to 1A+\epsilon B1A+ϵ

将3式代入2式中得,
4.
A = 0 A + 01 A + 0 A = 0A + 01A + 0 A=0A+01A+0
对4式利用分配率:
5.
A = ( 0 + 01 ) A + 0 A = (0+01)A + 0 A=(0+01)A+0

对5式使用求解规则
6.
A = ( 0 + 01 ) ∗ 0 A=(0+01)^*0 A=(0+01)0

将式6代入式1中的A得:
Z = 0 ( 0 + 01 ) ∗ 0 Z=0(0+01)^*0 Z=0(0+01)0

正则表达式到正则文法的转换

字母表 ∑ \sum 上的正则表达式到正则文法 G = ( V N , V T , P , S ) G=(V_N, V_T,P,S) G=(VN,VT,P,S)的转换方法如下:

  • V T = ∑ V_T=\sum VT=
  • 对任意正则表达式R选择一个非终结符Z生成规则 Z → R Z \to R ZR,并令 S = Z S=Z S=Z
  • a a a b b b都是正则表达式,对形如 A → a b A\to ab Aab的规则转换成 A → a B A \to aB AaB B → b B\to b Bb两规则,其中B是新增的非终结符
  • 在已转换的文法中,将形如 A → a ∗ b A \to a^*b Aab的规则进一步转换成 A → a A ∣ b A \to aA | b AaAb
  • 不断利用第三和第四条规则进行变换,直到每条规则最多含有一个终结符

例如:

R = ( a ∣ b ) ( a a ) ∗ ( a ∣ b ) R=(a|b)(aa)^*(a|b) R=(ab)(aa)(ab)转换成相应的正则文法

A A A是文法开始符号,根据第二条规则可变换为:
A → ( a ∣ b ) ( a a ) ∗ ( a ∣ b ) A \to (a|b)(aa)^*(a|b) A(ab)(aa)(ab)

根据第三条规则变换为:

A → ( a ∣ b ) B A \to (a|b)B A(ab)B

B → ( a a ) ∗ ( a ∣ b ) B \to (aa)^*(a|b) B(aa)(ab)

根据第四条规则变换为:
A → a B ∣ b B A \to aB|bB AaBbB

B → a a B ∣ a ∣ b B \to aaB|a|b BaaBab

根据第五条规则变换为:
A → a B ∣ b B A \to aB|bB AaBbB

B → a C ∣ a ∣ b B \to aC|a|b BaCab

C → a B C\to aB CaB

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