baiyanphp
所有視頻:https://segmentfault.com/a/11...node
原視頻地址:http://replay.xesv5.com/ll/24...正則表達式
之因此須要作這種從字符串到數據結構(AST)的轉換,是由於編譯器是沒法直接操做「1+2」這樣的字符串的。實際上,代碼的本質根本就不是字符串,它原本就是一個具備複雜拓撲的數據結構,就像電路同樣。「1+2」這個字符串只是對這種數據結構的一種「編碼」,就像ZIP或者JPEG只是對它們壓縮的數據的編碼同樣。
這種編碼能夠方便你把代碼存到磁盤上,方便你用文本編輯器來修改它們(對人友好,方便人們編寫代碼,可是對編譯器不友好),然而你必須知道,文本並非代碼自己。因此從磁盤讀取了文本以後,你必須先「解碼」,才能方便地操做代碼的數據結構。好比,若是上面的Java代碼生成的AST節點叫node,你就能夠用node.operator來訪問加號ADD,用node.left來訪問1,node.right來訪問2。這是很方便的。對於程序語言,這種解碼的動做就叫作parsing,用於解碼的那段代碼就叫作parser。
<?php $lan = '<?php $a = 1; echo $a'; $tokens = token_get_all($lan); foreach ($tokens as $token) { if (is_array($token)) { echo "Line {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL; } }
Line 1: T_OPEN_TAG ('<?php ') Line 1: T_VARIABLE ('$a') Line 1: T_WHITESPACE (' ') Line 1: T_WHITESPACE (' ') Line 1: T_LNUMBER ('1') Line 1: T_WHITESPACE (' ') Line 1: T_ECHO ('echo') Line 1: T_WHITESPACE (' ') Line 1: T_VARIABLE ('$a')
那麼讓咱們你本身去設計一個算法,從一個字符串中識別並取出token,應該怎麼作?算法
例:觀察下面這個正則表達式:segmentfault
(a|b)*abb
- 對於a,只能到狀態0或者1,不能到達結束的3,因此不匹配 - 對於abb,第一個a可使狀態0躍遷到1,第二個b能夠從1躍遷到2,最後一個b結束,因此匹配 - 對於aabb,第一個a能夠選擇從0躍遷到0,第二個從0躍遷到1,後面兩個b同上,匹配 - 對於cabb,第一個c就沒法知足,不匹配