現代編譯原理 第二章(語法分析之上下文無關文法)

2022-07-21 04:45:10 字數 1114 閱讀 6061

我們知道了詞法分析是專注於乙個檢測乙個語言中是否有不合格的單詞,以及將單詞進行分類。那麼為什麼要分類呢?其目的就是為了規範化。只有無限的東西規範到乙個範圍內,我們才能對其進行識別和分析。例如,我們定義在加號兩邊只能是兩個id。這樣,如果出現if plus id 這樣的結構就說明是不正確的,其犯了語法錯誤。

從上例可以看出,我們已經從單詞級別的分析轉換到了單詞與單詞之間的關係的分析。他們之間的關係就是我們定義的相關語法。

類似於詞法分析,我們為了描述一類單詞,使用了正規表示式,在這裡,我們為了描述一類語法,我們使用了上下文無關文法。由此可以知道,文法是用來定義句子結構的(單詞與單詞之間的關係),上下文無關文法是指,該文法所定義的所有的句子結構之間是沒有關係的。例如id = id + id,我們不關心id在怎麼來的,經歷了那些東西,我們只關心乙個字元是不是id,以及id的等價形式有那些。

以上只是對文法的感性描述,比較正規的定義是:乙個上下文無關文法包含四個成分,終結符號集合,非終結符號集合,起始符號,產生式集合。

產生式的形式是a->b這種形式,其中左面一定是非終結符,右面是終結符和非終結符的混合。所以,凡事能夠放到左面的符號都成為非終結符,是由語法的設計者定義的。終結符就是不能產生產生式的符號,比如語言中的+,-,),>等。起始符號是非終結符集合中的乙個,表示語法分析從這個符號開始。例如:a->b+c, b->a,c->-c,使用b和c代替第一產生式中的相應部分,就可以得到乙個能不限數字個數的加減法運算表示式。考慮下面乙個文法:

如果使用上面的文法來分析1+2*3這樣的語句,我們就可能得到兩個同的分析過程:

上面的樹形結構就是語法分析樹。採用自底向上的方式來計算表示式,第乙個是(1+2)*3,第二個是1+(2*3)。如果乙個文法對乙個句子進行分析可以產生多個語法分析樹,我們就稱這個文法是二義文法。這個時候計算機就不知道該使用哪個過程了。但是,通常二義文法可以轉化成非二義文法:

上面這個文法就規定了*具有更高的優先順序,且文法是左結合的文法。這裡的s就是起始符號,

現代編譯原理 第二章(語法分析之LL(K))

ll k 語法分析技術是建立在 分析的技術之上的。我們先來了解 分析技術。考慮以下文法 當使用該文法對 1 2 3 4和 1 2 3 進行分析,前者因該呼叫e e t,而後者應該呼叫e t,怎麼確定到底使用哪個產生式呢?這就要使用 分析技術來構建 分析語法分析器,ll k 是其一種。分析技術的關鍵是...

編譯原理 語法分析(二)

在第一篇文章中,我們介紹了如何用上下文無關文法描述一種語言的語法,和如何使用推導和規約構造一棵語法分析樹,以及如何對文法進行轉換使之能夠更適用於語法分析。在本篇文章中,我們將介紹如何使用自頂向下的方法進行語法分析,進一步的,我們將介紹一種更高效的 分析方法。為了下文需要和減少重複,我們先給出在下文中...

編譯原理 語法分析 二

在第一篇文章中,我們介紹了如何用上下文無關文法描述一種語言的語法,和如何使用推導和規約構造一棵語法分析樹,以及如何對文法進行轉換使之能夠更適用於語法分析。在本篇文章中,我們將介紹如何使用自頂向下的方法進行語法分析,進一步的,我們將介紹一種更高效的 分析方法。文法 約定 為了下文需要和減少重複,我們先...