自上而下的語法分析:(推導)
由根節點到葉節點
※最左推導和最右推導
(每一步替換最左邊的非終結符/每一步替換最右邊的非終結符),最右推導稱爲規範推導。最右推導對應於最左規約(規範規約)
例:
文法:
S--->AB
A--->a|t
B---->+CD
C--->a
D---->a
最右推導:
S--->AB---->A+CD--->A+Ca---->A+aa----->a+aa
最左推導:
S---->AB----->aB--->a+CD--->a+aD----->a+aa
自上而下文法設計所要注意的:
※※左遞歸:
左遞歸會使分析進入到無限循環之中
直接左遞歸和間接左遞歸
直接左遞歸:如果A→A α,則稱文法G是直接左遞歸的
消除左遞歸
消除簡單的左遞歸:
對於含有左遞歸的產生式 A→A α| β
可用下面的非左遞歸的產生式 代替:
A→ β A’
A’ → αA’| ε
消除左遞歸例:
一般情況消除左遞歸:
對於一般情況而言,若某一文法G的產生式具有如下形式:
則可用如下方法消除左遞歸:
間接左遞歸:
S→Qc→Rbc→Sabc,出現了左遞歸
消除以上文法的間接左遞歸:
1.將非終結符排序爲R、Q、S
2.R不存在左遞歸,將R代入Q:
Q → Sab|ab|b
3. Q不存在左遞歸,將Q代入S
S→ Sabc|abc|bc|c
4.消除直接左遞歸後,得文法:
化簡得:
※※提取左因子:
(如果最左邊的是一樣的,就不明確下一步應該走哪條路)
比如文法:P →(Q)|aP|a
遇到a,是P→aP,還是P→a?
提取左因子的算法: