有時候須要分析一個程序語言,能夠根據分析結果AST 樹轉化成其它語言,或者重構代碼的某些部分, 例如最簡單的有一個函數addlabel(xxx, type, size);用於在場景中加入一個文字,其中第二個參數是字體,好比以前各個地方使用不一樣的字體, 如今但願將全部字體統一, 這時候須要分析代碼找到全部使用這個函數的位置, 將第二個參數變成另外一個字符串。能夠整個分析全部代碼,可是因爲實際使用的語言更相似於javascript 和 c不一樣,總體分析不現實,首先取出代碼中全部包含addlabel的行, 接着對該行進行分析, 替換參數以後,將行重寫寫回去既可。那麼如今就侷限在這一行代碼上,首先c語言須要將代碼寫在函數裏面, 因此構造一個函數:void main(){ xxx.addlabel(xxx, ???, pppp).adfsf(fd).bfdsd(fds);} 這樣一行代碼分析的結果是 c語言中的 結構引用和函數調用, 找到結構引用中域名叫作addlabel的函數調用, 修改第二個參數便可。固然語言中也有擴充,好比addlabel 參數 中多是 [xxx, xxx, xxx] 的數組, 所以須要擴充語法 加入 這種數組。javascript
pycparse 使用的ply庫, 須要在初始化CParser 是設置 lex_optimizer parse_optimize 爲false 關閉 LR table 緩存生成, 修改的代碼纔會生效。java