Java 出力コードを生成できる、つまり字句解析器とパーサー用の Java コードを生成し、文法規則に対して実行されるアクション (Java コードとして実現) を含めることができるEarley パーサージェネレーターを探しています。
Java コードを生成する 2 つの Earley パーサー ジェネレーター ( PepとPEN ) を調べましたが、いずれもアクションを文法に埋め込むことができないようです。
Java 出力コードを生成できる、つまり字句解析器とパーサー用の Java コードを生成し、文法規則に対して実行されるアクション (Java コードとして実現) を含めることができるEarley パーサージェネレーターを探しています。
Java コードを生成する 2 つの Earley パーサー ジェネレーター ( PepとPEN ) を調べましたが、いずれもアクションを文法に埋め込むことができないようです。
私があなたの質問を理解した場合、「文法にアクションを埋め込む」とは、文法内にセマンティックアクションを挿入して「インライン」で実行することを意味します(たとえば、入力が解析されているときの解析フェーズ中)。
初期のパーサーは、 文脈に依存しない言語文法 (あいまいなものであっても)を許可するため、これには適していません。参照: http://en.wikipedia.org/wiki/Earley_algorithm
基本的に: 特定の実行と特定の状態に対して、Earley パーサーには可能なすべての解析状態が含まれます。従来のアプローチ (例: Yacc/Bison) は、ルールまたは部分的な入力が一致した後にセマンティック アクションを実行することです。しかし、あいまいな文法 (たとえば、Reduce/Reduce の競合があるもの) を解析する場合、Earley パーサーは両方の「リダクション」を処理しますが、そのあいまいさのために、どのアクションを実行する必要があるかわかりません。
Earley パーサーを使用する通常の方法は、入力を解析し、後で必要なアクションを実行する解析ツリーのフォレストを作成することです (たとえば、有効でないことがわかっているものを破棄したり、それらにセマンティック アクションまたは変換を適用したりします)。
ただし、いくつかのアクションをインラインで実行しようとするこのトピックに関する調査がいくつかあります (申し訳ありませんが、このリンクしか見つかりませんでした) https://link.springer.com/article/10.1007/s00236-009-0107-6
それらのどれも、アクションを文法に埋め込むことを許可していないようです。
一般的に言えば、アクションを文法に直接埋め込むのは得策ではありません。アクションが文法から分離されている方がよいでしょう。