轉換器4:手寫PHP轉Python編譯器,語法解析部分


寫完詞法部分,又有很多雜事,周末終於有空來實現偉大的語法解析部分了。

擼完代碼之后發現,程序太短了,不算上狀態機,才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才能穩穩地創(tou)新(lan)。

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編譯器的奧秘。源碼在此:converterV0.4.zip Enjoy!

 

<未完待續>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM