關於編譯原理 語法樹 句柄 簡單短語 短語 的區分,經過兩個例子來理解概念以及方法:spa
例子1——語法樹遞歸
S -> a|b|(T) 字符串
T -> TdS|S
Vt={a,b,d,(,)}.Vn={S,T},S是開始符
句型(Sd(T)db)是S的一個推導,其中___是句柄;____是最左素短語;____是該句型的直接短語,_____是短語。 編譯
素短語的概念:它是一個遞歸的定義,至少含有一個終結符,而且除它自身以外再也不含任何更小的素短語,所謂最左素短語就是處於句型最左邊的素短語的短語。而一個算符優先文法G的任何句型的最左素短語是知足如下條件的最左子串NaNb…NcNdN(N是非終結符,a,b,c,d是終結符)編譯原理
實例:句型T+T*F+id,求出其語法樹,可知,T*F是最左素短語,id也是素短語,但不是最左的。
題目中的句型可用下面的語法樹表示:
S
/ | \
( T )
/ | \
T d S
/|\ |
T d S b
| /|\
S ( T ) 原理
一個句型的語法樹中任一子樹葉結點所組成的符號串都是該句型的短語,當子樹中不包含其餘更小的子樹時,該子數葉結點所組成的字符串就是該句型的直接(簡單)短語。
所以本題的短語有S、(T)、b、Sd(T)、Sd(T)db 、(Sd(T)db),直接短語的爲 S 、(T)、b,,句柄爲 S。語法
d不是直接短語,由於d所在的樹還有子樹因此它不是 !
方法
素語是一個短語,它至少含有一個終結符,並且除它自身之外再也不含有更少的素短語,對於句型(Sd(T)db)的素短語是(T)、b.im
語法樹: 每一個句型對應一棵語法樹
句型: 每棵語法樹的葉子結點從左到右排列構成一個句型
短語: 每棵語法樹的子樹的葉子結點從左到右排列構成一個短語
直接短語: 直接短語是指能直接推出葉子節點的根所對應的短語。總結
或者說:每棵語法樹的簡單子樹(只有父子兩層結點)的葉子結點從左到右排列構成一個簡單(直接)短語
句柄: 每棵語法樹的最左簡單子樹(只有父子兩層結點)的葉子結點從左到右排列構成句柄
素短語: 是至少包含一個終結符的短語,但它不能包含其它素短語
最左推導: 在每一個推導過程當中,老是首先考慮對當前最左邊的非終結符號進行推導
最右推導: 在每一個推導過程當中,老是首先考慮對當前最右邊的非終結符號進行推導
例子2——直接推導
已知文法G[S] S::=aB|bA A::=a|aS|bAA B::=aBB|bS|b 句型aabbAb的句柄是 A.a B.ab C.b D.bA
解析:
句型aabbAb的句柄是D: bA; S->aB->aaBB->aabSB->aabbAB->aabbAb 按照最左推導,其中的S->bA這步是最後的直接推導(即它推出的bA再也不被繼續往下推導),雖然B->b也是這樣的,但不是最左的。
總結:
畫語法樹:
一個節點的全部子葉子節點從左到右相連便是該句型的短語
當子樹中不包含其餘更小的子樹時,該子數葉結點所組成的字符串就是該句型的直接(簡單)短語——重點看該子葉子節點的兄弟節點。最左簡單短語爲句柄
句柄 簡單短語 短語 素短語 都是取自句型的一部分