形式文法

在形式語言理論中，文法（formal grammar)是形式語言中字符串的一套產生式規則（production rule）。這些規則描述瞭如何用語言的字母表生成符合句法(syntax)的有效的字符串。文法不描述字符串的含義，也不描述在任何上下文中可以用它們做什麼——只描述它們的形式。
形式語言理論是應用數學的一個分支，是研究形式文法和語言的學科。它在理論計算機科學、理論語言學、形式語義學、數理邏輯等領域有著廣泛的應用。
形式文法是從一個“開始符號”出發的一套重寫字符串的規則。因此，文法通常被認為是語言生成器。然而，它有時也可以用作“識別器”（計算機學中的一種函數，用於確定給定字符串是否屬於該語言，是否為語法錯誤）的基礎。形式語言理論使用另一個理論來描述識別器，也就是自動機理論。自動機理論有一個有趣的結果，某些形式語言是無法設計出識別器的。
語法分析是通過將一段話語（自然語言中的一個字符串）分解成一組符號，並根據語言的語法分析每一個符號的過程。大多數語言的話語含義都是根據其句法結構來確定的——這種做法被稱為組合語義學。因此，在語言中描述話語含義的第一步就是把它分解成若干部分，然後觀察它經過分析後的形式（在計算機科學中被稱為分析樹，在生成文法中被稱為深層結構）。

**入門示例**
文法主要由一組變換字符串的規則組成。（如果它只包含這些規則，那麼它就是一個semi-Thue system。）要在該語言中生成字符串，首先需要一個只包含一個開始符號的字符串。然後按任意順序應用產生式規則，直到生成既不包含起始符號也不包含指定非終結符號的字符串。產生式規則是通過把字符串中第一次出現產生式規則左邊的地方，替換成產生式規則的右邊，來作用於這個字符串的（參見理論圖靈機的運算）。由文法產生的語言包含能用這種方式產生的所有不同的字符串。開始符號上的任何特定產生式規則序列都會在語言中產生一個不同的字符串。如果產生同一個字符串有多種不同的方式，那這個文法就是具有二義性的文法了。
例如，假設字母表由 a 和 b 組成，開始符號是 S，我們有以下產生式規則：
 1. 
 2. 
那麼我們從 S 開始，選擇一個規則。如果我們選擇規則1，我們將獲得字符串 aSb。如果我們再次選擇規則1，我們用 aSb 替換 S，得到字符串 aaSbb。如果我們現在選擇規則2，我們將 S 替換為 ba 並獲得字符串 aababb，然後就完成了。我們可以用符號將這一系列選擇寫得更簡短：。這種文法的語言就是無限集 ，其中  是  重複  次（ 表示使用規則1的次數）。

**形式定義**

**文法的語法**
20世紀50年代，諾姆·喬姆斯基首次提出了生成語法的經典形式化理論， 其中文法 G 由以下部分組成：- 有限的非終結符號集 N，與 G 生成的字符串無交。- 有限的終結符號集 ，與 N 無交。- 有限的產生式規則集 P，每個規則都為如下形式
:  
這裡的  是克萊尼星號， 表示並集。也就是說，每個產生式規則從一個符號串映射到另一個符號串，並且產生式左側的字符串中必須至少包括一個非終結符號。產生式右側的字符串如果只有一個 空字符串的話，也就是說沒有任何符號的話，它有一個特別的標記（通常是、e 或者 ）。- 開始符號 ，也叫句子符號。
文法的形式定義為四元組 。這種形式語法在文獻中常被稱為重寫系統或phrase structure grammar。

**關於形式文法的一些數學構造**
文法的運算可以用字符串的關係來定義:- 設有文法 ， 內的字符串的二元關係 （讀作“G經過直接推導為”）定義為：
*:- 關係 （讀作“G經0或更多步推導”）定義為  的自反傳遞閉包- 句型是指可以由開始符號  經過有限步推導得到的  的一個成員；也就是，句型是  的一個成員。不包含非終結符號（即  的成員）的句型稱為句子。-  的語言，記為 ，定義為從開始符號  開始經過有限步驟可以推導出的所有句子；也就是集合 。
注意文法  實際上是semi-Thue system ，以完全相同的方式重寫字符串；唯一的區別在於我們區分了特定的非終結符號，這些符號必須在重寫規則中重寫，並且只對從指定的開始符號  到沒有非終結符號的字符串的重寫感興趣。

**例子**
在這些例子中，形式語言使用集合建構式符號描述。
考慮文法 ，其中 ，， 是開始符號， 由以下產生式規則組成：
 1. 
 2. 
 3. 
 4. 
這個文法定義了語言 ，這裡  表示 n 個  串連所得的字符串。因此，該語言是由1個或更多的 ，後面跟著相同數量的 ，接著是相同數量的  組成的字符串集合。
內字符串的推導例子如下：
（標記  讀作“字符串 P 通過產生式 i 生成 Q”，替換的字符串用粗體標出。）

**喬姆斯基譜系**
1956年諾姆·喬姆斯基首次將生成文法形式化時， 他將它們分為現在稱為喬姆斯基譜系的四種類型。其中兩種重要的文法類型分別是上下文無關文法（2型）和正則文法（3型）。可以用這兩種文法描述的語言分別稱為上下文無關語言和正則語言。儘管比無限制文法（0型，實際上無限制文法可以表示任何圖靈機可以接受的語言）要弱得多，但這兩種受限制的語法最常用，因為它們的解析器可以高效地實現。 例如，所有正規語言都可以被有限狀態機識別，對於上下文無關文法的有用子集，有一些著名的算法可以生成高效的LL剖析器LR剖析器，以識別文法生成的相應語言。

**上下文無關文法**
上下文無關文法要求產生式左側只能包含一個符號，並且該符號為非終結符號。這個限制是非常重要的；不是所有的語言都可以由上下文無關的語法生成。那些可以被稱為上下文無關語言。
上例定義的語言  並不是一個上下文無關語言，並且這個可以用上下文無關語言的泵引理嚴格證明，但 （1個及以上  後面跟同樣數量的 ）是一個上下文無關語言。因為它可以由文法 （，， 為開始符號）定義，用下列產生式規則：
 1. 
 2. 
通過Earley's algorithm可以在  時間（參見大O符號）內識別上下文無關語言。也就是說，對於每一種上下文無關的語言，都可以構建一臺以字符串為輸入並及時確定字符串是否為該語言成員的機器，其中  是字符串的長度。 Deterministic context-free language是可在線性時間內識別的上下文無關語言的子集。 由多種算法針對這類語言或它的子集。

**正則文法**
在正則文法中，左側仍然只是一個非終結符號，但右側也受到限制。右側可以是空字符串，也可以是單個終結符號，或者是後跟非終結符號的單個終結符號，但不能是其他符號。（有時會使用更寬泛的定義：可以允許更長的終結字符串或單個非終結字符串，而不能有其他任何東西，從而使語言更易於表示，同時仍然定義同一類語言。）
上面定義的語言  不是一個正則語言，但下面這個語言是：（一個或多個  後面跟著一個或多個 ，這兩個的數量可以不一樣）。它之所以是正則語言，是因為可以通過文法  定義，其中 ，， 為開始符號，還有如下產生式規則：
# 
# 
# 
# 
# 
由正則文法生成的所有語言都可以被有限狀態機在  時間內識別出來。雖然在實際應用中，正則文法通常使用正則表達式來表示，但是實際應用中使用的一些正則表達式並沒有嚴格地生成正則語言，也因此沒有表現出線性識別性能。

**生成文法的其他形式**
語言學家和計算機科學家對喬姆斯基的形式語法的原始層次結構進行了許多擴展和變化，通常是為了增強表達能力，或者是為了使分析或解析更加容易。一些形式的文法包括:- 樹-鄰接文法允許重寫規則在分析樹上操作，而不僅僅是字符串，從而提高了傳統生成文法的表達能力。- Affix grammar和attribute grammar允許通過語義屬性和操作擴充重寫規則，這對於提高語法表達能力和構建實用的語言翻譯工具都很有用。

**遞歸文法**
遞歸文法是包含遞歸產生式規則的語法。例如，如果存在一個非終結符 A，可以通過產生式規則生成一個以 A 為最左邊符號的字符串，那麼上下文無關語言的文法就是左遞歸的。

**分析型文法**
儘管有大量關於語法分析算法的文獻，但這些算法大多假設要被分析的語言最初是通過生成式文法來描述的，並且目標是將生成式文法轉換成一個有效的語法分析器。嚴格地說，生成文法不能在任何方面都與解析語言的算法對應上，而且各種算法對產生式規則的形式有不同的限制，這些產生式規則被認為是形式良好的。
另一種方法是首先根據分析型文法將語言形式化，分析型文法能更直接地對應於語言分析器的結構和語義。分析型文法體系的例子包括：-  語言機器 date=20191030102455 直接實現了無限制的分析型文法。替換規則用於轉換輸入以產生輸出和行為。該系統還可以生成 lm圖 date=20200415032658 ，顯示在應用無限制分析型文法規則時的情況。- Top-down parsing language（TDPL）：一種高度簡約的分析型文法形式，在20世紀70年代早期發展起來，用來研究自頂向下的語法分析器的行為。- Link grammar：為語言學設計的一種分析型文法形式，它通過檢查詞對之間的位置關係來推導句法結構。- 解析表達文法（PEG）：圍繞編程語言和編譯器編寫者的實際Expressivity (computer science)需求而設計的TDPL的最新概括。

**參見**
 抽象語法樹- Adaptive grammar- Ambiguous grammar- 巴科斯範式 (BNF)- Categorial grammar- 分析樹- 擴展巴科斯範式 (EBNF)- 語法- L系統- 邏輯語- Post canonical system- Shape grammar- 合式公式

**參考文獻**

**外部鏈接**
  Yearly Formal Grammar conference date=20071008144738