QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-词法分析(3)【简书被冻结-搬运】
此次共享,騰訊內網 / 外網同步發布。
內部代碼地址:https://git.code.oa.com/fatboyli/QBDF
外部代碼地址:GitHub - ventureli/QBDF
兩年前的一個混淆包(無源碼):GitHub - ventureli/VLOCInterpreter
作者:騰訊fatboyli(李文強)
本章節主要講解詞法分析。此法分析其實是整個解釋器里最簡單的部分,編輯原理里的詞法分析用一句話就能總結:把源程序的字符串變成單詞(用token表示)數組。在整個過程中需要一些額外的操作。例如針對OC需要修正部分單詞,比如“interface”這個單詞,如果在不同的位置是有不同的含義的。既可以作為變量名,也可以作為關鍵字。
先貼一張傳統的詞法分析的有窮自動機的示意圖。
詞法分析有窮自動機示意圖
上面的不同的符號和表達方式很好懂,如果不理解的話,可以搜索引擎中搜索下有窮自動機即可查到相關的定義。
整個QBDF的此法分析是一個比較中規中規中矩的寫法。具體的代碼大家參考源文件 “QBDFTKProcess.m” 源文件的代碼。
這里做一個簡單的解析,比如對應數字的識別??梢钥吹竭@樣的代碼,這個代碼就完全對應到了有窮狀態自動機的數字這一塊。
詞法分析-數值匹配
所以根據這個狀態機,就完成了一個最基本的詞法解釋器。其余的比如標示符的識別,標點符號的識別,關鍵字的識別等同理都是這個原理實現。
好了,現在我們基本了解了詞法分析的套路,我們來看下QBDF的為詞法分析做的定義。
首先我們定義一個單詞的類型。
定義單詞的類
每個單詞都有一個類型,我們需要定義好這個類型,這部分的定義在文件“QBDFScriptMainDefine.h”中,我們截圖一部分、
通過enum定義單詞類型
注意:這里的開始一個枚舉是從128開始的
當然單詞里還有些特殊的變量,比如整形/字符串這種我們需要他們的值的,這個我們就存在tokenvalue里,至于為什么用id類型,想下就明白,在OC里也就只有id類型是最通用的了。我們這里只是保存值,至于是什么類型的由tokenType決定,完全可以用的時候通過id類型進行轉換。
另外還有一點需要注意:QBDF的詞法分析的過程中包括了注釋剔除的工作,我們在這一步把所有的注釋全部都過濾掉了。代碼如下
去除注釋
當初為了快速完成整個QBDF的架構,我們并沒有支持/*。。。。*/ 這種注釋,這里的代碼是針對 // 開始的注釋我們一直過濾處理下標到‘\n’為止,就實現了我們說的行注釋
當然針對與OC還有一些修改。主要有以下兩點。
1.特殊的token(單詞)
比如對于‘@’開頭的關鍵詞是這樣處理的。
a)“@interface”,“@end”,“@property” ,這些單詞其實是沒有必要在拆分了,他們可以作為一個最小的單元。
b)另外就是字符串 ,我們知道其他語言的字符串通常是用 單引號,或者雙引號開頭的,而OC是采用的 @“”進行的,這個也是沒有必要進行再次拆分的,完全都可以把 @“abced” 作為一個token進行處理的。
這里貼下對與@開頭的關鍵詞的處理
‘@’開頭的關鍵詞處理
2.特殊符號的屬性修正
我們通過詞法分析最開始拿到的大部分都是標示符,但是其實這些標示符中有一部分是關鍵詞的應該單獨列出來。比如“if,else,while,continue,break”等等。所以我們寫了一個一個方法對單詞進行修正。
標示符號修正為關鍵詞
關鍵詞合并
還有部分變量類型的生命不是一個單詞的,QBDF的詞法解析也進行了處理了(這個并不是必須的,只是這樣做會更簡單方便),比如 “long long” ,“unsigned int ” 等多余兩個單詞表示為一個變量的其實也可以進行處理。??
多個單詞標示一個類型的標示符修正
有一點提下:對于一些標點符號我們是直接用他們的ASCII碼的數值作為他們的類型的,具體看代碼如下:
針對標點符號的處理
這也就是為什么在“QBDFScriptMainDefine.h”定義的第一個枚舉是從128開始的,這樣就肯定不會和我們的標點符號類型相碰撞。
另外還有一個注意點就是,C系列語言(包含OC),一個單引號包含一個字符,表示一個char這種情況,通常是可以作為一個整型表示的,所以QBDF也是這么處理的。這里就不同貼代碼了。
經過詞法分析我們把源程序字符串變成了一個一個的單詞(token)隊列。有了單詞隊列我們就可以了進行語法分析,只有經過了語法分析我們才能明白好一段程序的真正含義。
總結
以上是生活随笔為你收集整理的QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-词法分析(3)【简书被冻结-搬运】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 凸优化算法
- 下一篇: 乐max2 android9,乐视Max