編譯原理之詞法分析、語法分析、語義分析
詞法分析(Lexical analysis或Scanning)和詞法分析程式(Lexical analyzer或Scanner)
詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字元一個字元地讀入源程式,即對構成源程式的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程式實現這個任務。詞法分析程式可以使用lex等工具自動生成。
語法分析(Syntax analysis或Parsing)和語法分析程式(Parser)
語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如“程式”,“語句”,“表示式”等等.語法分析程式判斷源程式在結構上是否正確.源程式的結構由上下文無關文法描述.
語義分析(Syntax analysis)
語義分析是編譯過程的一個邏輯階段. 語義分析的任務是對結構上正確的源程式進行上下文有關性質的審查, 進行型別審查.例如一個C程式片斷:
int arr[2],b;
b = arr * 10;
源程式的結構是正確的.
語義分析將審查型別並報告錯誤:不能在表示式中使用一個數組變數,賦值語句的右端和左端的型別不匹配.
Lex
一個詞法分析程式的自動生成工具。它輸入描述構詞規則的一系列正規式,然後構建有窮自動機和這個有窮自動機的一個驅動程式,進而生成一個詞法分析程式.
Yacc
一個語法分析程式的自動生成工具。它接受語言的文法,構造一個LALR(1)分析程式.因為它採用語法制導翻譯的思想,還可以接受用C語言描述的語義動作,從而構造一個編譯程式. Yacc 是 Yet another compiler compiler的縮寫.
源語言(Source language)和源程式(Source program)
被編譯程式翻譯的程式稱為源程式,書寫該程式的語言稱為源語言.
目標語言(Object language or Target language)和目標程式(Object program or Target program)
編譯程式翻譯源程式而得到的結果程式稱為目標程式, 書寫該程式的語言稱為目標語言.
中間語言(中間表示)(Intermediate language(representation))
在進行了語法分析和語義分析階段的工作之後,有的編譯程式將源程式變成一種內部表示形式,這種內部表示形式叫做中間語言或中間表示或中間程式碼。所謂“中間程式碼”是一種結構簡單、含義明確的記號系統,這種記號系統複雜性介於源程式語言和機器語言之間,容易將它翻譯成目的碼。另外,還可以在中間程式碼一級進行與機器無關的優化。
文法(Grammars)
文法是用於描述語言的語法結構的形式規則。文法G定義為四元組(,,,)。其中為非終結符號(或語法實體,或變數)集;為終結符號集;為產生式(也稱規則)的集合;產生式(規則)是形如或 a ::=b 的(a , b)有序對,其中(∪)且至少含有一個非終結符,而(∪)。,和是非空有窮集。稱作識別符號或開始符號,它是一個非終結符,至少要在一條規則中作為左部出現。
一個文法的例子: G=(={A,R},={0,1} ,={A?0R,A?01,R?A1},=A)
文法分類(A hierarchy of Grammars)
著名語言學家Noam Chomsky定義了四類文法和四種形式語言類,文法的四種類型分別是0型、1型、2型和3型。幾類文法的差別在於對產生式施加不同的限制,分別是:
0型文法(短語結構文法)(phrase structure grammars):
設G=(,,,),如果它的每個產生式是這樣一種結構: (∪) 且至少含有一個非終結符,而(∪),則G是一個0型文法。
1型文法(上下文有關文法)(context-sensitive grammars):
設G=(,,,)為一文法,若中的每一個產生式均滿足|,僅僅 除外,則文法G是1型或上下文有關的。
2型文法(上下文無關文法)(context-free grammars):
設G=(,,,),若P中的每一個產生式滿足:是一非終結符,(∪) 則此文法稱為2型的或上下文無關的。
3型文法(正規文法)(regular grammars):
設G=(,,,),若中的每一個產生式的形式都是A→aB或A→a,其中A和B都是非終結,a是終結符,則G是3型文法或正規文法。
0型文法產生的語言稱為0型語言。
1型文法產生的語言稱為1型語言,也稱作上下文有關語言。
2型文法產生的語言稱為2型語言,也稱作上下文無關語言。
3型文法產生的語言稱為3型語言,也稱作正規語言。