実際のアプリケーションでレクサー/パーサーを効果的に使用したことがありますか? [閉まっている]

StackOverflow https://stackoverflow.com/questions/645468

質問

最近、ANTLRの学習を始めました。レクサー/パーサーを一緒に使用してプログラミング言語を構築できることを知っています。

DSLまたはプログラミング言語以外に、実際の問題を解決するためにレクサー/パーサーツール(および知識)を直接的または間接的に使用したことがありますか?平均的なプログラマーは、レクサーやパーサーの知識がなくてもこれらの問題を解決できますか?

役に立ちましたか?

解決

はい、使用しました。はい、あなたはそれらを使わずに物事を行うことができます-しかし、あなたが仕事のために間違ったツールを選ぶときはいつでも、あなたはあなた自身のために不必要な痛みを作るでしょう。

非標準の使用例のいくつかは、私が個人的にこのテクノロジーを使用しています:

  • レガシーシステムによって生成されたレポートからのデータのスクレイピング
  • 正規表現には複雑すぎるデータのパターンを選択する
  • プロトコル分析
  • テキストベースのアドベンチャーゲーム
  • トレドを食べたメタプログラミングAPI(本名ではありません)
  • コード分析/ログ分析
  • 「自由形式」をピッキングするデータベースのフィールド
  • さらに多くのことを忘れています(私は年をとっています)

他のヒント

構文の強調表示。 Scite テキストエディタを使用すると、独自のレクサー(C ++)を記述して、構文の強調表示を行うことができます。任意のカスタム言語。このトピックの復習として、Scite用に独自のカスタムレクサーを作成しました(少し前に大学で勉強しました)。

正規表現は、多くの場合、パターンマッチングと単純な言語処理の代替手段として使用されます。これは、.NETなどのフレームワークでのRegExサポートの改善のおかげで、近年ではさらに一般的です。多くの場合、開発者はレキシング/構文解析のテクニックを知らないため、デフォルトで正規表現を使用します。

ただし、別の答えが示すように、正規表現はすぐに非効率になり、簡単になり、単純な文法/言語以上のものを維持するのが難しくなります。そのような状況では、パーサー/レクサーが一般的に最良の選択です。

はい、私はそれらを実際の世界で使用しましたが、ほとんどがレクサーとパーサーを使用するカスタム言語の作成は、XMLで定義された言語に取って代わりました。より冗長ですが、すべての作業を行う必要はありません...

はい、使用しました。私はANTLRの大ファンです。 ANTLR こちらこちらの簡単な承認。アドホックメソッドを使用して独自のパーサーを手書きすることは可能ですが、パーサーが解析するはずの言語を成長させる必要がある場合、変更が非常に難しく、変更方法を見つけるのに非常に時間がかかります。

テキスト入力を処理する場所は、何らかの種類のレクサー/パーサーを使用することになりますが、場合によっては縮退ケースになります(lexは、1つのトークンタイプとしてのカンマと別のカンマ以外のすべてです。解析、数値、名前、数字と行末。そのようなこと)ある見方をすると、 sscanf は、レクサー/パーサージェネレーターの最も退化したケースと見なすことができます。

完全なlex / yacc操作については?これは主に GPL や、 DSL

静的ドキュメント(ファイルなど)または動的ドキュメント(時間の経過とともに発生するストリームなど)が存在し、そのドキュメントにあらゆる種類の構造がある場合は、何らかの種類のパーサーが必要になります。十分に単純な構造の場合、アドホック解析(文字列のハッキング、正規表現など)で対処できます。入れ子になっていない構造の場合、有限状態マシンでうまくいくことができます。ここでは、レクサージェネレーターが役立つことがよくあります。複雑な構造の場合、ほとんど組織化されたパーサーです。再帰下降スタイルの解析に精通している場合は、手でパーサーを書くことができます。本当に複雑な構造の場合、パーサージェネレーターはほとんどの場合に大きなメリットがあります。

コンピューター言語を処理したい場合、まず出発点としてレクサーとパーサーが必要です。それらは十分ではありません。パーサーの結果に対して何かをする必要があります。

私たちが行った字句解析と解析の本当に素晴らしい使用法は、JOVIALを翻訳することです。 B-2ステルス爆撃機用の1960年代の言語、Cへ。 http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html

Apache Lucene(オープンソースの検索インデックスライブラリ)には、多くのシステムで使用されているレクサー/パーサーの優れた例があります。クエリパーサーとドキュメントトークナイザーの両方がこれらの技術を使用します。 Luceneのクエリパーサーをdslパーサーとして分類できると思いますが、実際の問題を解決するために使用されています。

さらに言えば、Googleは独自のクエリ構文とドキュメント解析のために、何らかの種類のレクサー/パーサーを使用していると確信しています。

これは興味深い-

IBindingListViewの実装で簡単な文字列ベースのクエリ式を処理できるように、手動でレクサー/パーサーを作成しました。これは、コードについて聞いただけでなく、実際に使用することができたコード以外の最初の有用なものでした。

かなりの歩行者の例ですが、私はそれらの経験ではかなり歩行者です。

字句解析を行うために大物の1人をまだ使用していませんが、私が取り組んだプロジェクトのために自分の字句解析器を手で書いています。 Near Spaceプロジェクトのデータコンピューターから返されたデータを解析する必要があり、SDカードにバイナリで書き込まれました。ビットを引き離し、バイナリから10進数に変換してから、内容全体をコンマ区切りファイルに書き込む必要がありました。

座って論理的に考え、手元のタスク用のステートマシンを書くのはとても楽しいです!

はい!私が携わっているチームは、ドキュメント生成フレームワークを実装しました。これにより、特に(ほとんど算術的な)式を評価できます。パーサーを使用して、生成されたドキュメントの入力/定義から式を抽出し、それらの式ツリーを作成しています。その後、それらのツリーが評価され、評価結果が最終ドキュメントに書き込まれます。

scroll top