在形式語言理論中，文法（formal grammar 是形式語言中字串的一套產生式規則（production rule）。這些規則描述瞭如何用語言的字母表生成符合句法 syntax 的有效的字串。文法不描述字串的含義，也不描述在任何上下文中可以用它們做什麼 只描述它們的形式。 形式語言理論是應用數學的一個分支，是研究形式文法和語言的學科。它在理論電腦科學、理論語言學、形式語義學、數理邏輯等領域有著廣泛的應用。 形式文法是從一個 開始符號 出發的一套重寫字串的規則。因此，文法通常被認為是語言生成器。然而，它有時也可以用作 識別器（計算機學中的一種函式，用於確定給定字串是否屬於該語言，是否為語法錯誤）的基礎。形式語言理論使用另一個理論來描述識別器，也就是自動機理論。自動機理論有一個有趣的結果，某些形式語言是無法設計出識別器的。 有關此主題的更多資訊，請參見不可判定問題。 語法分析是透過將一段話語（自然語言中的一個字串）分解成一組符號，並根據語言的語法分析每一個符號的過程。大多數語言的話語含義都是根據其句法結構來確定的 這種做法被稱為組合語義學。因此，在語言中描述話語含義的第一步就是把它分解成若干部分，然後觀察它經過分析後的形式（在計算機科學中被稱為分析樹，在生成文法中被稱為深層結構）。 入門示例 文法主要由一組變換字串的規則組成。（如果它只包含這些規則，那麼它就是一個。）要在該語言中生成字串，首先需要一個只包含一個開始符號的字串。然後按任意順序應用產生式規則，直到生成既不包含起始符號也不包含指定非終結符號的字串。產生式規則是透過把字串中第一次出現產生式規則左邊的地方，替換成產生式規則的右邊，來作用於這個字串的（參見理論圖靈機的運算）。由文法產生的語言包含能用這種方式產生的所有不同的字串。開始符號上的任何特定產生式規則序列都會在語言中產生一個不同的字串。如果產生同一個字串有多種不同的方式，那這個文法就是具有二義性的文法了。 例如，假設字母表由 a 和 b 組成，開始符號是 S，我們有以下產生式規則： 1 S rightarrow aSb 2 S rightarrow ba 那麼我們從 S 開始，選擇一個規則。如果我們選擇規則 1，我們將獲得字串 aSb。如果我們再次選擇規則 1，我們用 aSb 替換 S，得到字串 aaSbb。如果我們現在選擇規則 2，我們將 S 替換為 ba 並獲得字串 aababb，然後就完成了。我們可以用符號將這一系列選擇寫得更簡短：S Rightarrow aSb Rightarrow aaSbb Rightarrow aababb。這種文法的語言就是無限集 anbabn mid n geq 0 ba abab aababb aaababbb dotsc ，其中 ak 是 a 重複 k 次（n 表示使用規則 1 的次數）。 形式定義 文法的語法 20 世紀 50 年代，諾姆喬姆斯基首次提出了生成語法的經典形式化理論， 其中文法 G 由以下部分組成： 有限的非終結符號集 N，與 G 生成的字串無交。 有限的終結符號集 Sigma，與 N 無交。 有限的產生式規則集 P，每個規則都為如下形式 Sigma cup N N Sigma cup N rightarrow Sigma cup N 這裡的 是克萊尼星號，cup 表示並集。也就是說，每個產生式規則從一個符號串對映到另一個符號串，並且產生式左側的字串中必須至少包括一個非終結符號。產生式右側的字串如果只有一個 空字串的話，也就是說沒有任何符號的話，它有一個特別的標記（通常是 Lambda、e 或者 epsilon）。 開始符號 S in N，也叫句子符號。 文法的形式定義為四元組 N Sigma P S。這種形式語法在文獻中常被稱為重寫系統或。 關於形式文法的一些數學構造 文法的運算可以用字串的關係來定義 設有文法 G N Sigma P S，Sigma cup N 內的字串的二元關係 underset G Rightarrow（讀作 G 經過直接推導為）定義為： x underset G Rightarrow y iff exists u v p q in Sigma cup N x upv wedge p rightarrow q in P wedge y uqv 關係 overset underset G Rightarrow（讀作 G 經 0 或更多步推導）定義為 underset G Rightarrow 的自反傳遞閉包 句型是指可以由開始符號 S 經過有限步推導得到的 Sigma cup N 的一個成員；也就是，句型是 leftw in Sigma cup N mid S overset underset G Rightarrow w right 的一個成員。不包含非終結符號（即 Sigma 的成員）的句型稱為句子。Sentential Forms ContextFree Grammars David Matuszek G 的語言，記為 boldsymbol LG，定義為從開始符號 S 開始經過有限步驟可以推匯出的所有句子；也就是集合 leftw in Sigma mid S overset underset G Rightarrow w right。 注意文法 G N Sigma P S 實際上是 N cup Sigma P，以完全相同的方式重寫字串；唯一的區別在於我們區分了特定的非終結符號，這些符號必須在重寫規則中重寫，並且只對從指定的開始符號 S 到沒有非終結符號的字串的重寫感興趣。 例子 在這些例子中，形式語言使用集合建構式符號描述。 考慮文法 G，其中 N left S Bright ，Sigma left a b cright ，S 是開始符號，P 由以下產生式規則組成： 1 S rightarrow aBSc 2 S rightarrow abc 3 Ba rightarrow aB 4 Bb rightarrow bb 這個文法定義了語言 L G left an bn cn mid n ge 1 right ，這裡 an 表示 n 個 a 串連所得的字串。因此，該語言是由 1 個或更多的 a，後面跟著相同數量的 b，接著是相同數量的 c 組成的字串集合。 L G 內字串的推導例子如下： （標記 P underset i Rightarrow Q 讀作 字串 透過產生式 生成，替換的字串用粗體標出。） 喬姆斯基譜系 1956 年諾姆喬姆斯基首次將生成文法形式化時， 他將它們分為現在稱為喬姆斯基譜系的四種類型。其中兩種重要的文法型別分別是上下文無關文法（2 型）和正則文法（3 型）。可以用這兩種文法描述的語言分別稱為上下文無關語言和正則語言。儘管比無限制文法（0 型，實際上無限制文法可以表示任何圖靈機可以接受的語言）要弱得多，但這兩種受限制的語法最常用，因為它們的解析器可以高效地實現。Grune Dick Jacobs Ceriel H Parsing Techniques A Practical Guide Ellis Horwood England 1990 例如，所有正規語言都可以被有限狀態機識別，對於上下文無關文法的有用子集，有一些著名的演算法可以生成高效的 LL 剖析器 LR 剖析器，以識別文法生成的相應語言。 上下文無關文法 上下文無關文法要求產生式左側只能包含一個符號，並且該符號為非終結符號。這個限制是非常重要的；不是所有的語言都可以由上下文無關的語法生成。那些可以被稱為上下文無關語言。 上例定義的語言 L G left an bn cn mid n ge 1 right 並不是一個上下文無關語言，並且這個可以用上下文無關語言的泵引理嚴格證明，但 left an bn mid n ge 1 right （1 個及以上 a 後面跟同樣數量的 b）是一個上下文無關語言。因為它可以由文法 G_2（Nleft Sright ，Sigmaleft abright ，S 為開始符號）定義，用下列產生式規則： 1 S rightarrow aSb 2 S rightarrow ab 透過可以在 O n3 時間（參見大 O 符號）內識別上下文無關語言。也就是說，對於每一種上下文無關的語言，都可以構建一臺以字串為輸入並及時確定字串是否為該語言成員的機器，其中 n 是字串的長度。Earley Jay An Efficient ContextFree Parsing Algorithm Communications of the ACM Vol 13 No 2 pp 94102 February 1970 是可線上性時間內識別的上下文無關語言的子集。 由多種演算法針對這類語言或它的子集。 正則文法 在正則文法中，左側仍然只是一個非終結符號，但右側也受到限制。右側可以是空字串，也可以是單個終結符號，或者是後跟非終結符號的單個終結符號，但不能是其他符號。（有時會使用更寬泛的定義：可以允許更長的終結字串或單個非終結字串，而不能有其他任何東西，從而使語言更易於表示，同時仍然定義同一類語言。） 上面定義的語言 left an bn mid n ge 1 right 不是一個正則語言，但下面這個語言是：left an bm mid mn ge 1 right （一個或多個 a 後面跟著一個或多個 b，這兩個的數量可以不一樣）。它之所以是正則語言，是因為可以透過文法 G_3 定義，其中 Nleft S ABright ，Sigmaleft abright ，S 為開始符號，還有如下產生式規則： S rightarrow aA A rightarrow aA A rightarrow bB B rightarrow bB B rightarrow epsilon 由正則文法生成的所有語言都可以被有限狀態機在 O n 時間內識別出來。雖然在實際應用中，正則文法通常使用正則表示式來表示，但是實際應用中使用的一些正則表示式並沒有嚴格地生成正則語言，也因此沒有表現出線性識別效能。 生成文法的其他形式 語言學家和計算機科學家對喬姆斯基的形式語法的原始層次結構進行了許多擴充套件和變化，通常是為了增強表達能力，或者是為了使分析或解析更加容易。一些形式的文法包括 樹 鄰接文法允許重寫規則在分析樹上操作，而不僅僅是字串，從而提高了傳統生成文法的表達能力。Joshi Aravind K et al Tree Adjunct Grammars Journal of Computer Systems Science Vol 10 No 1 pp 136163 1975 Koster Cornelis H A Affix Grammars in ALGOL 68 Implementation North Holland Publishing Company Amsterdam p 95109 1971 和 Knuth Donald E Semantics of ContextFree Languages Mathematical Systems Theory Vol 2 No 2 pp 127145 1968Knuth Donald E Semantics of ContextFree Languages correction Mathematical Systems Theory Vol 5 No 1 pp 9596 1971 允許透過語義屬性和操作擴充重寫規則，這對於提高語法表達能力和構建實用的語言翻譯工具都很有用。 遞迴文法 遞迴文法是包含遞迴產生式規則的語法。例如，如果存在一個非終結符 A，可以透過產生式規則生成一個以 A 為最左邊符號的字串，那麼上下文無關語言的文法就是左遞迴的。 Notes on Formal Language Theory and Parsing James Power Department of Computer Science National University of Ireland Maynooth Maynooth Co Kildare IrelandJPR02 分析型文法 儘管有大量關於語法分析演算法的文獻，但這些演算法大多假設要被分析的語言最初是透過生成式文法來描述的，並且目標是將生成式文法轉換成一個有效的語法分析器。嚴格地說，生成文法不能在任何方面都與解析語言的演算法對應上，而且各種演算法對產生式規則的形式有不同的限制，這些產生式規則被認為是形式良好的。 另一種方法是首先根據分析型文法將語言形式化，分析型文法能更直接地對應於語言分析器的結構和語義。分析型文法體系的例子包括： 語言機器 直接實現了無限制的分析型文法。替換規則用於轉換輸入以產生輸出和行為。該系統還可以生成 lm 圖 ，顯示在應用無限制分析型文法規則時的情況。 （TDPL）：一種高度簡約的分析型文法形式，在 20 世紀 70 年代早期發展起來，用來研究的行為。Birman Alexander The TMG Recognition Schema Doctoral thesis Princeton University Dept of Electrical Engineering February 1970 ：為語言學設計的一種分析型文法形式，它透過檢查詞對之間的位置關係來推導句法結構。Sleator Daniel D Temperly Davy Parsing English with a Link Grammar Technical Report CMUCS91196 Carnegie Mellon University Computer Science 1991Sleator Daniel D Temperly Davy Parsing English with a Link Grammar Third International Workshop on Parsing Technologies 1993 Revised version of above report 解析表達文法（PEG）：圍繞程式語言和編譯器編寫者的實際需求而設計的 TDPL 的最新概括。Ford Bryan Packrat Parsing a Practical LinearTime Algorithm with Backtracking Masters thesis Massachusetts Institute of Technology Sept 2002 參見 抽象語法樹 巴科斯正規化 BNF 分析樹 擴充套件巴科斯正規化 EBNF 語法 L 系統 邏輯語 合式公式 參考文獻 外部連結 Yearly Formal Grammar conference Category 形式語言 Category 語法 Category 數理邏輯 Category 句法 Category 自動機