基本的に EBNF を再帰降下パーサーにコンパイルする、いわゆるメタコンパイラーを調査する必要があります。彼らがどのようにそれを行うかは、まさにあなたの質問への答えです。(かなり単純ですが、詳細を理解するのは良いことです)。
本当に素晴らしい論文は、Val Schorre による "MetaII" 論文です。これは神に正直な 1964 年のメタコンパイラ技術です。10 ページで、彼はメタコンパイラを構築する方法を示し、それだけでなく別のコンパイラも提供し、両方の出力を提供します!. これらのいずれかをビルドすると、メタコンパイラが独自の文法を使用して自分自身をコンパイルする方法を理解するという驚くべき瞬間があります。1970 年頃、私が最初にこの論文に出くわしたとき、この瞬間に私はコンパイラに夢中になりました。これは、ソフトウェア ビジネスに携わるすべての人が読むべきコンピューター サイエンスの論文の 1 つです。
James Neighbors (ソフトウェア エンジニアリングにおける「ドメイン」という用語の発明者であり、[これらのメタコンパイラに基づく] 最初のプログラム変換システムの作成者) は、オンラインで素晴らしい MetaII チュートリアルを提供しています。ゼロからの経験 (Neighbors と私が一緒に学部生だったことを除いて、私はこれとは何の関係もありません)。
どちらの方法も、メタコンパイラについて学び、EBNF からパーサーを生成するための優れた方法です。
重要なアイデアは、ルールの左側で、その非終端記号を解析し、一致する場合に true を返し、入力ストリームを進める関数を作成することです。一致せず、入力ストリームが進まない場合は false。関数の内容は右辺で決まります。リテラル トークンは直接一致します。非終端は、他のルール用に生成された他の関数への呼び出しを引き起こします。Kleene* は while ループにマップされ、代替は条件分岐にマップされます。EBNF が対処せず、メタコンパイラが対処するのは、「一致した」かどうか以外に解析がどのように行うかです。その秘密は、出力操作を EBNF に織り込むことです。MetaII 論文は、このすべてを非常に明確にしています。