11

「regexenでXを行う方法」についての投稿が1日にたくさんあります。そして、それらのほとんどに対する最良の反応は、正直なところ、「なぜハンマーでネジを動かそうとしているのか」ということのようです。しかし、regexenはいたるところにあり、構文はほとんど移植可能です。特に、派手な部分から遠ざける場合はそうです。

regexenに相当するものはありますが、パワーと構成可能性の次のレベルにありますか?いくつかの種類の「どこでも使用できます」解析ライブラリ、できればそのインターフェイスとして見事に簡潔なDSLを使用しますか?

私はRagelをいくらか使用しましたが、前処理ステップのため、「毛むくじゃらの正規表現の代わりにこれを使用する」として誰かに勧めることを躊躇します。Obj-Cから使用するのは厄介であり、標準の操作手順の一部としてcompile-link-runがない言語ではひどく厄介になると思います。

私が探しているのは、「インライン-オンライン-ユニバーサル」テストに合格するものです。

  1. (インライン)正規表現の場合と同様に、他のコードとインラインで表記を記述できます。

  2. (オンライン)結果のパーサーは、他のコードと同じように実行できます。つまり、Pythonのようなものの場合、REPLに入力した直後に実行できます。

  3. (ユニバーサル)別の言語/プラットフォームに移動して、パーサーに実質的に同じコードを使用することができます。方言の違いを法として。実際には、Python、Ruby、C、Java、Haskellで動作するものに満足しています。

私が知っているほとんどのツールは「オンライン」に分類されます。文法をオフラインで前処理し、ターゲット言語(C、Python、Java、C ++…)でコードを吐き出します。これらはスタンドアロンツールであり、それ自体は言語環境に統合されていません。

PEGパーサーとlex/yaccコンボの提案がありました。パーサーコンビネーターライブラリも適している可能性があります。あなたが提案するかもしれないものは何でも、私はそれがこれらのテストを満たしていることを実証してもらいたいです。あなたの答えは、Python、C、Haskellで動作するデモパーサーを提供することにより、提案されたソリューションがインラインオンラインユニバーサル要件を満たしていることを実証する必要があります。デモの例は作成者次第ですが、regexenだけを使用すると苦痛になりますが、適切なパーサーを使用すると簡単です。

4

2 に答える 2

1

https://github.com/leblancmeneses/NPEG

PEGを実装します。

3つすべてを満たしています...説明させてください。

これは、C#でのみインラインであり、他のすべてでオフラインです。C#にはオフラインバージョンもあります。

私は現在オフラインバージョンをサポートしています:C / C ++ / Javascript(現在ローカル)/Javaはすべての単体テストに合格しています-ユニバーサルにするためです。別の言語を追加するには25.84時間かかります(オフラインのJavascriptバージョンを作成するのにかかった時間)

すべての言語でオンラインにすることは、多くのメンテナンス(可能性あり)になりますが、現在のオフラインバージョンをサポートするためだけに多くの作業と時間がかかりました。これで、すべてのオフラインバージョンが役立つ文法ルールを単体テストするための文法オプティマイザーとツールの構築に力を注ぐことができます。

于 2012-10-19T00:50:09.627 に答える
0

Lex/Yaccまたはそれに対応するFlex/Bison(またはCoco、または他のすべての「コンパイラ」ジェネレータ)をご覧ください。この組み合わせを使用して、regexenよりも(おそらく)はるかに読みやすい構文で複雑なテキストデータを解析できます。

ただし、単純な問題の場合、regexenで十分である場合は、必ずそれらを使用してください。

于 2012-10-12T09:14:09.257 に答える