《編譯原理》閱讀筆記:p25-p32

codists發表於2024-06-29

《編譯原理》學習第 5 天,p25-p32總結,總計 8 頁。

一、技術總結

1.lexical

lexical這個單詞後續會經常用到,所以首先要搞懂它的英文意思,不然看到中文的“詞法,語法,文法”這三個詞的時候就會懵了——lexical對應這三個裡面的哪一個?

(1)lexical: lexicon + al,加al字尾,表明lexical是一個形容詞(adjective)。

(2)lexicon: 詞根是lexis(a word)。all the words used in a particular language。意思是“全部詞彙”,“詞典”。

(3)lexical: adj. relating to words,詞彙(word)相關的。

所以lexical 對應著“詞(word)法”, lexical analyzer稱為詞法分析器。

2.production

(1)定義

p26,以C語言中的if-else 語句為例:

if (expression) statement else statement

如果使用expr表expression,使用stmt表示statement,那麼上述語句就可以表示成:

stmt -> if (expr) stmt else stmt

->表示“can have the form”。形如“stmt -> if (expr) stmt else stmt”這樣的rule稱為production。

(2)作用

書中沒有給出明確的定義,按照書中的定義,長“stmt -> if (expr) stmt else stmt”這樣的就叫做production, 再簡化一下還可寫成: x -> y,“ x -> y”這個production的含義是什麼呢?它的含義是x可以轉為y。

(3)left side & right side

以 "stmt -> if (expr) stmt else stmt" 這個production為例,-> 左邊的部分稱為production的left side,-> 左邊的部分稱為production的right side。

3.token/terminal

在production中,lexical element(如:if, else)和 parenthsis稱為token,也稱為terminal、terminal symbol。

p27, "we assume that digits, signs such as <=, and boldface strings such as while are terminals"。根據這句話,terminal包含:(1)digit:如1,2,3。(2)signs: 如 <=。(3)boldface string: 如while。這裡用boldface string很不好,boldface是從印刷的角度來說的,那非boldface的string是不是terminal呢?

4.nonterminal

stmt -> if (expr) stmt else stmt" 這個production

p26, variables like expr and stmt represent sequences of tokens and are called nonterminals。在這裡,作者沒有給出nonterminal的明確定義,暫且根據這句話的意思把像expr和stmt這樣的variable稱為nonterminal,然後繼續往下閱讀。

5.context-free grammar

(1)定義

首先,得對context-free grammar下定義,什麼是context-free grammar?p26, In this section, we introduce a notation, called a context-free grammar(grammar, for short), for specifying the synaxt of a language。用於指定語言的語法的符號稱為上下文無關文法,簡寫為grammar。

context-free grammar由四部分構成:

(1)a set of terminals。

(2)a set of nonterminals。

(3)a set of production。

(4)a start symbol。

“a designation of one of the nonterminals as the start symbol”——根據書中的定義,start symbol是從nonterminals中指定的。

6.|符號(or)

p27, For notational convenience, productions with the same nonterminals on the left can have their right sides grouped, with the algernative right sides separated by the symbol |, which we read as "or."——為了方便表示,可以把多個具有相同left side的production,寫成一個production,production的right side用符號| 隔開,|讀者“or”。

示例:

以7,3-1,9-5+2, 為例,我們把數字稱為digit(即1是一個digit, 2是一個digit, 3是一個digtit......), 把用+號或-號隔開的expression稱為list( "3-1"即是一個list,"9-5+2"是一個list,1等數字是特殊的list),那麼上面這三個expression使用production來表示可以寫成:

(1)digit -> 0 | 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9

(2)list -> digit

(3)list -> list - digit

(4)list -> list + digit

因為(2)、(3)、(4)這3個production的left side是一樣的,都是list, 那麼可以寫成一個production:

list -> digit | list - digit | list + digit

7.production for nonterminal

p27, We say a production is for a nonterminal if the nonterminal appears on the left side of the production。

如果一個nonterminal出現在production的left side, 那麼我們就說這個production是這個nonterminal的production(這裡有點拗口,書上用的是for表示,意思就是這個production是歸屬於這個nonterminal的)。

當看到“production for nonterminal”我們就要想到nonterminal是在production的left side。

8.parse tree

(1)tree

關於tree相關的定義,參考維基百科即可。書中提到的interior node,實際就是我們常說的internal node。

(2)定義

grammar可以用tree來表示,這樣的tree稱為parse tree。parse tree描繪了從start symbol生成string(如:9-5+2)的過程。

二、其它

alphabet, string, language這三個概念書中沒有嚴格的定義,但卻又是核心概念,可以參考《Introduction to Automata Theory Languages and Computation》這本書。

今天的讀書筆記寫了很多,也是因為書上很多概念沒有明確的定義,需要把相關的內容全部記下然,然後做交叉驗證。

四、參考資料

1. 程式設計

(1)Alfred V. Aho,Monica S. Lam,Ravi Sethi,Jeffrey D. Ullman,《編譯原理(英文版·第1版)》:https://book.douban.com/subject/5416783/

2. 英語

(1)Etymology Dictionary:https://www.etymonline.com

(2) Cambridge Dictionary:https://dictionary.cambridge.org

歡迎搜尋及關注:程式設計人(a_codists)

相關文章