素短語的概念:它是一個遞歸的定義,至少含有一個終結符,並且除它自身之外不再含任何更小的素短語,所謂最左素短語就是處於句型最左邊的素短語的短語。而一個算符優先文法G的任何句型的最左素短語是滿足以下條件的最左子串NaNb…NcNdN(N是非終結符,a,b,c,d是終結符)
實例:句型T+T*F+id,求出其語法樹,可知,T*F是最左素短語,id也是素短語,但不是最左的。
短語和直接短語的概念:一個句型的語法樹中任一子樹葉結點所組成的符號串都是該句型的短語,當子樹中不包含其他更小的子樹時,該子數葉結點所組成的字符串就是該句型的直接(簡單)短語。
句柄的概念:一個句型的最左直接短語匯稱爲該句型的句柄
例子1:
E->T|E+T
T->F|T*F
F-> (E) | i
給出句型T*F+i的最右推導。
1.首先通過最右推導(也叫規範推導):
E=>E+T=>E+F=>E+i=>T+i=>T*F+i
2.畫出語法樹
E
/ | \
E + T
| |
T F
/ | \ |
T * F i
因此本題的直接短語的爲 T*F、i,短語有T*F+i, T*F, i。句柄是T*F.
+號不是直接短語,因爲+所在的樹中那個E,T結點還推出來一顆子樹,所以它不是。
例子2
S -> a|b|(T)
T -> TdS|S
題目中的句型可用下面的語法樹表示:
S
/ | \
( T )
/ | \
T d S
/ | \ |
T d S b
| / | \
S ( T )
因此本題的直接短語的爲S 、(T)、b,短語有S、(T)、b、Sd(T)、Sd(T)db 、(Sd(T)db)。
d不是直接短語,因爲d所在的樹中那個T結點還推出來一顆子樹,所以它不是。
素語是一個短語,它至少含有一個終結符,而且除它自身以外不再含有更少的素短語,對於句型(Sd(T)db)的素短語是(T)、b.
除了畫語法樹,還可以通過直接推導的結果,不過個人覺得很容易出錯,我們還是畫語法樹吧。
收集了一些總結,方便查詢。
每個句型對應一棵語法樹
每棵語法樹的葉子結點從左到右排列構成一個句型
每棵語法樹的子樹的葉子結點從左到右排列構成一個短語
每棵語法樹的簡單子樹(只有父子兩層結點)的葉子結點從左到右排列構成一個簡單(直接)短語
每棵語法樹的最左簡單子樹(只有父子兩層結點)的葉子結點從左到右排列構成句柄
素短語是至少包含一個終結符的短語,但它不能包含其它素短語
最左推導:在每個推導過程中,總是首先考慮對當前最左邊的非終結符號進行推導
最右推導:在每個推導過程中,總是首先考慮對當前最右邊的非終結符號進行推導
嗯,今天的複習總結到這。