從頂部的根節點到底部的葉節點分析方法叫做自頂向下分析。我們知道頂部的根節點可以表示成乙個文法的開始符號s,所以說,自頂向下分析可以看成是從文法的開始符號s推導出詞串w的過程。
例如,我們以輸入id + (id + id)為例分析自頂向下的分析方法。首先從開始符號e(也就是樹的根節點)開始推導。首先用第乙個產生式生成三個子節點。然後對新的e => ( e )等等,知道把根節點的e替換成 id + (id + id). 因為這些都在樹的葉節點上,所以這個句子也就是該語言的乙個句子。
在自底向上的分析中,總是採用最左歸約的方式,也就是產生式每次都把最左邊的符號進行歸約。和他對應的逆過程是最右推導。我們來看乙個例子:
比如說輸入為id + id * id,我們如何自頂向下的構造分析樹呢?
首先從開始符號e開始。因為e只有乙個產生式 e -> te'那麼就用這個產生式推導,展開。之後從左到右分析t和e'.因為t也只有乙個產生式,所以用此產生式推導,有t -> ft'。 然後再對樹的最左邊f節點進行分析。f有兩個產生式: f->(e)或者f->id。因為輸入指標指向的是id,所以用第二個產生式,形成了輸入的最左邊。
之後輸入指標右移,指向的+。而我們看t'的產生式是*ft'或者e,那麼只能選擇空串e. 之後在看右邊e'展開有e' -> +te',+ 對上; 輸入的+,那麼輸入指標右移,看t。 諸如此類,最後展開成所有的非終結符在葉子節點上。從左到右看就是id + (id * id).
編譯原理之自頂向下分析
編譯原理之自頂向下分析 daywolf原創 自頂向下分析演算法通過最左推導中描敘出各個步驟來分析記號串輸入,一般用遞迴下降分析和ll 1 分析。其中ll 1 分析表示從左向右地處理輸入,它為輸入串描述乙個最左推導,只用乙個符號來 分析的方向。現在在一般的程式裡都是使用ll 1 分析方法,我們在這裡就...
編譯原理 自頂向下語法分析
對於任何輸入串,從文法開始符號 根節點 出發,自上而下,從左到右地為輸入串建立語法分析樹。簡而言之,就是尋找輸入串的最左推導的過程。之前我們了解到,一旦有左遞迴存在便無法構建這樣的語法樹,所以用自頂向下語法分析必須先去除左遞迴。同樣,由於使用最左推導,也不能處理有複雜回溯的輸入串。自頂向下的語法分析...
編譯原理 自頂向下分析中FIRST集的計算
的first集,即first 被定義為 可從 推導得到的串的首符號的集合,其中 是任意的文法符號串。如果 經過若干步的推導得到乙個 那麼 也在first 中。比如 a c a可以推導出c 這個串,這個串的首符號為c,因此c在first a 中。e te e可以推導出 te,而 te的首符號為 並且e...