自上而下的的语法分析
|字数总计:1.2k|阅读时长:5分钟|阅读量:|
自上而下的语法分析
面临的问题
文法左递归
一个文法是含有左递归的,如果存在非终结符P
P→Pα
当产生左递归时,词法分析流没有向前进行任何的推进,而语法树却在不断地进行扩展,此时会使得分析器陷入死循环,故需要避免左递归。
回溯问题
每一步的语法分析,都面临这多个侯选式的选取问题,分析过程中,当一个非终结符用某个候选匹配成功时,这种匹配只是暂时的,当下一步出错时且无路可选时,不得不进行“回溯”操作,而这种回溯操作需要恢复先前的分析结果比较消耗性能。
构造不带回溯的自上而下的分析算法
消除文法左递归
直接左递归消除
P→Pα∣β
其中α、β∈(VT∪VN)∗,β不以A打头
则可改写为如下右递归形式
P→βP′
P′→αP′∣ε
推广
假定关于P的全部产生式为
P→Pα1∣Pα2∣...∣Pαm∣β1∣β2∣...∣βn
(每个α都不等于ε,每个β都不以P开头)
则可改写为如下右递归形式
P→β1P′∣β2P′∣...∣β1P′
P′→α1P′∣α2P′∣...∣αmP′∣
习题
给定文法G(E):
E→E+T∣T
T→T∗F∣F
F→(E)∣i
消除该文法的直接左递归:
E→TE′
E′→+TE′∣ε
T→FT′
T′→∗FT′∣ε
F→(E)∣i
间接左递归消除
文法能够消除左递归的条件
- 不含有以ε为右部的产生式
- 不含回路P→+P(+代表一步以上的推导,*代表任意次推导)
习题
给定文法G[S]:
S→Qc∣c
Q→Rb∣b
R→Sa∣a
不存在直接左递归,但S、Q、R都是左递归的
S→Qc→Rbc→Sabc
S→SA∣B
A→abc
B→abc∣bc∣c
S→BS′→abcS′∣bcS′∣cS′
S′→AS′∣ε→abcS′∣ε
即消除左递归后为:
S→abcS′∣bcS′∣cS′
S′→abcS′∣ε
消除回溯
对于如下推导,选取A→αi使得此次候选所匹配的工作结果是确信的无误的,便可以消除回溯。若其中的某次匹配错误,那么可以确定,输入的串不是S的句子。
故现在需要根据当前IP指针指向的词法Token去选取一个适当的产生式进行推导。
选取规则如下:
FIRST集合
故可以定义FIRST集合如下:
令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为:
FIRST(α)={α∣α⇒∗α...,α∈VT}
特别地,若α⇒∗ε,则规定ε∈FIRST(α)。
若非终结符A的所有候选首符集两两不相交,即对于A的任意两个不同的候选αi,αj
FIRST(αi)∩FIRST(αj)=ϕ
则可以从A→α1∣α2∣...∣αn中精确地选取一个候选式去执行任务。
提取公共左因子
假定关于A的规则是
A→δβ1∣δβ2∣...∣δβn∣γ1∣γ2∣...∣γm
那么,可以将这些规则改写为
A→δA′∣γ1∣γ2∣...∣γm
A′→β1∣β2∣β1∣
经过反复提取左因子,就能够把每个非终结符的所有候选首符集变成为两两不相交。
FOLLOW集合
未完待续