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

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

擼完代碼之后發現,程序太短了,不算上狀態機,才186行(含注釋),關鍵代碼不到100行。運行調試過后,發現還行。居然可以解析OneThink里面的function.php。這個文件堪稱Php程序的集大成者,里面什么妖魔鬼怪都有,調試的時候真是一把辛酸淚。當然我也是不會說的,哈

c1dca5104ffac0ac6170cb094ed6360e.png

有鑒於程序太短,所以我准備詳細地來說說,以免大家不太明白其中奧妙:)

我們知道,語法解析一般有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分析器的模型如下圖。

d3a175d3e3e84ce9303e515d3a4f68f6.png

包括兩個棧,其中最首要地工作是生成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!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值