這篇文章詳解PC端微信掃碼註冊和登入實例代碼
寫完詞法部分,又有很多雜事,週末終於有空來實現偉大的語法解析部分了。
擼完程式碼之後發現,程式太短了,不算上狀態機,才186行(含註解),關鍵程式碼不到100行。運行調試過後,發現還行。居然可以解析OneThink裡面的function.php。這份文件堪稱Php計畫的集大成者,裡面什麼妖魔鬼怪都有,調試的時候真是一把辛酸淚。當然我也是不會說的,哈
有鑑於程序太短,所以我準備詳細地說,以免大家不太明白其中奧妙:)
我們知道,語法解析一般有LL(1),LR(0),SLR(1),LALR(1),LR(1)等分析方法。比較常見的,就是LL(1),LR(0)
LL這種分析方法是從左到右掃描,最左推導;LR是從左到右掃描,最右推導;LL採用的是預測表,LR採用的是分析表;LR的難度在LL之上,分析能力也在LL之上,而且,LR的變化也更多。所以這樣玩票的項目,當然要用LR才能穩穩地創(zhuang)新(bi)。
LR分析器的模型如下圖。
包括兩個棧,其中最首要地工作是產生LR分析表。當然我並不準備老實地按課本上的經典方法來,如何創(tou)新(lan)呢?這是關鍵。
我們看SLR(1),LALR(1),LR(1)都是LR(0)的一種改進,其中最重要的就是那個(1),代表向前看。為什麼要向前看?為了減少分析表的規模。未來有無數的可能性,向前看了,可能性減少了,分析的規模也會大大減少。我們要減少分析的規模就必須向前看,而且看得越多分析表越小,而相反的編程難度也越大。那麼,有沒有一種方法讓我站著把錢賺了,讓我不向前看,難度不增加,分析表又減少呢。
有,還真有,這難不倒一個資深懶漢。我們知道,向前看的需求,來自文法表達式:如A → Abc,它的單一表達式長度越長,不確定性越大。所以,限制方法表達式的最大長度,可以在此長度內保證100%的確定性,也就完全不需要向前看了。我把這種方法命名為限長LR,即LLLR(0,n),n>=3。
如此,這次我理所當然地選擇LLLR(0,3)做為分析方法,而且為了實現方便,我決定不保存狀態,也就不需要生成分析表了,不生成表了,不產生表了…
媽蛋!這也太偷懶了吧。不保存狀態,意味著每次都需要從頭搜尋,效率呢效率,這是程式設計師的生命!
稍安勿躁,表達式的最大長度為3,最多搜尋3步即可,放心吧,就這麼定了。 :)
這就是100行超簡Php編譯器的奧秘,如何,夠創(zhuang)新(bi)吧。原始碼在此:converterV0.4.zip Enjoy!
以上是詳解PC端微信掃碼註冊與登入實例代碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!