stream就是個iterable,最基礎的unit是bit,對應二進位製流,
從二進位製流到character流iteralbe是encoding解決的問題,
再往上乙個層次是token流,或者word流
1)基礎的tokenize就是自然token,即按分隔符切割的,alphabet字元(a-z,1-9等)和非alphabet字元(空格,標點,括號等。
2)自然token不一定是和合法的token,token還必須是語言接受的(預定義的),英文本典裡沒有的單詞就是非法英文單詞,再者,像中文這種沒有空格分隔的語言,是不存在自然token的,必須用預定義的某種規則識別。
預定義的方式可以是像英文詞典那樣的有限的,羅列出所有例項,還有乙個例子是程式語言的關鍵字集合;更多是用規則定義,即所謂formal language的概念,就是可以用有限的規則定義出無限的集合。比如正規表示式。規則往往不只一種,一種規則對應一種型別的token。
比如程式語言裡,當前字元流是以int開始的,可以解讀為identifier,也可以解讀為keyword,這裡就有乙個問題,用哪個規則去匹配呢,有兩個原則
1)規則是有優先順序的,或者說有順序的,按順序乙個乙個試,前面的匹配了,就不用考慮後面的規則了
2)匹配多長問題,優先匹配長的,比如 「==」,單等號可以賦值匹配運算子,雙等號可以匹配比較運算子,匹配長的,即雙等號。
這一部分叫詞法分析,lexical analysis、tokenize,輸出是乙個合法的token stream:iterable。注意token即包含了分出的詞的文字,也包含了類別資訊,這一點和01流到character流不同,character是沒有類別的,token除了文字還有類別,(動詞?名詞?冠詞?)
之前都是從一種流到另一種流
01流 ---encoding--> character流 --tokenize---> token流
之後的parse部分,不再是輸出另一種流,不再是一種線性結構,而是樹結構,語法樹。這裡用到的文法一般是上下文無關文法,對應上下文無關語言。上下文無關意思是非終結字元的展開不依賴於兩邊的上下文。
正則文法 < 上下文無關文法 < formal grammar
正則文法就是用字元和三種規則(union, concatenation, iteration) 表達的語言。因為正則是cfg的子集,可以用cfg描述正則文法:
r -> alphabet character
r-> rt
t->r| e
r-> r|r
為什麼要把左遞迴該為右遞迴?
因為右遞迴是先parse了一部分才遞迴的,也就是輸入在收斂的遞迴,這種遞迴是真正的遞迴。左遞迴,輸入沒有任何變化。
為什麼要left factor?
乙個產生式的多個alternative有相同的開始token,改寫一下,提取公共factor,最終使得每個alternative的開始token都不同,left factor 保證只有乙個production是可行的,因為起始token不同。
自頂向下的parse基本是個路徑搜尋問題,從start非終結字元(相當於root)開始,分別嘗試不同的alternative的產生式。要消除左遞迴,並且進行left factoring(剪枝作用,根據當前token有預見性的選擇alternative)。乙個輸入token流,如果可以對應多棵parse tree,則這個cfg文法是具有二義性的。無二義性的的cfg從路徑搜尋的角度就是有且只有一條路徑,乙個可行解。
leetcode wordbreak ||是分詞問題還是parse問題?答案是parse問題,parse問題的特點是整體性,要使得整體匹配。分詞只需要考慮自己,不需要考慮對後續其他詞的影響。word break以現在的知識點看應該是一種二義性(有多個可行解)、上下文相關的文法。
0型文法 1型文法 2型文法 3型文法 的判定
引用 s aas a是什麼型的,為什麼 s asb ab是什麼型的,為什麼 s sas b是什麼型的,為什麼 答 三種文法都屬於上下文無關文法。四種文法的判斷非常簡單,說到到,四種文法就是規定產生式的左和右邊的字元的組成規則不同而已,其它的不能理解就不要去想了,你只要知道判斷的時候就是以產生式的左邊...
0型文法 1型文法 2型文法 3型文法
引用 s aas a是什麼型的,為什麼 s asb ab是什麼型的,為什麼 s sas b是什麼型的,為什麼 答 三種文法都屬於上下文無關文法。四種文法的判斷非常簡單,說到到,四種文法就是規定產生式的左和右邊的字元的組成規則不同而已,其它的不能理解就不要去想了,你只要知道判斷的時候就是以產生式的左邊...
0型文法 1型文法 2型文法 3型文法
引用 s aas a是什麼型的,為什麼 s asb ab是什麼型的,為什麼 s sas b是什麼型的,為什麼 答 三種文法都屬於上下文無關文法。四種文法的判斷非常簡單,說到到,四種文法就是規定產生式的左和右邊的字元的組成規則不同而已,其它的不能理解就不要去想了,你只要知道判斷的時候就是以產生式的左邊...