2016-10-10 52 views
0

TL; DR:我想做與相同的事情,但是esprima當我穿過AST樹與estraverse`esprima` AST樹:如何輕鬆檢測和添加功能parens?

ESPrima給出了下面的代碼相同的輸出節點:

!function(){}() 

!(function(){})() 

http://esprima.org/demo/parse.html?code=!function%20()%7B%7D()%0A%0A!(function%20()%7B%7D)()

例如 - 我將通過AST樹遍歷。 On Function Expression ExpressionStatement節點我想檢查 - 如果該節點沒有parens功能 - 我想要添加它。

那麼,我如何檢測功能parens,我怎麼可以添加它們?我查看令牌,但我不知道如何將平坦標記對象與指定AST節點的對象相關聯。

+0

在esprima主頁,它說:那只是「作爲標準化的EStree項目明智的語法樹格式」似乎包括從F.E. AST節點[ESTree(ES5)規格](https://github.com/estree/estree/blob/f32646033ed12e6aaa7f5cd496d936a8f8de194e/es5.md)。對於括號沒有典型的* Subexpression *,這僅僅是Parser所需要的(將被包含在分析樹中)。您可能需要自己的擴展名或在重寫時創建父類。 – makadev

+0

似乎它的任務不是'esprima',而是'escodegen' –

+0

也許,但據我所知,沒有辦法輕鬆做到這一點。你可以重寫[代碼生成器]的CallExpression部分(https://github.com/estools/escodegen/blob/719de3033c4a9a0df27f698c47b48d2af7241835/escodegen.js#L1874),也可以在它周圍添加括號,如果它是'callee'是一個'FunctionExpression'(通過修改'parenthesize'的優先順序)。不知道這是否會破壞別的東西,f.e.方法。文檔主要涵蓋了一些格式設置,似乎他們有一些 - 沒有結果 - 有關添加括號表達式的討論。祝你好運。 – makadev

回答

相關問題