日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[XJTUSE编译原理] 第三章 上下文无关文法

發(fā)布時(shí)間:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [XJTUSE编译原理] 第三章 上下文无关文法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 第三章 上下文無關(guān)文法
    • 3.1 引言
    • 3.2 文法與語言
      • 定義
      • 各個(gè)符號(hào)的意義
      • 習(xí)慣記號(hào)
      • 推導(dǎo)與語言
    • 3.3 語法樹與二義性
      • 語法樹
      • 二義性
    • 參考資料

第三章 上下文無關(guān)文法

目的:

對(duì)語言的語法結(jié)構(gòu)進(jìn)行形式描述

從形式描述中,研究語法分析器的構(gòu)造(分析法遞歸子程序和算符優(yōu)先分析法)

3.1 引言

文法:是描述語言的語法結(jié)構(gòu)的形式規(guī)則(即語法規(guī)則),是為了解決語言的有窮說明問題,包含對(duì)語法的描述,但是不表達(dá)任何語義

文法的描述應(yīng)該達(dá)到以下要求:形式上嚴(yán)格,準(zhǔn)確;易于理解;描述能力強(qiáng);有利于句子的分析和翻譯,構(gòu)造語法分析器

文法的分類:分為四類(0,1,2,3型文法);與程序語言語法有關(guān)的是上下文無關(guān)文法

上下文無關(guān)文法的特點(diǎn):它所定義的語法范疇(或語法單位)完全獨(dú)立于這種范疇可能出現(xiàn)的環(huán)境。

上寫文無關(guān)文法只能描述一部分語言,但是已經(jīng)足夠描述現(xiàn)今的程序設(shè)計(jì)語言

自然語言要用別的描述方法

3.2 文法與語言

定義

一個(gè)上下文無關(guān)文法G是一個(gè)四元式(VT,VN,S,P)(V_T,V_N,S,P)(VT?,VN?,S,P)

VNV_NVN?:是非空有限集合,它的每個(gè)元素是非終結(jié)符號(hào)

VTV_TVT?:是非空有限集合,它的每個(gè)元素是終結(jié)符號(hào)

VN∩VN=?VT∪VN=VV_N\cap V_N=\empty\qquad V_T\cup V_N=VVN?VN?=?VT?VN?=V

SSSS∈VNS\in V_NSVN?,稱為開始符號(hào)(相當(dāng)于有限自動(dòng)機(jī)的初態(tài))

P\mathscr{P}P:產(chǎn)生式集合(有限),每個(gè)產(chǎn)生式是

{P→α∣P∈VN,α∈(VT∪VN)?,S至少一次為P}\{P\rightarrow \alpha|P\in V_N,\alpha \in (V_T\cup V_N)^* ,S至少一次為P\}{PαPVN?,α(VT?VN?)?,SP},S即要在左邊至少出現(xiàn)一次

→\rightarrow" 相當(dāng)于isdefinedasis\ defined \ asis?defined?as

舉例:考慮以下算數(shù)表達(dá)式的文法以及語言

VTV_TVT?: id + - * / ↑ ( )
VNV_NVN?:表達(dá)式、運(yùn)算符
SSS: 表達(dá)式
P\mathscr{P}P: 表達(dá)式->表達(dá)式 運(yùn)算符 表達(dá)式
表達(dá)式->(表達(dá)式)
表達(dá)式->— 表達(dá)式
表達(dá)式-> id
運(yùn)算符->+|-|*|/|↑

得到文法G1(E) : E->EAE|(E)|-E|id A->+|-|*|/|↑

由此可見,文法G1(E)所定義的語言是算術(shù)表達(dá)式,如id+id,id*(id+id)等

它表達(dá)了簡單算術(shù)表達(dá)式由id用A連接起來

該文法的:

1?? VNV_NVN?是出現(xiàn)在P的左部所有符號(hào)集合

2?? V是P\mathscr{P}P的所有符號(hào):VT=V/VNV_T=V/V_NVT?=V/VN?

3?? S是該文法所定義的句子名字

4?? 寫出了P\mathscr{P}P,就能找出其它三元素

各個(gè)符號(hào)的意義

1?? 終結(jié)符:是用以組成語言中的串的基本符號(hào),與程序語言中的“單詞”是同義語

如表達(dá)式 id+(id)?(?id)id+(id)^*(-id)id+(id)?(?id)中,+、-、*、/、id均為終結(jié)符

2?? 非終結(jié)符:非終結(jié)符號(hào)(也稱語法變量)用來代表語法范疇。例如,“算術(shù)表達(dá)式”“布爾表達(dá)式”“賦值句”“分程序”“過程”等,它們都是現(xiàn)今程序語言常見的語法范疇。我們也可以說,一個(gè)非終結(jié)符代表一個(gè)一定的語法概念。因此,一個(gè)非終結(jié)符是一個(gè)類(或集合)記號(hào),而不是一個(gè)個(gè)體記號(hào)。例如,算術(shù)表達(dá)式"這個(gè)非終結(jié)符乃代表一定算術(shù)式組成的類。因而,也可以說,每個(gè)非終結(jié)符號(hào)表示一定符號(hào)串的集合(由終結(jié)號(hào)和非終結(jié)符號(hào)組成的符號(hào)串)。

3?? 開始符號(hào):一個(gè)特殊的非終結(jié)符,標(biāo)記最終感興趣的語法范疇(句子),其他非終結(jié)符用以定義其他的串集,這有助于定義該語言,也有助于為它處理的語言提供一個(gè)分層的結(jié)構(gòu)

4?? 產(chǎn)生式:規(guī)定由終結(jié)符和別的語法范疇組成一個(gè)新的語法范疇的辦法

結(jié)構(gòu):非終結(jié)符->一串非終結(jié)符和終結(jié)符

如:A->α,A是左部符號(hào)VNV_NVN?,α是右部候選式,α=X1X2X3...XN,Xi∈V\alpha=X_1X_2X_3...X_N,X_i\in Vα=X1?X2?X3?...XN?,Xi?V

舉例

語法規(guī)則如下:

<句子> → <主語> <謂語> <間接賓語> <直接賓語>
<主語> → <代詞>
<謂語> → <動(dòng)詞>
<間接賓語> → <代詞>
<直接賓語> → <冠詞> < 名詞>
<代詞> → He
<代詞> → me
<名詞> → book
<冠詞> → a
<動(dòng)詞> → gave

比如He gave me a book是一個(gè)語法正確的句子

👉 該語法范疇叫"句子",在程序語言中叫“ 程序

👉 語言的句子是由一串VNV_NVN?定義,到最后才是一串VTV_TVT?

習(xí)慣記號(hào)

VNV_NVN?:大寫字母A、B、C、S等

VTV_TVT?:小寫字母,0~9,+,-等運(yùn)算符,標(biāo)點(diǎn),分界符,黑體字母串,id,if

X、Y、Z:文法符號(hào),或VNV_NVN?VTV_TVT?一個(gè)符號(hào)

u、v、w……z:VTV_TVT?中的串

α、β、γ:文法符號(hào)串∈(VT∪VN)?\in (V_T\cup V_N)^*(VT?VN?)?

S:開始符號(hào),第一個(gè)產(chǎn)生式中出現(xiàn)

->:定義為(元語言符號(hào))

|:或(元語言符號(hào))

推導(dǎo)與語言

? 問題:用文法如何定義一個(gè)語言?

思路:從S出發(fā),反復(fù)使用P\mathscr{P}P,對(duì)非終結(jié)符替換展開,最后得到全部由終結(jié)符串組成的一個(gè)串

涉及到:替換、推導(dǎo)、句型、句子、語言

1?? 直接推出:是兩個(gè)文法符號(hào)串之間的一種關(guān)系R\mathscr{R}R

如:(αAβ)R(αγβ)(\alpha \ A \ \beta)\ \mathscr{R}\ (\alpha \ γ \ \beta)(α?A?β)?R?(α?γ?β)

它表示,若A→γ∈P,α,β∈V?A\rightarrow γ \in \mathscr{P},\ \alpha,\beta \in V^*AγP,?α,βV?,則R\mathscr{R}R就是直接推出,R\mathscr{R}R記作?\Rightarrow?

則有:(αAβ)?(αγβ)(\alpha \ A \ \beta)\ \Rightarrow (\alpha \ γ \ \beta)(α?A?β)??(α?γ?β)


2?? 推導(dǎo):如果兩個(gè)串u0,unu_0,u_nu0?,un?,存在一個(gè)串序列
u0?u1?...?unu_0\Rightarrow u_1 \Rightarrow ... \Rightarrow u_n u0??u1??...?un?
u0R1unR1記作?+或??u_0\ \mathscr{R}_1\ u_n\quad \mathscr{R}_1記作\mathop\Rightarrow\limits ^+或\mathop\Rightarrow\limits ^*u0??R1??un?R1??+??

+:至少一步推導(dǎo)。*:可以0步推導(dǎo)


3?? 如何從推導(dǎo)引出語言

? u0?+unu_0\mathop\Rightarrow\limits ^+ u_nu0??+un? u0??unu_0\mathop\Rightarrow\limits ^* u_nu0???un?

🌵如果令u0u_0u0?為S,即推導(dǎo)要從開始符號(hào)開始,那么S??α,α∈V?S\mathop\Rightarrow\limits ^* \alpha,\alpha\in V^*S??α,αV?,則稱α為G的句型

🌵 如果再要求α∈VT?\alpha \in V_T^*αVT??,則稱α\alphaα為G的句子

🌵 文法G產(chǎn)生的句子的全體是一個(gè)語言,記作L(G)
L(G)={α∣S?+α&α∈VT?}L(G)=\{\alpha |S \mathop\Rightarrow\limits ^+ \alpha \ \&\ \alpha \in V_T ^*\} L(G)={αS?+α?&?αVT??}
說明

① 由文法G定義語言L需依賴一種運(yùn)算,即關(guān)系?+\mathop\Rightarrow\limits ^+?+

當(dāng)V*中有許多串,只有那些(S, u) (S,v)存在?+\mathop\Rightarrow\limits ^+?+關(guān)系的u,v才是語言中的句子

② α , β是句型,表示(S, α) (S, β)有??\mathop\Rightarrow\limits ^*??的關(guān)系,但它們的構(gòu)成是不全屬于VTV^TVT的字符。

③ G的句型集,是指存在S??αS\mathop\Rightarrow\limits ^* \alphaS??α關(guān)系的所有α,該集的子集是L(G)。

L(G)?句型集?V?L(G)\subset 句型集 \subset V^*L(G)??V?

題目

關(guān)于句型、句型集、句子、語言等概念,下面哪些說法是不正確的?

A 終結(jié)符串是句子(句子是終結(jié)符串)

B 終結(jié)符與非終結(jié)符的混合串是句型

C 終結(jié)符集合的閉包是語言

D 全體符合集合的閉包是甸句集

ABCD

舉例:根據(jù)文法G: E->E+E|E*E|(E)|i,句子i1?(i2+i3)i_1*(i_2+i_3)i1??(i2?+i3?)的推導(dǎo)過程如下

1?? E=>E?E=>i1?E=>i1(E)=>i1?(E+E)=>i1?(i2+E)=>i1?(i2+i3)E=>E*E=>i_1*E=>i_1(E)=>i_1*(E+E)=>i_1*(i_2+E)=>i_1*(i_2+i_3)E=>E?E=>i1??E=>i1?(E)=>i1??(E+E)=>i1??(i2?+E)=>i1??(i2?+i3?)

最左推導(dǎo)

2?? E=>E?E=>E?(E)=>E?(E+E)=>E?(E+i3)=>E?(i2+i3)=>i1?(i2+i3)E=>E*E=>E*(E)=>E*(E+E)=>E*(E+i_3)=>E*(i_2+i_3)=>i_1*(i_2+i_3)E=>E?E=>E?(E)=>E?(E+E)=>E?(E+i3?)=>E?(i2?+i3?)=>i1??(i2?+i3?)

最右推導(dǎo)

從一個(gè)句型到另一個(gè)句型的推導(dǎo)過程并不唯一,但是通常只考慮最左推導(dǎo)和最右推導(dǎo)

最左推導(dǎo)是指,任何一步a=> β都是對(duì)a中的最左非終結(jié)符進(jìn)行替換。

最右推導(dǎo)是指,任何一步a=> β都是對(duì)a中的最右非終結(jié)符進(jìn)行替換。

3.3 語法樹與二義性

語法樹

目的:為了理解句子的語法,即理解句子如何從開始符號(hào)推導(dǎo)得到,因此引入“圖”。

定義:句型推導(dǎo)的圖形表示,與替換順序的選取無關(guān)。

作用:明顯地形成文法所暗含句子的分層語法結(jié)構(gòu),為語法分析提供一些新的途徑。

樹的內(nèi)結(jié)點(diǎn):非終結(jié)符A標(biāo)記,若A->XYZ,則該產(chǎn)生式的一棵子樹為

語法樹與文法概念的對(duì)應(yīng)關(guān)系如下

語法樹文法概念
內(nèi)結(jié)點(diǎn)AVN
文法符號(hào)
子樹直接推導(dǎo)
根結(jié)點(diǎn)S
任意一次全剪句型
葉子∈VT時(shí),將葉子順序排列句子

有的文法,對(duì)于同一句子,應(yīng)用不同規(guī)則進(jìn)行推導(dǎo)得到不同的語法樹

沒有區(qū)分優(yōu)先級(jí)

舉例 E?+?(id+id)E\mathop\Rightarrow\limits^+ -(id+id)E?+?(id+id)的語法樹

最左推導(dǎo):E=>-E=>-(E)=>- (E+E) =>-(id+E) =>- (id+id)
最右推導(dǎo):E=>-E=>-(E) =>- (E+E) =>-(E+id)=>- (id+id)

每一個(gè)中間過程,句型很容易獲取

樹忽略了符號(hào)的替換順序的不同,不同的推導(dǎo)過程得到相同的語法樹

有的文法,對(duì)于同一句子,應(yīng)用不同規(guī)則進(jìn)行推導(dǎo)會(huì)得到不同的語法樹

舉例:根據(jù)文法G對(duì)句子id+id*id進(jìn)行推導(dǎo)

文法G:E->E+E|E*E|(E)|i

推導(dǎo)1

E=>E+E=>id+E=>id+E*E=>id+id*E=>id+id*id

推導(dǎo)2

E=>E*E=>E+E*E=>id+E*E=>id+id*E=>id+id*id

二義性

文法G的某一個(gè)句子有兩棵不同的樹,則G為二義的

作為描述程序語言的上下文無關(guān)文法,有以下限制

1?? G不含以下產(chǎn)生式:P->P

2?? 每一P∈VNP∈V_NPVN?,必須都有用處,即?s??αPβ\exists s\mathop\Rightarrow\limits^* \alpha P \beta?s??αPβ,P在句型中出現(xiàn)

?γ∈VT?,P?+γ\exists γ\in V_T^*,P\mathop\Rightarrow\limits^+γ?γVT??,P?+γ,即對(duì)P不存在不終結(jié)的回路

題目

關(guān)于文法二義性、語言二義性,下面哪些說法是正確的?

1?? 只要存在某個(gè)句子有兩棵不同的語法樹,文法就是二義的。

2?? 無法判定所有句子均沒有兩棵不同的語法樹,即無法判定文法是否無二義。

3?? 對(duì)于語言來說只要存在無二義的文法它就不是二義的。

4?? 對(duì)于語言來說,無法判定其不存在無二義的文法,即無法判定語言是否二義。

ABCD

參考資料

[1] 西安交通大學(xué)軟件工程專業(yè)編譯原理 吳曉軍 2022春

[2] 陳火旺,劉春林,譚慶平,趙克佳,劉越. 程序設(shè)計(jì)語言編譯原理(第3版). 北京:國防工業(yè)出版社,2010/20132017

總結(jié)

以上是生活随笔為你收集整理的[XJTUSE编译原理] 第三章 上下文无关文法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。