编译原理问题(一)
单词识别
- 单词识别:识别整数和浮点数
现有一文法如下
(
1
)
E
→
E
+
E
(
2
)
E
→
E
∗
E
(
3
)
E
→
(
E
)
(
4
)
E
→
i
(1)E \rightarrow E + E \\ (2)E \rightarrow E * E \\ (3)E \rightarrow ( E ) \\ (4)E \rightarrow i
(1)E→E+E(2)E→E∗E(3)E→(E)(4)E→i
消除二义性:(添加优先级)
(
1
)
E
→
E
+
T
∣
T
(
2
)
T
→
T
∗
F
∣
F
(
3
)
F
→
(
E
)
∣
i
(1) E \rightarrow E+T\ | \quad T \\ (2) T \rightarrow T*F \ | \quad F \\ (3) F \rightarrow (E) \ | \quad i
(1)E→E+T ∣T(2)T→T∗F ∣F(3)F→(E) ∣i
消除左递归:
方法:有
P
→
P
α
∣
β
P \rightarrow Pα|β
P→Pα∣β的产生式将其替换为形式等价的产生式组:
(
1
)
P
→
β
P
′
(
2
)
P
′
→
α
P
′
|
ε
(1)P\rightarrow βP' \\ (2) P' \rightarrow αP' |\varepsilon
(1)P→βP′(2)P′→αP′|ε
一般而言,若产生式形式为:
A
→
A
α
1
∣
A
α
2
∣
…
∣
A
α
n
∣
β
1
∣
β
2
∣
…
∣
β
m
A→Aα_1|Aα_2|…|Aα_n|β_1|β_2|…|β_m
A→Aα1∣Aα2∣…∣Aαn∣β1∣β2∣…∣βm
将其替换为:
(
1
)
A
→
β
1
B
∣
β
2
B
∣
…
∣
β
m
B
(
2
)
B
→
α
1
B
∣
α
2
B
∣
…
∣
α
n
B
∣
ε
(1)A \rightarrow β_1 B|β_2 B |…|β_m B \\ (2)B \rightarrow α_1 B|α_2 B |…|α_n B|ε
(1)A→β1B∣β2B∣…∣βmB(2)B→α1B∣α2B∣…∣αnB∣ε
将上式消除左递归如下:
(
1
)
E
→
T
E
′
(
2
)
E
′
→
+
T
E
′
∣
ε
(
3
)
T
→
F
T
′
(
4
)
T
′
→
∗
F
T
′
∣
ε
(
5
)
F
→
(
E
)
∣
i
(1)E \rightarrow TE' \\ (2)E' \rightarrow +TE' | \ \varepsilon \\ (3)T \rightarrow FT' \\ (4)T' \rightarrow *FT' \ | \ \varepsilon \\ (5)F \rightarrow (E) \ | \ i
(1)E→TE′(2)E′→+TE′∣ ε(3)T→FT′(4)T′→∗FT′ ∣ ε(5)F→(E) ∣ i
消除回溯:
A
→
δ
α
1
∣
δ
α
2
∣
…
∣
δ
α
n
A→δα1|δα2|…|δαn
A→δα1∣δα2∣…∣δαn 转换成:
(
1
)
A
→
δ
A
′
(
2
)
A
′
→
α
1
∣
α
2
∣
…
∣
α
n
(1)A\rightarrowδA' \\ (2) A' \rightarrowα1|α2|…|αn
(1)A→δA′(2)A′→α1∣α2∣…∣αn
上式的文法产生式: