语法分析树(Parse Trees)

551 阅读1分钟

1.语法分析树的定义

给出上下文无关文法G=(V,Σ,R,S)G = (V,\Sigma,R,S),其中

V={S,(,)}Σ={(,)}R={Se,SSS,S(S)}\begin{aligned} V &= \{ S,(,) \} \\ \Sigma &= \{ (,) \} \\ R &= \{ S \rightarrow e,\\ &S \rightarrow SS, \\ &S \rightarrow (S)\} \end{aligned}

则字符串()()()()至少可以由如下两种方式推导得到

SSS(S)S()S()(S)()()S \Rightarrow SS \Rightarrow (S)S \Rightarrow ()S \Rightarrow ()(S) \Rightarrow ()()

或者

SSSS(S)(S)(S)(S)()()()S \Rightarrow SS \Rightarrow S(S) \Rightarrow (S)(S) \Rightarrow (S)() \Rightarrow ()()

这两种推导从某种意义上来说是相同的。直观上都能由下图表示:

3-2.png

这样的图称为语法分析树。途中的点叫做顶点,每个顶点有一个标记,标记是VV中的一个符号。最上面的顶点叫做,最底层的顶点叫做树叶。树叶都标记终结符,也可能标记空串ee。从左到右连接树叶的标记,得到推导出来的终结符串,称作语法分析树的结果

2.例子


例3.2.1G=(V,Σ,R,S)G = (V,\Sigma,R,S)是一个上下文无关文法,D=x1x2xnD = x_1 \Rightarrow x_2 \Rightarrow \cdots \Rightarrow x_nD=x1x2xnD' = x_1' \Rightarrow x_2' \Rightarrow \cdots \Rightarrow x_n'GG中的两个推导,其中xi,xiV,i=1,nx_i,x_i' \in V^*,i = 1,\cdots nx1,x1VΣ,xn,xnΣx_1,x_1' \in V - \Sigma,x_n,x_n' \in \Sigma^*。如果n>2n>2且存在整数k,1<k<nk,1<k<n使得

(1)对所有的ik,xi=xi;(2)xk1=xk1=uAvBw,此处u,v,wV,A,BVΣ;(3)xk=uyvBw,此处AyR;(4)xk=uAvzw,此处BzR;(5)xk+1=xk+1=uyvzw;\begin{aligned} &(1)对所有的i \neq k,有x_i = x_i';\\ &(2)x_{k-1} = x_{k-1}' = uAvBw,此处u,v,w \in V^*,A,B \in V-\Sigma; \\ &(3)x_k = uyvBw,此处A \rightarrow y \in R;\\ &(4)x_k' = uAvzw,此处B \rightarrow z \in R;\\ &(5)x_{k+1} = x_{k+1}' = uyvzw; \end{aligned}

则称DD先于DD',记作DDD \prec D'



例3.2.2 考虑下面三个推导

D1=SSS(S)S((S))S(())S(())(S)(())()D2=SSS(S)S((S))S((S))(S)(())(S)(())()D3=SSS(S)S((S))S((S))(S)((S))()(())()\begin{aligned} &D_1 = S \Rightarrow SS \Rightarrow (S)S \Rightarrow ((S))S \Rightarrow (())S \Rightarrow (())(S) \Rightarrow (())() \\ &D_2 = S \Rightarrow SS \Rightarrow (S)S \Rightarrow ((S))S \Rightarrow ((S))(S) \Rightarrow (())(S) \Rightarrow (())() \\ &D_3 = S \Rightarrow SS \Rightarrow (S)S \Rightarrow ((S))S \Rightarrow ((S))(S) \Rightarrow ((S))() \Rightarrow (())() \end{aligned}

可见D1D2D_1 \prec D_2D2D3D_2 \prec D_3,但是没有D1D3D_1 \prec D_3
如果有序对(D,D)(D,D')属于\prec自反对称传递闭包,则称这两个推导是相似的

每一个在相似性下的等价类,即每一颗语法分析树,有一个推导在\prec下是极大的,即没有先于它的推导。
这个推导叫做最左推导。可以从根的标记开始,依据规则反复替换当前字符串中最左边的非终结符得到。
类似的,最右推导是不先于任何其他推导的推导。

3.定理

G=(V,Σ,R,S)G = (V,\Sigma,R,S)是一个上下文无关文法,AVΣA \in V - \Sigma以及wΣw \in \Sigma^*,则下述命题等价

(a)Aw(b)有一颗根为A、结果为w的语法树(c)有最左推导ALw(d)有最右推导ARw\begin{aligned} &(a) A \stackrel{*}{\Rightarrow} w \\ &(b) 有一颗根为A、结果为w的语法树 \\ &(c) 有最左推导A \stackrel{L^*}{\Rightarrow} w \\ &(d) 有最右推导A \stackrel{R^*}{\Rightarrow} w \\ \end{aligned}