機能的なJavaScriptパーサージェネレーター(トランスデューサー付き)

みなさんこんにちは!



JavaScriptトランスデューサーに関する記事が非常に人気があり、^ Wトランスデューサー用のパーサージェネレーターが長い間利用可能であることに注目したいと思いました。 少なくともそれは非常に似ています。 英語の「 Generic Functional Parsers 」の詳細な説明と、実際にはソースコードを含む記事があります



いくつかの新しいルールがあり、リンクはもうありません。それらはすべてを豊富に説明するように私に求めています-したがって、私はいくつかの言葉(必要な水で希釈)に従います。それが何であるかを教えます。 さらに、この記事のロシア語版はありませんし、おそらくないでしょう。 これが成功することを願っています。



上記のリンクからのプロジェクトは、新しいパーサージェネレーターを作成するためのアイデアではなく、構文解析速度をあまり落とさずにパーサーの可読性をどのように達成できるかについての実験です。 実際、スピードは印象的でしたが、すぐに認めましたが、変換器に加えて、生成されたパーサーのこのバージョンは、実行のキャプチャと抑制に基づいています(一致が失敗した場合、実行はスローされ、オプションでラッピング演算子によってインターセプトされます)。 一般的なJSエンジンのtry / catchリークに関する実験中に、それは心から忘れられていました。 この問題を回避するためのヒントがあります。



さまざまなバージョンのpeg.jsによって生成されたコード(これは基礎として採用され、ASTカーネルは代替を作成するためにほぼ完全に書き直されました)と「フレンドリーバージョン」であるpeg.js-fnの比較です。 この比較は、実験の成功をあなたに納得させるためのものです。



生成されたパーサーのコードの比較



また、 peg.js-fnがすべてのpeg.jsテストに成功したことに注意することも重要です。



結果のコードは、遅延関数(意識的なセルフソーイングの前にHabréで多くのことを書いた)の概念についてよく推測しています。



これにより、PEGルールから次のことが可能になります。



 start = . ('aa' / 'oo' / 'ee') .
      
      





コードでJavaScriptパーサーを取得します。



 rules.start = seqnc(ch(), choice(match('aa'), match('oo'), match('ee')), ch())
      
      





もちろん、すべての演算子は遅延して実行されるため、それらをトランスデューサと呼ぶことができます。



この記事では、リンクを使用して、各演算子のコードを例とともに検討します。



PSこの投稿でのトランスデューサーへの言及はすべて、注意を引くためだけに、一種の自己皮肉として使用されています。 実際、提案されたアプローチをそれらに関連付ける十分な理由はありませんが、現在存在する用語の場合を除き、このアプローチはおそらく説明されたアプローチに最も適しています。



All Articles