最近、ANTLRの学習を始めました。レクサー/パーサーを一緒に使用してプログラミング言語を構築できることを知っています。
DSL やプログラミング言語以外で、レクサー/パーサー ツール (および知識) を直接的または間接的に使用して、現実の問題を解決したことがありますか? レクサーやパーサーの知識がなくても、平均的なプログラマーがこれらの問題を解決できるでしょうか?
最近、ANTLRの学習を始めました。レクサー/パーサーを一緒に使用してプログラミング言語を構築できることを知っています。
DSL やプログラミング言語以外で、レクサー/パーサー ツール (および知識) を直接的または間接的に使用して、現実の問題を解決したことがありますか? レクサーやパーサーの知識がなくても、平均的なプログラマーがこれらの問題を解決できるでしょうか?
はい、使用しました。はい、それらがなくてもできますが、作業に間違ったツールを選択するたびに、自分自身に不必要な苦痛を与えることになります.
私が個人的にテクノロジーを利用した非標準的な用途の例:
構文の強調表示。Sciteテキスト エディターを使用すると、独自のレクサーを (C++ で)記述して、任意のカスタム言語に構文の強調表示を提供できます。このトピックの復習として、Scite 用に独自のカスタム レクサーを作成しました (大学で少し前に勉強しました)。
正規表現は、パターン マッチングや単純な言語処理の代替手段としてよく使用されます。これは、.NET などのフレームワークでの RegEx サポートの改善により、近年さらに一般的になっています。多くの場合、開発者は字句解析/解析手法を知らないため、デフォルトで Regex を使用することになります。
ただし、別の回答が言うように、正規表現はすぐに非効率になり、遅くなり、単純な文法/言語以上のものを維持するのが難しくなります。そのような状況では、一般的にパーサー/レクサーが最良の選択です。
はい、実世界でそれらを使用しましたが、ほとんどの場合、レクサーとパーサーを使用するカスタム言語の作成は、XML で定義された言語に取って代わられています。より冗長ですが、すべての作業を行う必要はありません...
テキスト入力を処理する場所では、何らかのレクサー/パーサーを使用することになりますが、時にはそれらが退化したケースになることもあります (1 つのトークン タイプとしてコンマ以外のすべてをレックスし、別のトークン タイプとしてコンマをレックスします。数値、名前、数値を解析します)。そのようなこと) ある見方でsscanf
は、レクサー/パーサージェネレーターの最も退化したケースと見なすことができます。
本格的な lex/yacc 操作については? 主にGPLや DSL の大まかな定義に該当するものに使用されると思います
多くのシステムで使用されているレクサー/パーサーの好例が、Apache Lucene (オープン ソースの検索インデックス ライブラリ) にあります。クエリ パーサーとドキュメント トークナイザーの両方がこれらのテクノロジを使用します。Lucene のクエリ パーサーを DSL パーサーとして分類できると思いますが、実際の問題を解決するためにまだ使用されています。
さらに言えば、Google は独自のクエリ構文とドキュメントの解析のために何らかのレクサー/パーサーを採用していると確信しています。
これは面白い -
単純な文字列ベースのクエリ式を IBindingListView 実装で処理できるように、レクサー/パーサーを手作業で作成しました。これは、コード以外で実際に使用できた最初の有用なものであり、それについて聞いただけではありません。
かなり歩行者の例ですが、私は彼らとの経験ではかなり歩行者です。
私は大物を使って字句解析を行ったことはまだありませんが、自分が取り組んでいるプロジェクトのために自分の字句解析プログラムを手作業で作成しました。近宇宙プロジェクトのデータ コンピューターから返されたデータを解析する必要があり、バイナリで SD カードに書き込まれました。ビットを引き離し、2 進数から 10 進数に変換してから、内容全体をカンマ区切りのファイルに書き出す必要がありました。
座って論理的に考え、目の前のタスクのステート マシンを作成するのはとても楽しいことです。
はい!私が一緒に働いているチームは、ドキュメント生成フレームワークを実装しました。これにより、(主に算術) 式を評価することができます。パーサーを使用して、生成されたドキュメントの入力/定義から式を抽出し、それらの式ツリーを作成しています。その後、これらのツリーが評価され、評価された結果が最終ドキュメントに書き込まれます。