1.梳理第二章的內容,寫一篇理解與總結。
答:知識梳理1.字母表:一個有限的字符集。例子:C語言的字母表
(1)大小寫英文字母 a ~ z, A ~ Z
(2)數字 0 ~ 9
(3) 特殊字符
2. 單詞符號:是語言中具有獨立意義的最基本結構
3. 語法單位:由單詞符號構成的更大的結構
一般包括: 表達式 語句 分程序(語句塊)函數(有返回值)
語義是指這樣的一組規則,使用它可以定義一個程序的意義。
名字和標識符:
標識符:以字母開頭后跟字母數字組成字符串 例 PI、nm1
名字:當給標識符一定意義時,該標識符成為名字 例 PI :π(圓周率)
(變量名,函數名,類名,常量名,對象名等)
類型:以什么方式存放、大小、運算操作
作用域:全局變量,局部變量,靜態函數
字母表:由若干元素組成的有限非空集合,用∑表示,它的每個元素稱為一個符號。
符號串: 由∑中的符號所構成的有窮序列。
空字:不包含符號的序列稱為空字,記為ε。
V的閉包:
令: V* = V0∪V1∪V2È…
稱 V*是V的閉包。
V的正則包(正閉包,正則閉包):
記V+ = VV*, 稱 V+是V的正則包,即V+ =V1∪V2∪V3È…。
文法是描述語言的語法結構的形式規則(即語法規則)
上下文無關文法的特點
它所定義的語法范疇(或語法單位)是完全獨立於這種范疇可能出現的環境的。
特點:獨立性
缺點:不能用來描述自然語言
一個上下文無關文法G包括四個組成部分:一組終結符號,一組非終結符,一個開始符號,以及一組產生式。
終結符號:乃是組成語言的基本符號,即在程序語言中以前屢次提到的單詞符號,如基本字,標識符,常數,算符和界符等.
非終結符號(也稱語法變量):用來代表語法范疇。如“算術表達式”“布爾表達式”“過程”等。
一個非終結符代表一個一定的語法概念。因此非終結符是一個類(或集合)記號,而不是個體記號。
如:{E,T,F}
開始符號:是一個特殊的非終結符號,它代表所定義的語言中我們最感興趣的語法范疇。
例:P(代表一個程序)
高級語言的定義
任何語言實現的基礎是語言定義,程序語言主要由語法和語義兩個方面定義。語法,即一組規則,一部分稱為詞法規則,另一部分稱為語法規則。語義,即符合構成規范的句子,要考慮意義,是指一組規則,使用它可以定義一個程序的意義。
高級語言的一般特征
程序設計語言的一般特性:程序結構、數據類型與操作、語句、控制結構。(關於標識符的筆記:程序運行時,同一名在不同時間也可代表不同的存儲單元;同意存儲單元也可能有幾個不同的名字。)
程序語言的語法描述
與文法定義有關的幾個術語:字母表,符號,符號串,空字等。【注】用S*表示S上的所有符號穿的全體,空字也包括在其中。符號串的運算有連接,方冪,符號串集合的運算有和,連接積。此外,要注意,V+是V的正則閉包,V+=VV*,相當於無空字符串存在。
上下文無關文法
文法是描述語言的語法結構的形式規則。上下文無關文法所定義的語法范疇是完全獨立於這種范疇可能出現的環境的。不宜於描述任何自然語言。對於一個句子,可以用直接推導或者圖示化的方法來推導。上下文無關文法由四元組組成:一組終結符號(組成語言的基本符號,如基本字、標識符、常數、算符和界符等),一組非終結符號(代表語法范疇,如算術表達式),一個開始符號(特殊非終結符),以及一組產生式(定義語法范疇的書寫規則,一個產生式的形式:A→a)。
語言的定義:
假定G是一個文法,S是它的開始符號。如果S (a (表示從S出發,經0步或若干步可推出a),則稱a是一個句型。僅含終結符號的句型是一個句子。文法G所產生的句子的全體是一個語言,將它記為L(G).
L(G)={a|S a & a∈VT }
要掌握產生式和語言之間的轉換,掌握最左(最右)推導。
語法分析樹與二義性
語法分析樹:簡稱語法樹,用來表示推導過程。
不唯一性:一個句型並不是只對應一棵語法樹。
如果一個文法存在某個句子對應兩顆不同的語法樹,則稱這個文法是二義的。ps:文法二義性≠語言二義性。二義原因:沒有定義運算符優先級和結合性。消除方法:定義優先級和結合性。
2. 嘗試寫出PL/0 語言的文法。(或者你認為比較好的語言規則)
整數n
標識符i
表達式e
條件語句
賦值語句
復合語句
函數
程序
...
答:
<程序> -> <分程序>
<分程序> -> [<常量說明部分>][<變量說明部分>][<過程說明部分>]<語句>
<常量說明部分> -> 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
