710 likes | 1.03k Views
第二章 程式語言的語法. 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司. 基本定義 文法四要素 文法的分類 正規文法分類 B.N.F. 文法 剖析樹. 模擬兩可的文法 懸置 else 問題 描述程式語言語法的方式 語意的描述 精選習題. 大綱. 基本定義. 字元集 一組有限符號的集合稱之為字元 集 字元集有二類 ASCII Code Set EBCDIC Code Set. 基本定義. ASCII Code Set
E N D
第二章 程式語言的語法 陳維魁 博士 wkchen@pchome.com.tw 儒林圖書公司
基本定義 文法四要素 文法的分類 正規文法分類 B.N.F.文法 剖析樹 模擬兩可的文法 懸置else問題 描述程式語言語法的方式 語意的描述 精選習題 大綱
基本定義 • 字元集 • 一組有限符號的集合稱之為字元 集 • 字元集有二類 • ASCII Code Set • EBCDIC Code Set
基本定義 • ASCII Code Set • American Standard Code for Information Interchange 的縮寫 • 標準的 ASCII Code 有7個位元 • 可表示 27 = 128 種不同的字元 • 一般使用在 IBM PC 及Apple II上 • 現今使用的 ASCII Code 已經擴充為8個位 元,稱之為 ASCII-8
基本定義 • EBCDIC Code Set • Extended Binary Code Decimal Interchange Code 的縮寫 • 標準的EBCDIC Code有8個位元 • 可表示 28=256 種不同的字元 • 一般使用在IBM 360及FACOM機器上
基本定義 • 字串(String) • 定義 • S=t1t2...tn, ti T 其中 T 為字元集 • S 是由 T 中的字元所組成的一串列 • n=4 則 S 可能為 abcd,ABCD,AEFG 等等 • 字串的長度 • 設 S=t1t2...tn則 S 的長度可表為│S│=n • S 的長度為 n
基本定義 • 字串的連接 • 設 p 與 q 為二字串且 p=m1m2…mu ,q=n1n2…nv • p‧q=m1m2...mun1n2...nv • 表示二字串的連接且│p‧q│=u+v • p‧q 字串的長度為 u+v
基本定義 • 空字串 • 通常以 “ε”表示空字串,且│ε│=0, • 有時空字串也可以 “”表示
基本定義 • T* • 由 T 中的字元所組成任意長度 的字串的集合 • 實例 • 假設 T={p,q} 則T*={ε,p,q,pp,qq,pq,qp,pppp...}
基本定義 • 語言 (Language) • 若 L 為一語言,則 L 是T* 的一組子集合(subset) • T是字元集合 • 實例 • 假設 T={p,q} 則 L 可為 {p,pq,qp,...}或 {ppp,qqq,pqp,qpq,...} 等等 • 只要是T* 的子集合即可
基本定義 • 語言的乘積(product) • L1 與 L2 的乘積 • L1‧L2={a‧b│a L1,b L2} • 範例 • L1={p,q}L2={m,n,mn,nm} • L1‧L2={pm,pn,pmn,pnm,qm,qn, qmn,qnm}
基本定義 • 語言 L 的次方 (Power) 定義 • Lo={ε}Ln=L‧Ln-1 • 範例 • 假設 L={p,pq,q} • L0={ε} ,L1=L,L2=L‧L,….
基本定義 • L*的定義 • L*又稱“Kleene Closure of L” • L 做任意次乘積(product) 的集合 • L*=L0L1L2...Ln...
基本定義 • L+的定義 • 又稱為“Transitive Closure of L” • L+=L1L2L3...Ln...
文法四要素 • T • 終端符號 • 表示不能再以其他符號來替代 • N • 非終端符號 • 表示可以再以其他符號來替代 • 而N與T須具以下的關係:N∩T=Ø
文法四要素 • S • starting symbol • 起始符號 • 從事文法推演之步驟由S開始 • P • production rule • 文法產生規則
文法的分類 • Type 0 • 無任何限制 • Type 1 • Context sensitive grammar • Type 2 • Context free grammar • Type 3 • 正規文法 (regular grammar)
正規文法分類 • 右線性正規文法 • right linear regular grammar • 文法產生規需滿足 • AuB or A u,其中A,BN,u T • 左線性正規文法 • left linear regular grammar • 文法產生規則需滿足 • uAB or A u,其中A,BN,u T
B.N.F.文法 • B.N.F. grammar • Backus Naur Form grammar • type 2 grammar • context-free grammar
B.N.F.文法符號 • “::=” • 表示“定義為” • “{}” • 表示出現0次,1次,... • “〔〕” • 表示出現0次或1次 • “∣” • 表示“OR” • ”< >” • 表示非終端符號
範例練習 • <expr>::=<expr>+<expr> • <expr>::=<expr>-<expr> • <expr>::=<expr>*<expr> • <expr>::=<expr>/<expr> • <expr>::=(<expr>) • <expr>::=id • 請推出 a+b*c-(d+e)/f
剖析樹 (parse tree) • 定義 • 根據語言的 B.N.F. 描述,將運算式轉換成相對應的樹狀結構,則稱此樹狀結構為剖析樹
練習 • <assign>-><id>:=<expr> • <id>->A|B|C • <expr>-><id>+<expr> • <expr>-><id>*<expr> • <expr>->(<expr>) • <expr>-><id> • 請推導 A:=B*(A+C)
範例 • Using the following B.N.F. grammar to construct a parse tree for the statement below A:=B DIV 10 + C×D • <assign>::=id:=<exp> • <exp>::=<term>∣<exp>+<term>∣<exp>-<term> • <term>::=<factor>∣<term>×<factor>∣<term> DIV <factor> • <factor>::=id∣int∣(<exp>)
推導過程 • <assign> ::= id := <exp> := <exp> + <term> := <term> + <term> := <term> DIV <factor> + <term> := <factor> DIV <factor> + <term> := id DIV <factor> + <term> := id DIV int + <term> :=id DIV int + <term> * <factor> :=id DIV int + <factor> * <factor> := id DIV int + id * <factor> := id DIV int + id * id
範例練習 • S::=AxSy|uB • A::=v| ε • B::=zS| ε • 建構 AxuzSy 並畫出剖析樹
練習 • <assign>-><id>=<expr> • <id>->A|B|C • <expr>-><expr>+<term>|<term> • <term>-><term>*<factor>|<factor> • <factor>->(<expr>)|<id> • A=A*(B+C*B)
練習 • <S>-><A>a<B>b • <A>-><A>b|b • <B>->a<B>|a • 1 baab5 bbaabb • 2 bbbab 6 bbaaaa • 3 bbaaaaa • 4 bbaab
模擬兩可的文法 • ambiguous grammar-(背起來) • 根據語言的 B.N.F. 描述,對同一句子(sentence)可繪出二個或二個以上不同的剖析樹,則稱此語言的文法是模擬兩可的
Draw 2 different parse tree for id+id+id, using the grammar E→E+E∣id 模擬兩可的文法 對id+id+id可畫出二個不同的剖析樹如下 故此文法是模擬兩可的
模擬兩可的文法 • Is the following grammar ambiguous? Describe your response carefully? S→aSbS∣bSaS∣ε 如 abab 1. S 2. S a S b S a S b S b S a S ε a S b S ε ε ε ε
練習 • <assign>-><id>:=<expr> • <id>->A|B|C • <expr>-><expr>+<expr> • <expr>-><expr>*<expr> • <expr>->(<expr>) • <expr>-><id> • 推導A:=B+C*A 兩棵剖析樹
解決模擬兩可的問題方法 • 運算子優先順序 讓*優先於+ • 運算子結合性 • 左結合性:由左向右運算 • 右結合性:由右向左運算
範例 • <assign>-><id>:=<expr> • <id>->A|B|C • <expr>-><expr>+<term>|<term> • <term>-><term>*<factor>|<factor> • <factor>->(<expr>)|<id>
先定義的優先順序愈低 • <expr>-><expr>+<term>中的<expr>在左手邊,是左結合性 • 從上頁規則推導 • A:=B+C*A • A:=B+C+A
練習 • 請證明下列文法是模擬兩可的 • <S>-><A> • <A>-><A>+<A>|<id> • <id>->a|b|c
懸置else問題 • dangling else (懸置else)的意義 若有一敘述如下: if條件A then if條件B then E1 else E2 則else將無法確定要與第一個或第二個 if結合這種現象,就是所謂的 dangling else問題
例如 • <if_stmt>->IF<expr>then<stmt> |If<expr>then<stmt>else<stmt> • <stmt>-><if_stmt>|S1|S2 • <expr>->X=0|Y=0 • 推IFX=0 THEN IF Y=0 THEN S1 ELSE S2 • 產生兩棵剖析樹
懸置else問題 • 各種語言解決 dangling else的方法 • PASCAL • 利用begin-end作為分界,來解決懸置else問題 • If …then begin if ….then ….else ….end • ALGOL 60 • 利用begin-end作為分界,來解決懸置else問題 • ALGOL 68 • 利用if...fi作為分界,來解決懸置else的問題 • If …then if … then ...else …fifi • 近代高階程式語言 • 多利用”最接近未結合原則”來解決此問題 • If …if… <執行>; else <執行> • If… {if …<執行>;}else <執行>;
描述程式語言語法的方式 • B.N.F.法 • 請參考sec. 2-4之敘述 • 語法圖(Syntax Diagram) • 推移圖(Transition Diagram)
語法圖 • :表示非終端符號 • :表示終端符號 • P::=Q1│Q2│‧‧‧│Qn
語法圖 • P::=Q1 Q2‧‧‧Qn • P::={Q} 代表0 or 1 or 2 ……
推移圖 • 1+0+對應的推移圖 1+代表至少一次1到無窮次1 其中S0為起始狀態,而S2為終止狀態
推移圖 • 10*1+對應的推移圖 0*代表可能0次到無窮次 其中S0為起始狀態,而S2為終止狀態
推移圖 • 10*110*1 對應的推移圖 其中S0為起始狀態,而S4為終止狀態
範例練習 • 1+0*110*1+對應的推移圖 • 1+0*1*1+0*1+對應的推移圖 • 1+0*1*1+0*1+ 0*1*對應的推移圖
語意的描述 • 靜態語意(static semantics) • 動態語意(dynamic semantics) • 解釋型語意(interpretive semantics) • 公理型語意(axiomatic semantics) • 符號型語意(denotational semantics)
靜態語意 • 意義 • 由於有許多語言規則沒有辦法單純的用BNF文法來做一個描述,因此必需要用其他的規則來加以處理 • 作法 • 在程式執行之前或語言處理器翻譯時處理 • 範例 • 變數必須先宣告再引用 • 屬性文法(attribute grammar) • 屬性文法是一種可以描述靜態語意之方法,加入 • 1屬性: 附屬於文法符號,與變數類似,可以指定值給他們 • 2語意函數:附屬於語法規則,描述屬性值如何計算之函數 • 3述詞函數:附屬於語法規則,用於語法和語意之檢查
動態語意 • 解釋型語意(interpretive semantics) • 公理型語意(axiomatic semantics) • 符號型語意(denotational semantics)