26

プロローグ:パーサー(文脈自由文法)によって認識される言語のセットは、スキャナー(正規文法)の言語よりも厳密に大きいですが、ほとんどのパーサージェネレーターにはスキャナーが必要です。

(その背後にある理由を説明しようとしないでください、私はそれらをよく知っています)。

私はパーサーを見てきました、それはのようなスキャナーを必要としません

スキャナーを使用しないことには、いくつかの利点があります。

  • 2つではなく1つの概念(文脈自由文法)
  • 1つのファイルで複数の言語を解析する(HTML / Javascriptなど)
  • 予約キーワードのない言語の解析(PL / 1など)

多くの場合、「回避策」は、パーサーの要求に応じてスキャナーを切り替えるようなものです。

質問:他のスキャナーレスパーサジェネレーター(任意の言語)を知っていますか?これらは実用的ですか(または純粋に学術的ですか)?富田/GLR以外のアプローチはありますか?

回答:

4

6 に答える 6

11

他の2つ:

  • ブライアンフォードの解析式文法(PEG)はスキャナーを必要としません。効率的で怠惰な「packratパーサー」はオプションです。私は、効率的なバイトコードマシンにコンパイルされるLuaLPEGバージョンで良い経験しかありませんでした。かなり実用的です。

  • YAKKERはまだ明らかにプレリリース状態ですが、非常に興味をそそられます。彼らは、Earleyの解析アルゴリズムの効率的なバリエーションであると主張するものを使用しています。

私は実際にはスキャナーレスパーサーの大ファンです。構成が大幅に簡素化されます。そして、典型的なスキャナージェネレーターは、控えめに言っても、使用するのはそれほど楽しいものではありません。Lexのmanページから:

この恐竜を殺すための小惑星はまだ軌道上にあります。

最後に、私はエルクハウンドとの個人的な経験はありませんが、私が聞いた中古の報告は印象的です。疑問の余地はありませんが、スキャナーレスパーサージェネレーターの中には非常に実用的なものもあります。

于 2010-02-13T21:11:36.600 に答える
9

パーサジェネレータはスキャナーを必要としません。しかし、使用しないとかなり頭がおかしくなります。

パーサージェネレーターによって構築されたパーサーは、トークンと呼ばれる限り、何をフィードしてもかまいません。

スキャナーなしでパーサージェネレーターを使用してビルドするには、文法を文字レベルまで定義し、個々の文字をトークンとしてパーサーにフィードします。

これがおかしい理由は、構文解析が字句解析よりも複雑なアクティビティであるためです。レクサーを有限状態マシンとして構築できます。これは、「比較して次の状態にジャンプする」のとほぼ同じようにマシンコードに変換されます。スピードに関しては、それを打ち負かすのは本当に難しいです。パーサージェネレーターは、再帰下降予測解析(ANTLRなどのほとんどのLLジェネレーターの場合)を実行するパーサーを構築するか、ハッシュ、バイナリまたは線形検索などによってテーブルルックアップを実行します。したがって、パーサーは、レクサーがトークンに費やすよりもはるかに多くのエネルギーをトークンに費やします。キャラクター。

文字をトークンとしてパーサーにフィードすると、それに応じて、同等のレクサーよりも多くのエネルギーが文字に費やされます。大量の入力テキストを処理する場合、何百万もの小さな入力ストリームに対して処理するか、いくつかの非常に大きな入力ストリームに対して処理するかにかかわらず、これは最終的に重要になります。

いわゆるスキャナーレスGLRパーサーは、トークンを使用するように設計されたGLRパーサーと比較して、このパフォーマンスの問題に悩まされています。

私の会社はツール、 DMS SoftwareReengineeringToolkitを構築しています これはGLRパーサーを使用します(そして、GLRパーサーを備えているため、知っているすべての一般的な言語と、知らない多くの奇妙な言語を正常に解析します)。私たちはスキャナーレスパーサーについて知っていて、速度差のためにそれらを実装しないことを選択しました。字句トークンを定義するための、古典的なスタイルの(ただし非常に強力な)LEXのようなサブシステムがあります。DMSが同じ入力を処理するXT(スキャナーレスGLRパーサーを備えたツール)ベースのツールに対してノーズツーノーズで行った1つのケースでは、DMSはXTパッケージの10倍の速度であるように見えました。公平を期すために、行われた実験はその場限りのものであり、繰り返されませんでしたが、それが私の疑いと一致したので、私はそれを繰り返す理由がわかりませんでした。YMMV。そしてもちろん、スキャナーレスにしたい場合は、すでに指摘したように、文字端末を使用して文法を書くのは非常に簡単です。

GLRスキャナーレスパーサーには、ほとんどの人にとって重要ではないもう1つの非常に優れたプロパティがあります。スキャナーレスパーサー用に2つの別々の文法を取り、それらを文字通り連結しても、パーサーを取得できます(多くの場合、あいまいさが多くなります)。これは、ある言語を別の言語に埋め込んで構築する場合に非常に重要です。それがあなたがしていることではない場合、これは単なる学術的な好奇心です。

そして、AFAIK、エルクハウンドはスキャナーレスではありません。(私はこれについて間違っている可能性があります)。(編集:2/10:私が間違っていたようです。私の人生で初めてではありません:)

于 2010-02-10T15:47:44.213 に答える
3

boost::spirit::qiboost::spirit::lexフロントエンドとして使用できますが、レクサーは必要ありません。の紹介からboost::spirit::lex

実際、Spirit.Qiを使用すると、レクサーを使用せずにパーサーを記述し、入力文字ストリームを直接解析できます。ほとんどの場合、これは、Spiritが発明されて以来使用されてきた方法です。

boost::spirit(元の)実際には希望どおりに機能しましたが、に移動されましたboost::spirit::classicspirit::qispirit::lexスピリットの新しいデザインなので、クラシックバージョンは省略しました:)

于 2010-02-08T20:05:16.783 に答える
3

Waxeye :式文法(PEG)の解析に基づくスキャナーレスパーサー。

于 2011-09-24T21:54:33.443 に答える
1

ネクロポストでごめんなさい。これを試すことができます-.NET用の埋め込み可能なPEG/Packrat実装:

http://www.meta-alternative.net/pfdoc.pdf

http://www.meta-alternative.net/mbase.html

于 2010-03-18T09:30:03.237 に答える
0

「スキャンオンデマンド」パーサーを作成しました。これは、スキャナー付きのパーサーとスキャナーなしのパーサーの間の一種の妥協点です。

これにより、「予約されたキーワードなし」が可能になり、ある言語を別の言語に埋め込んだりネストしたりできるようになります。

このネストの良い例は、graphviz https://graphviz.gitlab.io/のDot文法です。ここでは、XML/HTMLを外部グラフ言語に埋め込むことができます。

https://info.itemis.com/demo/agl/editorで、私のパーサーとドット文法のデモを見ることができます。

パーサーの詳細については、https: //medium.com/@dr.david.h.akehurst/a-kotlin-multi-platform-parser-usable-from-a-jvm-or-javascript-59e870832a79を参照してください。

于 2020-04-09T13:45:36.287 に答える