SPIR-V 研究:編譯器基本原理(二)- 語法
標籤(空格分隔): SPIR-V Graphics Vulkan
上一篇介紹了計算機語言的基本知識,這一篇主要講講語法。語法是一組能生成對應語言語句的規則,這一般是一個有限集合,也就是隻有有限多個規則。所以,根據給定語法和字母表,我們可以生成所有符合規則的語句。比如下圖:
Formal Language
這裏所講的語言其實就是形式語言(formal language),對應的語法就是formal grammar。語言L是一組長度有限的字符串(語句)。
- L可以包含有限個數的語句;最小的語言不包含任何語句。
- L還可以包含無限多個語句;比如一般編程語言就是如此。
由於一個句子可以屬於或不屬於某一語言,所以需要一種規則或方法還檢驗給定語句是不是屬於特定語言。這種規則就是語法;檢驗的過程就是Parse的過程。
Formal Grammar
語法有四種元素構成。可以參見這篇好文章:Formal Grammar。
- 首先是一個字母表Σ,它包含所有的**有限個的**terminal symbols;terminal symbols,顧名思義就是最終的字符,不是中間的表示符號。因爲語法基本上是一個遞歸替換的符號的過程;當所有符號都是最終字符時,替換過程結束,這時得到的就是這種語法生成的一個語句。比如:
Σ = { "a", "the", "dog", "cat", "barked", "napped"}
- 其次是一個包含有限箇中間字符的集合N(nonterminal symbols).
中間字符是特殊的,可以把它們想象成wildcards;最終會被替換成其他符號。比如:
N = { "<sentence>", "<noun>", "<verb>", "<article>" }
- 再次是必須有一箇中間符號最爲起始符號S;它是所有可能的替換生成過程的開始。比如:
S = "<sentence>"
- 最後我們要有一組生成規則P(production rules);這是有限集合,定義了怎麼樣來組建語句。比如:
P = {
"<sentence>" → "<article><noun><verb>"
"<article>" → "a"
"<article>" → "the"
"<noun>" → "dog"
"<noun>" → "cat"
"<verb>" → "barked"
"<verb>" → "napped"
}
一個Formal Grammar就可以表示爲以上四個集合的元組(tuple)。
G = { N, Σ, P, S }
正式的數學語言描述爲:
具體也可參見wikiFormal_grammar.
The Chomsky hierarchy
數學大牛Noam Chomsky很早就研究了語言和語法,並對語法提出了分類。也就是所謂的Type-0,Type-1, Type-2和Type-3語法。其中最有用的是Context-free grammars (Type 2) and Regular grammars (Type 3).
它們之間是包含關係,Type-0是沒有任何限制的語法,可以描述最多的語言;其他的都是一步步加上各種限制後得出的語法,它們能描述的語言也就越來越少;然而它們卻更簡單更有用。事實上很多編程語言的語法都是正則表達式來描述的,也就是type-3。