2013-02-06 5 views
13

私はdoctestの著者です。JavaScriptとCoffeeScriptの場合はdoctestsです。私は、コメントを見つけるために正規表現ではなくJavaScriptパーサを使用することで、ライブラリのダーティを少なくしたいと考えています。私は次の操作を実行するためにEsprimaまたはAcornを使用したいJavaScript ASTのコメントを、コメントのコンテンツから派生したサブツリーに置き換えます。

  1. AST
  2. を作成し、ツリーを歩くと、各コメントノード用:
    1. はコメントからASTを作成します。ノードのテキスト
    2. メインツリーのコメントノードをこのサブツリーに置き換えます。

入力:

!function() { 

    // > toUsername("Jesper Nøhr") 
    // "jespernhr" 
    var toUsername = function(text) { 
    return ('' + text).replace(/\W/g, '').toLowerCase() 
    } 

}() 

出力:

!function() { 

    doctest.input(function() { 
    return toUsername("Jesper Nøhr") 
    }); 
    doctest.output(4, function() { 
    return "jespernhr" 
    }); 
    var toUsername = function(text) { 
    return ('' + text).replace(/\W/g, '').toLowerCase() 
    } 

}() 

私はこれを行う方法を知りません。 Acornは、ノードタイプと関数をとり、指定されたタイプのノードに出会うたびに関数を呼び出すツリーを歩く、walkerを提供します。これは有望だが、コメントには当てはまらない。

Esprimaで私はesprima.parse(input, {comment: true, loc: true}).commentsを使用してコメントを得ることができますが、ツリーの更新方法がわかりません。

+1

あなたは[JSShaper](https://github.com/olov/jsshaper)を試しましたか? –

+0

私はそのプロジェクトについて知らなかった。それは有望に見えます。 – davidchambers

答えて

3

ほとんどのAST製作パーサーはコメントを捨てます。私はEsprimaやAcornが何をするのか分かりませんが、それは問題かもしれません。

は....実際には、Esprimaは、現在のバグとしてコメントキャプチャを示しています http://code.google.com/p/esprima/issues/detail?id=197

...どんぐりのコードはすぐそこGitHubのです。コメントも離れているようだ。

だから、最初にコメントをキャプチャするパーサーを修正するようになっているようです。その時点でタスクは簡単なものでなければならない。

私たちのDMSソフトウェアリエンジニアリングツールキットには、コメントをキャプチャするJavaScriptパーサーがツリーにあります。また、コメントのテキスト(例えば、関数宣言、式、変数宣言など)のJavaScript ASTへのコメントテキストの解析に使用できる言語部分文字列もあります。新しいASTをメインツリーに追加します。 ASTを操作する場合、この部分文字列機能は重要である可能性があります。ほとんどのパーサーは、任意の言語フラグメントを解析せず、「プログラム全体」を解析するためだけに配線されています。 DMSの場合、置き換えるコメントノードはありません。 ASTノードに関連するコメントがあるため、グラフトプロセスはちょうど「コメントノードを置き換える」よりも少し手間がかかります。まだかなり簡単です。

ほとんどのパーサー(これらを含む)は、正規表現に相当するものを使用または適用することによって、ソースを読み込み、それをトークンに分割することがわかります。だから、既にコメントを見つけるためにこれらを使っているのであれば(つまり、*非*コメントを見つけてそれを捨てることを意味します。コメントのようなテキストを含む文字列リテラルを認識して無視する必要があります)、とにかくパーサーはという意味でを見つけてやっています。そして、あなたがしたいのは、コンテンツと正確に置き換えることだけで、プレフィックス/サフィックス/ * * /ストリッピングされたコメントが付いたソースストリームをエコーし​​て、まさにあなたが望むものを正確に実行するので、この解析機械はすべて過度のようです。

2

あなたはすでにあなたが望むものを達成するためにEsprimaを使用することができます。

  1. は、コードを解析し、(配列など)のコメントを取得します。
  2. コメントを繰り返し、興味のあるものがあるかどうかを確認してください。
  3. コメントを変換する必要がある場合は、その範囲に注意してください。すべての変換を収集します。
  4. 範囲をシフトしないように最初から最後まで変換を適用します。

トリックはここではASTを変更しません。通常の検索を行っているかのようにテキストの変更を適用するだけで、ソース文字列を直接置換できます。交換の位置がシフトする可能性があるため、すべてを収集してから最後のものから行う必要があります。このような変換を実行する方法の例については、私のブログ投稿"From double-quotes to single-quotes"(文字列引用を扱いますが、原則は同じです)を見てください。

最後に、Rocamboleのようなやや高いレベルのユーティリティを使用することをお勧めします。

関連する問題