1

この単純化された例のようなタグを持つ ABNF Grammar を含むファイルがあります。

$name = Bertha {userID=013} | Bob {userID=429} | ( Ben | Benjamin ) {userID=265};
$greet = Hi | Hello | Greetings;

$S = $greet $name;

ここでのタスクは、この文法の特定の文を解析してユーザー ID を取得することです。たとえば、文の解析

Greetings Bob

userID 429 を取得する必要があります。文法は実行時に変更される可能性があるため、実行時に読み込む必要があります。

今のところ私のアプローチは次のとおりです。

  1. 文法を 1 つまたは複数のツリーに解析し、それらが属するリーフまたはノードにタグを配置します

  2. これ/それらのツリーで文を解析して、指定された文を作成するツリーを構築します(これにはEarleyを使用することを考えています)

  3. このツリーを使用してタグを取得します (例とは異なり、このようなツリーには複数の異なるタグがあります)

    私の質問は、このタスクを解決するために使用できる、または少なくとも変更できるソフトウェア コンポーネントはありますか? 特に、ステップ 1 と 2 は非常に一般的なようです (1. ABNF 文法を C++ 内部表現 (ツリーなど) に読み込む; 2. 初期アルゴリズム (またはそのようなもの) を 1. の内部表現で操作する)。ステップ 1 の完全で障害のない ABNF パーサーを作成することは、私にとって非常に時間のかかる作業です。

VoiceXML 文法がこのように機能することは知っていますが、それらのパーサーを見つけることができませんでした。基本的に私が見つけることができたのは、単一の文法の C++ コードを生成するパーサー ジェネレーターだけでした。これは、コンパイル時に文法がわからないため、実用的ではありません。

何か案は?

4

1 に答える 1