正則文法和上下文無關文法

2022-09-01 17:15:26 字數 2730 閱讀 9406

對於文法g=(v, t, s, p),如果產生式的形式如下:

a -> xb

a -> x

其中a, b屬於v,x屬於t*,則稱為右線性文法;相似的,如果產生式的形式如下:

a -> bx

a -> x

則稱為左線性文法。右線性文法和左線性文法統稱為正則文法

正規表示式的表達能力等價於正則文法,正規表示式的定義如下:

字母表中的任意字母是正規表示式,空串和空集也是正規表示式;

如果r, s是正規表示式,那麼r|s, rs, r*, (r)也是正規表示式。

正規表示式的擴充套件

r+:乙個或多個重複

.  :任意字元

[a-z]:字元範圍

[^abc]:不在給定集合中的任意字元

r?:可選

正規表示式只能使用終結符(字母表中的字元),因而很容易變得複雜又難懂,實際中,經常使用正則描述,正則描述允許使用非終結符定義表示式,很像ebnf,但是它限制在未完全定義之前,不能使用非終結符,也就是說不允許遞迴或自巢狀。

像正規表示式的表達能力等價於正則文法一樣,bnf正規化的表達能力等價於上下文無關文法。bnf是「

backus naur form

」的縮寫。

john backus

和peter naur

首次引入一種形式化符號來描述給定語言的語法。

bnf

的元符號:

::=表示「定義為

」,有的書上用-->

|表示「或者」

< >

尖括號用於括起非終結符。

bnf的擴充套件ebnf

可選項被括在元符號「

[」和「]」中

重複項(零個或者多個)被括在元符號「

」中僅乙個字元的終結符用引號(

")引起來,以和元符號區別開來

上述操作符不是嚴格限定的,有的人喜歡直接使用擴充套件正規表示式的操作符描述ebnf。除了方便表達以外,引入ebnf的另乙個主要原因是為了更緊密地把文法對映到遞迴下降分析程式的真實**。當需要手動構造歸下降分析程式的時候,通常把上下文無關文法改寫為ebnf是必需的。

如果乙個上下文無關文法g不是自巢狀或自遞迴的,即不存在如下推導:

u =>* xuy

那麼l(g)是正則語言。自巢狀的上下文無關文法不一定是正則語言。事實上,乙個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自巢狀的。

如果乙個上下文無關文法g不是自巢狀或自遞迴的,即不存在如下推導:

u =>* xuy

那麼l(g)是正則語言。自巢狀的上下文無關文法不一定是正則語言。事實上,乙個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自巢狀的。

bnf的擴充套件ebnf

可選項被括在元符號「

[」和「]」中

重複項(零個或者多個)被括在元符號「

」中僅乙個字元的終結符用引號(

")引起來,以和元符號區別開來

上述操作符不是嚴格限定的,有的人喜歡直接使用擴充套件正規表示式的操作符描述ebnf。除了方便表達以外,引入ebnf的另乙個主要原因是為了更緊密地把文法對映到遞迴下降分析程式的真實**。當需要手動構造歸下降分析程式的時候,通常把上下文無關文法改寫為ebnf是必需的。

如果乙個上下文無關文法g不是自巢狀或自遞迴的,即不存在如下推導:

u =>* xuy

那麼l(g)是正則語言。自巢狀的上下文無關文法不一定是正則語言。事實上,乙個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自巢狀的。

如上所述,上下文無關文法的遞迴性,對其分析方法也有很大影響。首先,用作識別這些結構的演算法必須使用遞迴呼叫或顯式管理的分析棧。其次,用作表示語言語義結構的資料結構現在也必須是遞迴的(通常是一顆分析樹),而不再是線性的(如同用於詞法和記號中的一樣)了。

在程式語言中,通常用正規表示式描述詞法規則。但是正規表示式的表達能力有限,她無法表達括號配對等語法形式,因而,需要引入表達能力更強的上下文無關文法。編譯程式中常用正則文法表示詞法,用上下文無關文法表示語法。那麼程式語言中那些屬於詞法哪些屬於語法呢?乙個簡單的辦法,把所有能用正則文法表示的規則成為詞法,即我們用盡可能的使用正則文法表示更多的東西,那些無法用正規表示式表示的成為句法,如c語言中的語法形式。語言中有些規則使用上下文無關文法仍然無法描述,例如變數的定義在使用之前,型別匹配等等,這些通常稱為(靜態)語義,它們在編譯程式的靜態語義檢查階段進行檢測。

如果乙個上下文無關文法g不是自巢狀或自遞迴的,即不存在如下推導:

u =>* xuy

那麼l(g)是正則語言。自巢狀的上下文無關文法不一定是正則語言。事實上,乙個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自巢狀的。

上下文無關文法

1 上下文無關文法又稱cfg。許多cfg由幾個較簡單的cfg合併起來。可以先構造每個部分的cfg,比如 s1,s2,s3.sk。然後加入新的規則s s1 s2 sk 2 例如 構造語言 的cfg,1 構造 s1 0 s1 1 2 s2 1 s2 0 3 整合 s s1 s2 3 如果語言是正則的,可...

上下文無關文法

上下文無關文法 context free gammar 指文法的前後 上下 沒有關係,如文法 statement name is name s friend.是上下文無關文法,因為文中出現的兩個 name 可以不同 也可以相同,假設自己可以是自己的朋友 而文法 statement name like...

上下文無關文法

1 上下文無關文法又稱cfg。許多cfg由幾個較簡單的cfg合併起來。可以先構造每個部分的cfg,比如 s1,s2,s3.sk。然後加入新的規則s s1 s2 sk 2 例如 構造語言 的cfg,1 構造 s1 0 s1 1 2 s2 1 s2 0 3 整合 s s1 s2 3 如果語言是正則的,可...