語法定義:spa
- 文法定義:
- 定義:用以描述程序設計語言語法的表示方法——「上下文無關文法」,簡稱「文法」,文法天然地描述了大多數程序設計語言構造地層次化語法結構
- 實例:
- 相關概念:
-
- 產生式:使用箭頭(→)表示"能夠具備以下形式",用相關變量表示表達式和語句的構造規則產生的式子。每一個生產式包括一個稱爲生產式頭或左部的非終結符號,一個箭頭,和一個稱爲生產式體或右部的由終結符號組成的序列。
- 終結符號:有時也稱爲詞法單元,終結符號是該文法所定義的語言的基本符號的集合
- 字母表中的小寫字母,如 a,b,c
- 黑體串,關鍵字,如 id, while
- 數字 0, 1, … , 9
- 標點符號,如括號,逗號等
- 運算符號,如+, -等
- 空串:零個終結符號組成的串,記爲ε
-
- 非終結符號:有時也稱爲語法變量,每一個非終結符號表示一個終結符號串的集合
- 表示終結符號的序列的變量,如expr和stmt這樣的變量
- 組成:
- 終結符號集合
- 非終結符號集合
- 產生式集合
- 開始符號∈非終結符號集合
- 書寫規定:
- 字母表中後面的大寫字母,如X, Y, Z, 能夠是終結符或非終結符
-
- 字母表中後面的小寫字母,如u, v,… z, 可表明終結符號串
- 小寫希臘字母,如a,b,可表明文法的符號串
- 對於A →a1,A→ a2,… A →an能夠寫成Aa1|a2|…|an
- 除非特別說明,第一個產生式的頭就是開始符號
- 推導:
- 定義:根據文法,首先從開始符號出發,不斷將某個非終結符號替換爲該非終結符號的某個產生式的體;把產生式當作重寫規則,把符號串中的非終結符用其產生式右部的串來代替
- 文法定義的語言:從開始符號推導獲得的全部終結符號串的集合
- 實例:
- 語法分析:
- 定義:接受一個終結符號串做爲輸入,找出從文法的開始符號推導出這個串的方法,若是不能找出,則報告語法錯誤
- 語法分析樹
- 做用:用圖形方式展示了從文法的開始符號推導出相應語言中的符號串的過程
- 性質:
- 根結點是開始符號
- 葉子結點是終結符或ε
- 內部結點是一個非終結符
- 若A→x1x2....xn,則A是一個非終結符,x1x2...xn 是終結符或非終結符
- 爲一個給定的終結符號串構建一棵語法樹的過程稱爲對該符號串進行語法分析
- 結果:一顆語法樹的葉子節點從左向右構成了樹的結果
- 實例:
- 二義性:
- 定義:一個文法,若是存在某個句子不止一棵分析樹,或者說這個句子存在不止一種最左(最右)推導,那麼稱這個文法是二義的
- 緣由: 在產生句子的過程當中某些直接推導有多於一種選擇
- 注意:
- 僅與文法和句子有關,與採用的推導方法無關
- 文法中缺乏對文法符號優先級和結合性的規定
- 實例:
- 運算符的結合性:
- 運算符的左(右)結合性:當一個運算份量左右兩側都有該運算符時,該運算份量屬於其左(右)邊的運算符
- 實例:
![](http://static.javashuo.com/static/loading.gif)
- 圖2-7比較了一個左結合運算符(好比「-」)的語法分析樹和一個右結合運算符(好比「=」)的語法分析樹
- 運算符的優先級:
- 用途:當多種運算符出現時,須要給出一些規則來定義運算符之間的相對優先關係
- 相關概念:
- 因子:
- 定義:能夠理解爲不能被任何運算符分開的表達式,即在任意因子的任意一邊放置一個運算符,都不會致使這個因子的任何部分分離出來,成爲這個運算符的運算份量(括號能夠起到保護不分開的做用)
- 地位:因子自己能夠做爲一個總體成爲運算符的一個運算份量
- 一個(不是因子的)項(term)是一個可能被高優先級的運算符*和/分開,但不能被低優先級運算符分開的表達式
- 一個(不是因子也不是項的)表達式可能被任何一個運算符分開
- 實例:
![](http://static.javashuo.com/static/loading.gif)
參考——《編譯原理(第二版)》、慕課-蘇州大學-王中卿編譯