2016-10-10 1 views
0

TL; DR:と同じことをしたいが、estraverseでASTツリーをたどるとesprimaとする。`esprima` ASTツリー:関数parensを簡単に検出して追加するには?

ESPrimaは、次のコードに対して同じ出力ノードを与える:例えば

!function(){}() 

!(function(){})() 

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

を - 私はASTツリーをトラバースします。 Function Expression ExpressionStatementノードでチェックしたい - そのノードが関数の周りに括弧を持っていない場合 - 私はそれを追加したい。

だから、どうすれば関数の括弧を検出できますか、どのように追加できますか?私はトークンを見ていますが、どのように私はフラットトークンオブジェクトを指定されたASTノードとオブジェクトに関連付けることができないのか分かりません。

+0

のために、それは言う:「賢明な構文木の形式をEStreeプロジェクトによって標準化として」、それが唯一のf.e.からASTノードを含めるように見えます[ESTree(ES5)Spec](https://github.com/estree/estree/blob/f32646033ed12e6aaa7f5cd496d936a8f8de194e/es5.md)。括弧には典型的な* Subexpression *はありませんが、これはパーサーのみが必要です(解析ツリーに含まれる)。あなたはおそらくあなた自身の拡張子を必要とするか、書き換え時に括弧を作成します。 – makadev

+0

'esprima'ではなく' escostgen'のための仕事だと思われます –

+0

おそらく、私が見る限り、これを簡単に行うことはできません。 [コード生成](https://github.com/estools/escodegen/blob/719de3033c4a9a0df27f698c47b48d2af7241835/escodegen.js#L1874)の 'CallExpression'部分をオーバーライドして、' callee'の場合は、その周りにあなたの括弧を追加することができます'FunctionExpression'(' parenthesize'優先順位の修正による)です。それが何かを壊すかもしれないかどうかわからない、f。メソッド。ドキュメントにはほとんどいくつかの書式設定が含まれていますが、その中には何も表示されていないようです - 括弧式の追加に関する議論。それと幸運。 – makadev

答えて

関連する問題