13

私はdoctest、JavaScript および CoffeeScript の迅速で汚いdoctestの作成者です。コメントの検索に正規表現ではなく JavaScript パーサーを使用して、ライブラリの汚れを軽減したいと考えています。

EsprimaまたはAcornを使用して、次のことを行いたいと考えています。

  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 は、ノード タイプと関数を受け取るウォーカーを提供し、指定されたタイプのノードに遭遇するたびに関数を呼び出してツリーをウォークします。これは有望に思えますが、コメントには当てはまりません。

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

4

2 に答える 2

3

ほとんどの AST 生成パーサーは、コメントを破棄します。Esprima や Acorn が何をするのかはわかりませんが、それが問題かもしれません。

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

... Acorn のコードは GitHub にあります。コメントも捨てているようです。

したがって、どちらかのパーサーを最初にコメントをキャプチャするように修正する必要があるように見えます。その時点で、タスクは簡単になるはずです。

DMS Software Reengineering Toolkit には、ツリー内のコメントをキャプチャする JavaScript パーサーがあります。また、コメント テキストを構文解析して、コメントが表すタイプ (関数宣言、式、変数宣言など) の JavaScript AST にするために使用できる言語部分文字列パーサーと、そのような新しい AST を移植するためのサポート機構も備えています。メインツリーに。AST を操作する場合、この部分文字列機能はおそらく重要です。ほとんどのパーサーは任意の言語フラグメントを解析せず、「プログラム全体」のみを解析するように配線されています。DMS の場合、置き換えるコメント ノードはありません。AST ノードに関連付けられたコメントがあるため、移植プロセスは、単に「コメント ノードを置き換える」よりも少しトリッキーです。それでもかなり簡単です。

ほとんどのパーサー (これらを含む) がソースを読み取り、正規表現と同等のものを使用または適用することによってトークンに分割することを確認します。したがって、これらを既にコメントの検索に使用している場合 (つまり、これらを使用して、破棄する*非*コメントを検索することも意味します。たとえば、コメントのようなテキストを含む文字列リテラルを認識して無視する必要があります)、コメントを見つけるという点では、とにかくパーサーが行うのと同じように実行します。そして、それらをコンテンツに正確に置き換えることだけが必要な場合は、ソース ストリームにコメント プレフィックス/サフィックス /* */ stripped をエコーすることで、明らかに望みどおりの結果が得られるため、この解析機構はすべてやり過ぎのように思えます。

于 2013-02-08T09:51:31.970 に答える
2

Esprima を使用して、目的を達成することができます。

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

ここでのトリックは、AST を変更しないことです。ソース文字列に対して通常の検索置換を行っているかのように、テキストの変更を適用するだけです。交換の位置がずれることがあるので、全部集めて最後からやり直す必要があります。このような変換を実行する方法の例については、私のブログ記事「From double-quotes to single-quotes」をご覧ください (文字列の引用符を扱っていますが、原則は同じです)。

最後になりましたが、 Rocamboleなどの少し高レベルのユーティリティを使用することをお勧めします。

于 2013-02-19T00:48:15.623 に答える