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


1. 梳理第二章的內容,寫一篇理解與總結。


 

一、 對程序設計語言的描述從語法、語義和語用三個因素考慮:

  • 語法:對語言結構的定義;
  • 語義:語言的含義;
  • 語用:從使用的角度描述語言。

形式語言理論是編譯的理論基礎。

二、 字母表:元素的非空有窮集合;

  • 符號/字符:字母表中的元素;
  • 符號串:符號的有窮序列。

三、 符號串運算:

  • 符號串的連接:εx=xε=x;
  • 集合的乘積:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A;
  • 符號串的冪運算:x=abc,x^2=abcabc;
  • 集合的冪運算
  • 正閉包A+與閉包A*:A*={ε}∪A+

四、 形式語言:字母表上按照某種規則構成的所有符號串的集合,其不考慮語義。描述形式語言的方式有兩種:

  • 枚舉——當語言為有窮集合時;
  • 文法——描述了無窮集合的語言。

五、 文法:G=(Vn,Vt,P,S)

  • 規則P:也稱為產生式,是一個符號與一個符號串的有序對(A,β)

  A→β
  i. 一組規則定義了一個語言的語法結構;
  ii. 規則中出現的符號分為終結符號和非終結符號

  • b) Vn為非終結符(non-terminate);
  • c) Vt為終結符(terminate);
  • d) S為非終結符號,稱為文法的開始符號/識別符號,至少要在一條規則的左部出現。

六、 推導:推導的依據是規則

  • a) 直接推導:僅使用一次規則;
  • b) 推導:至少使用一次規則;
  • c) 廣義推導:經過0步或若干步的推導。
  • d) 最右推導又稱規范推導,推導出的句型為規范舉行;與之對應的最左規約為規范規約。

七、 句型、句子和語言:

  • 句型:S=*>x, x∈(Vn∪Vt)*,其中S=*>x為廣義推導。
  • 句子:S=*>x, x∈Vt*,其中S=*>x為廣義推導,x必須是終結符的閉包(可為ε)。
  • 語言:L(G[S])={x|S=+>x且x屬於Vt*},其中S=+>x為推導,至少使用一次規則。

八、 遞歸:

  • 遞歸規則:在規則的左部和右部具有相同非終結符的規則;

  i. 規則左遞歸:A->A…;
  ii. 規則右遞歸:A->…A;
  iii. 規則遞歸:A->…A…;

  • 文法遞歸:對文法中的任一非終結符,若能建立一個推導過程使得右部再次出現該非終結符,則文法是遞歸的。如:U->Vx, V->Uy|z,雖然這兩個規則都不是遞歸規則,但組成的文法是遞歸文法U->Vx->Uyx。所以含有遞歸規則的文法一定是遞歸文法,而遞歸文法不一定含有遞歸規則。

九、 短語、直接短語和句柄:都是針對某一句型的

  • 短語:S=*>αAδ且A=+>β,則稱β是相對於非終結符A的句型αAδ的短語;對應語法樹中的子樹概念。
  • 直接短語:其中A=>β為直接推導;對應語法樹中的簡單子樹。每個直接短語都是某規則的右部。
  • 句柄:是直接短語(即某規則的右部),且具有最左性;對應簡單子樹中最左的一棵。

十、 文法的二義性:

  定義:如果一個文法存在某個句子對應兩棵不同的語法樹|包含兩個或兩個以上的最右(最左)推導(規約),則該文法是二義性的,可以利用文法之間的等價性來消除二義性。

  • 不改變文法中原有的語法規則,進增加一些語法的非形式定義,如優先級;
  • 構造一個等價的無二義性文法。

十一、 文法的分類:

  • 0型文法/無限制文法:α->β,其中α∈(Vn∪Vt)*且至少含有一個非終結符,β∈(Vn∪Vt)*。
  • 1型文法/上下文有關文法:αAβ->αuβ,其中A∈Vn,α,β∈(Vn∪Vt)*,u∈(Vn∪Vt)+。
  • 2型文法/上下文無關文法:A->β,其中A∈Vn,β∈(Vn∪Vt)*。常用於句法分析。
  • 3型文法/正規文法:常用於詞法分析

  i. 右線性文法:只能對推出式的右邊展開,A->αB|α,A,B∈Vn,α∈Vt*。
  ii. 左線性文法:只能對推出式的左邊展開,A->Bα|α,A,B∈Vn,α∈Vt*。

 


 

 

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


PL/0語言文法的BNF表示:

〈程序〉→〈分程序〉.

〈分程序〉→ [<常量說明部分>][<變量說明部分>][<過程說明部分>]〈語句〉

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

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

 <無符號整數> → <數字>{<數字>}

 <變量說明部分> → VAR<標識符>{ ,<標識符>};

 <標識符> → <字母>{<字母>|<數字>}

 <過程說明部分> → <過程首部><分程序>;{<過程說明部分>}

 <過程首部> → procedure<標識符>;

 <語句> → <賦值語句>|<條件語句>|<當型循環語句>|<過程調用語句>|<讀語句>|   <寫語句>|<復合語句>|<空>

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

 <復合語句> → begin<語句>{;<語句>}end

 <條件> → <表達式><關系運算符><表達式>|odd<表達式>

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

 <項> → <因子>{<乘除運算符><因子>}

 <因子> → <標識符>|<無符號整數>|(<表達式>)

 <加減運符> → +|-

 <乘除運算符> → *|/

 <關系運算符> → =|#|<|<=|>|>=

 <條件語句> → if<條件>then<語句>

 <過程調用語句> → call<標識符>

 <當型循環語句> → while<條件>do<語句>

 <讀語句> → read(<標識符>{,<標識符>})

 <寫語句> → write(<表達式>{,<表達式>})

 <字母> → a|b|c…x|y|z

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

如果一個文法存在某個句子對應兩棵不同的語法樹|包含兩個或兩個以上的最右(最左)推導(規約),則該文法是二義性的,可以利用文法之間的等價性來消除二義性。


免責聲明!

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



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