《編譯原理》學習第 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)