テキストの本文から情報を抽出し、それを照会できるようにしたいと考えています。
このテキスト本体の構造は BNF 文法 (またはバリアント) によって指定され、抽出する情報は実行時に指定されます (クエリの構文は現時点では重要ではありません)。
したがって、要件は本当に単純です。
- 構造化された本文を受け取る
- 文法を使用して解析可能な形式で読み込みます
- クエリを実行してその一部を選択する
例で説明するために、そのような文法があるとします (カスタマイズされた BNF 形式):
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<id> ::= 15 * digit
<hex> ::= 10 * (<digit> | a | b | c | d | e | f)
<anything> ::= <digit> | .... (all characters)
<match> ::= <id> (" " <hex>)*
<nomatch> ::= "." <anything>*
<line> ::= (<match> | <nomatch> | "") [<CR>] <LF>
<text> ::= <line>+
そのようなテキストが適合するのは次のとおりです。
012345678901234
012345678901234 abcdef0123
Nor the previous line nor this one would match
次に、ルールに表示されるすべてのタグを一覧表示する必要があるため、たとえば XPath のような構文を使用します。
match//id
これはリストを返します。
これは比較的簡単に思えますが、次の 2 つの大きな制約があります。
- BNF 文法は、実行時に (文字列/ベクトルのような構造から) 読み取る必要があります。
- クエリも実行時に読み込まれます
いくつかの精度:
- 文法が頻繁に変更されることは想定されていないため、メモリ内構造を生成するための「コンパイル」ステップは許容されます (そして、おそらく速度を上げるために必要です)。
- スピードが重要です。必要な部分をその場で収集するためのボーナスポイント
- あいまいさを解消するためのコールバックを持つ可能性に対するボーナス ポイント (たとえば、必要な曖昧さ解消情報が DB アクセスを必要とする場合があります)
- マルチパート文法のボーナスポイント (モジュール性と文法要素の再利用を優先)
たとえば、lex/yacc と flex/bison は知っていますが、コンパイルする C / C++ コードのみを作成しているように見えますが、これは私が探しているものではありません。
BNF文法を「オンザフライ」でパーサーに変換し、このパーサーを使用してテキスト本体から構造化されたメモリ内出力を生成できる堅牢なライブラリ(できれば無料でオープンソース)を知っていますか?
編集:私は代替案を受け入れています。現時点では、おそらく正規表現でこの抽出が可能であるという考えがありましたが、関連する文法の複雑さを考えると、これはすぐに醜くなり、正規表現を維持することは非常に恐ろしい作業になる可能性があります. さらに、文法と抽出を分離することで、毎回わずかに異なる正規表現を使用するのではなく、さまざまな抽出のニーズに同じ文法を再利用できることを願っています。