1

次の正規表現があります。

/(?:this\.(\w+)\(([\s\S]*?)\))/g

次のようなコードを取得するために使用されます。

this.doSomething(foo, bar)

そしてそれを次のように置き換えます:

this.lookup('doSomething', [foo, bar])

そのユース ケース (最も一般的なユース ケース) では正しく動作しますが、次のthisように がその中で使用されている場合は動作しません。

this.doSomething(foo, bar, this.baz())

間違った結果は次のとおりです。

this.lookup('doSomething', [foo, bar, this.baz(]))

これは次のようになります。

this.lookup('doSomething', [foo, bar, this.baz()])

さて、それが最初の問題です。実際には のように変換する必要があるthis.doSomethingため、最終的な結果は次のようになります。

this.lookup('doSomething', [foo, bar, this.lookup('baz', [])]);

基本的に、私の正規表現は、からthis.baz()の閉じ括弧がの閉じ括弧でthis.doSomething()あり、再帰的に動作しないと想定しています。ここでは、ある種の再帰的な動作/制御が必要です。

xregexpについて聞いたことがありますが、それがどのように役立つかわかりません。また、真の言語パーサーが唯一の方法であるようにも思われます。私はそこでの経験はあまりありませんが、手を汚すことを恐れていません。Esprima のようなツールが役に立ちますか?

結局のところ、私は自分のコードのビルドステップで言語/構文のマイナーな変更を加えたいと考えています。つまり、Babel が行っているのとまったく同じです。私は実際にBabelを使用しています。たぶん、ある種のBabelプラグインがオプションですか?

とにかく、私はクイックフィックス正規表現のトリックまたはよりプロ/ロバストな言語解析テクニックの両方に対してオープンです。また、そのような問題が一般的にどのように扱われるのかにも興味があります。入力全体をスキャンし、開き括弧/閉じ括弧/括弧などを一致させると思いますか??

4

1 に答える 1