(轉載請表明出處 http://www.cnblogs.com/BlackWalnut/p/4471938.html )
我們知道了詞法分析是專注於一個檢測一個語言中是否有不合格的單詞,以及將單詞進行分類。那么為什么要分類呢?其目的就是為了規范化。只有無限的東西規范到一個范圍內,我們才能對其進行識別和分析。例如,我們定義在加號兩邊只能是兩個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就是起始符號,💲的意思是如果遇到這個符號表示一個文法分析過程的結束。