編譯原理之文法和語言總結與梳理


前言

  一個程序設計語言是一個記號系統,如同自然語言一樣,它的完整定義應包括語法和語義兩個方面。所謂一個語言的語法是指一組規則,用它可以形成和產生一個合適的程序。目前廣泛使用的手段是上下文無關文法,即用上下文無關文法作為程序設計語言語法的描述工具。語法只是定義什么樣的符號序列是合法的,與這此符導的含義落無關系,比如對於個Pascal程序來說,一個上下文無關文法可以定義符號串A:一B+C是一個合乎語法的默值語句,而A:=B+就不是。但是,如果B是實型的,而C是布爾理的,或者B、C中任何一個變量沒有事先說明,則A:=B+C仍不是正確的程序,也就是說程序結構上的這種特點—類型匹配、變量作用域等是無法用上下文無關手段檢查的,這些工作屬於語義分析工作。程序設計語言的語義常常分為兩類:靜態語義和動態語義。靜態語義是一系列限定規則,並確定哪些合乎語法的程序是合適的;動悉語又也稱作運行語義或執行語義,表明程序要做些什么,要計算什么。

  闡明語法的一個工具是文法,這是形式語言理論的基本概念之一。本章將介紹文法和語言的概念,重點討論上下文無關文法及其句型分析中的有關問題。

  闡明語義要比闡明語法困難得多,盡管形式語義學的研究已取得重大進展,但是仍沒有哪一種公認的形式系統可用來自動構造出正確的編譯系統。本書不對形式語義學進行介紹。

 

文法的直觀概念

  在給出文法和語言的形式定義之前,先直觀地認識一下文法的概念。

  當我們表述一種語言時,無非是說明這種語言的句子,如果語言只含有有窮多個句子,則只需列出句子的有窮集就行了,但對於含有無窮多個句子的語言來講,存在着如何給出它的有窮表示的問題。

  以自然語言為例,人們無法列出全部句子,但是人們可以給出一些規則,用這些規則來說明(或者定義)句子的組成結構,如“我是大學生”是漢語的一個句子。漢語句子可以由主部后隨請活而成,構成謂語的是動詞和直接賓話,采用EBNF來表示這種句子的構成規則:

<句子>::=<主語><謂語>

<主語>::=<代詞> | <名詞>

<代詞>::=我 | 你 | 他

<謂語>::=<動詞><直接賓語>

<動詞>::=是 | 學習

<直接賓語>::=<代詞><名詞>

 

符號和符號串

  正如英語是由句子組成的集合,而句子又是由單詞和標點符號組成的序列那樣,程序設計語言Pascal或C語言是由一切Pascal程序或C程序所組成的集合,而程序是由類似i、begin、end的符號以及字母和數字這樣一些基本符號所組成,從字面上看,每個程序都是一個“基本符號”串,假設有一個基本符號集,那么Pascal或C語言可看成是在這個基本符號集上定義的、按一定規則構成的一切基本符號串組成的集合。為了給出語言的形式定義,首先討論符號和符號串的有關概念。

 

文法和語言的形式

  規則,也稱重寫規則產生式生成式,是形如a→b或a::=b的(a,b)有序對,其中。稱為規則的左部,β稱作規則的右部。這里使用的符號→(::=)讀作“定義為”。例如A→a讀作“A定義為a”。也把它說成是一條關於A的規則(產生式)。

 

文法的類型

  自從喬姆斯基(Chomsky)於1956年建立形式語言的描述以來,形式語言的理論發展很快。這種理論對計算機科學有着深刻的影響,特別是對程序設計語言的設計、編譯方法和計算復雜性等方面更有重大的作用。

  喬姆斯基把文法分成4種類型,即0(文法)1(上下文有關的)2(上下文無關的)3(正規文法)。這幾類文法的差別在於對產生式施加不同的限制。

       定義 令G是一個文法,S是文法的開始符號,abo的是文法G的一個句型。如果有S-*→aAo且(A-+→b測標b是句型abo相對於非終結符A的短語。特別地,如果有(A→β是句型abo相對於規則A→b的直接短語(也稱簡單短語)。一個右句型的直接短語稱為該句型的句柄。句柄的概念只適合於右句型。

 

句型的分析

  對於上下文無關文法,語法樹是句型推導過程的幾何表示。語法樹確實將所給句型的結構很直觀地顯示出來了。語法樹是句型結構分析的極好工具。而這里所說的句型分析問題,是說如何知道所給定的符號串是文法的句型。句型的分析就早識別一個符號串是否為某文法的句型,是某個推導的構造過程。進一步說,當給定一個符號串時,試圖按照某文法的規則為該符號串構造推導或語法樹,以此識別出它是該文法的一個句型;當符號串全部由終結符號組成時,就是識別它是不是某文法的句子。因此也有人把語法樹稱為語法分析樹分析樹。對於程序設計語言來說,要識別的是程序設計語言的程序,程序是定義程序設計語言的文法的句子。句型分析是一個識別輸入符號串是否為語法十正確的程序的過程。在語言的編譯實現中,把完成句型分析的程序稱為分析程序識別程序,分析算法又稱識別算法。

 

附加練習 嘗試寫出PL/0 語言的文法。(或者你認為比較好的語言規則)

程序  ::= [<常量說明部分>] [<變量說明部分>] [<過程說明部分>] <語句>

<常量說明部分> ::= CONST<常量定義>{ ,<常量定義>};

<常量定義> ::= <標識符>=<無符號整數>

<無符號整數> ::= <數字>{<數字>}

<數字> ::= 0 | 1 | 2…7 | 8 | 9

標識符i   i ::=<字母> | {<字母> | <數字 >}

表達式e  e ::= [+|-]<項>{<加減運算符><項>}

條件語句  ::= if<條件>then<語句>

賦值語句  ::= <標識符id> := <表達式>

復合語句  ::= begin<語句>{;<語句>}end

函數  ::= <類型說明><函數名><復合語句>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM