誰かが私にこれを説明できますか?特に、次の違いは次のとおりです。
http://github.com/whymirror/gregおよびhttp://piumarta.com/software/peg/
前者は後者のリエントラントバージョンです。
誰かが私にこれを説明できますか?特に、次の違いは次のとおりです。
http://github.com/whymirror/gregおよびhttp://piumarta.com/software/peg/
前者は後者のリエントラントバージョンです。
最も単純なリエントラントパーサーはグローバル変数を使用しないため、複数のインスタンスを同時にアクティブにすることができます(必ずしもスレッドに関連しているわけではありませんが、これが主なユースケースだと思います)。
ただし、より複雑なユースケースでは、同じソースドキュメント内の複数の言語を実際に解析するパーサーを使用できます。たとえば、同じファイル内のJavaコードとHTMLを解析する必要があるJSPパーサーについて考えてみます。両方の言語をカバーする1つの巨大なパーサーを作成する代わりに(おそらく非常に非現実的です)、2つのパーサーを作成してそれらを切り替えることができます。ただし、パーサーがグローバル状態の切り替えを使用する場合は、問題が発生する可能性があります。再入可能なパーサーを使用すると、コルーチンの形式で、または単純な「パーサーAが埋め込みコードのパーサーBを呼び出してから戻る」状況で、パーサーを簡単に切り替えることができます。
追加するために編集:
極端な形式のリエントラント構文解析が必要な場合は、「文法」の各部分式が完全に別個のパーサーであるパーサーコンビネーター(Parsecなど)を確認してください。無数の小さなパーサーを組み合わせて、大きなパーサーを構築します。
再入可能であるためには、コンピュータプログラムまたはルーチン:
- 静的(またはグローバル)非定数データを保持してはなりません。
- アドレスを静的(またはグローバル)非定数データに返さないでください。
- 呼び出し元から提供されたデータに対してのみ機能する必要があります。
- シングルトンリソースへのロックに依存してはなりません。
必ずしもスレッドセーフに関連しているわけではありませんが、ドキュメント内の複数の文法を解析します。