這幾天鄰近期末,感覺上了快一學期的編譯原理的許多方面還是難以理解,今天早上就突然遇到了一道題,求短語,直接短語和句柄的題,突然才發現自己連這些詞的定義都不清楚,於是仔細查了以下,下面分享出來:
短語
書上的定義如下:
書上寫的比較抽象,我這里簡單解釋一下,有兩個文法,分別是:
S=*=>aAp (由於部分字符難以輸入,在此用a,b,p代替)
A=+=>b
我們由此可以畫出他的抽象語法樹,如下:
那么,abp為此句型的短語
總結來說:一個句型的語法樹中任一子樹葉結點所組成的符號串都是該句型的短語,由這概念,那么我們自然可以想到,b也應該是該句型的一個短語。
直接短語
書中的定義:
書中的意思總結來說,指的是如果子樹中不再包含其他的子樹,即A只能推導出b,而b不能再推出其他的式子,則b為此句型的直接短語
句柄
先來看一下書中的定義:
書中的意思就是:直接短語中的最左直接短語為該句型的句柄。
小練習
如何證明E+T*F是句型呢?最簡單的方法就是畫抽象語法樹,如果能畫出對應的抽象語法樹,則就表明此表達式是文法的一個句型。
抽象語法樹如下:
按如上的語法樹可知,E=T*F為此文法的一個句型:
短語: T*F, E+T*F
直接短語:T*F
句柄:T*F
簡析:對於子樹T來說,其所有葉子節點為:T*F,對於E來說,其所有葉子節點為:E+T*F故短語為 T*F 和 E+T*F
這個比較簡單,我們來個比較復雜的題目:
S -> a|b|(T) T -> TdS|S 證明(Sd(T)db)是S的一個句型,並求出短語,直接短語,句柄
此文法的抽象語法樹為:
由此可得S=(Sd(T)db)為此文法的一個句型:
短語:S,(T),b,Sd(T),Sd(T)db,(Sd(T)db)
直接短語:S,(T),b
句柄:S