13

誰かが私にこれを説明できますか?特に、次の違いは次のとおりです。

http://github.com/whymirror/gregおよびhttp://piumarta.com/software/peg/

前者は後者のリエントラントバージョンです。

4

2 に答える 2

18

最も単純なリエントラントパーサーはグローバル変数を使用しないため、複数のインスタンスを同時にアクティブにすることができます(必ずしもスレッドに関連しているわけではありませんが、これが主なユースケースだと思います)。

ただし、より複雑なユースケースでは、同じソースドキュメント内の複数の言語を実際に解析するパーサーを使用できます。たとえば、同じファイル内のJavaコードとHTMLを解析する必要があるJSPパーサーについて考えてみます。両方の言語をカバーする1つの巨大なパーサーを作成する代わりに(おそらく非常に非現実的です)、2つのパーサーを作成してそれらを切り替えることができます。ただし、パーサーがグローバル状態の切り替えを使用する場合は、問題が発生する可能性があります。再入可能なパーサーを使用すると、コルーチンの形式で、または単純な「パーサーAが埋め込みコードのパーサーBを呼び出してから戻る」状況で、パーサーを簡単に切り替えることができます。


追加するために編集:

極端な形式のリエントラント構文解析が必要な場合は、「文法」の各部分式が完全に別個のパーサーであるパー​​サーコンビネーター(Parsecなど)を確認してください。無数の小さなパーサーを組み合わせて、大きなパーサーを構築します。

于 2010-03-14T06:10:03.723 に答える
6

ウィキから

再入可能であるためには、コンピュータプログラムまたはルーチン:

  • 静的(またはグローバル)非定数データを保持してはなりません。
  • アドレスを静的(またはグローバル)非定数データに返さないでください。
  • 呼び出し元から提供されたデータに対してのみ機能する必要があります。
  • シングルトンリソースへのロックに依存してはなりません。

必ずしもスレッドセーフに関連しているわけではありませんが、ドキュメント内の複数の文法を解析します。

于 2010-03-14T06:39:01.887 に答える