制限付きのユーザー定義の置換ルールを許可するテキスト パーサーを作成しようとしています。
つまり、順序が重要で、行番号を維持する必要がある DOS ASCII ファイルからコードを読み込んでいます。この入力を使用して、ユーザー定義の置換ルールを適用します (この文字列をその文字列と交換し、この文字列の後にその文字列が続く場合は、この変換を実行するなど)。
出力はフォーマットされた DOS ASCII ファイルでもあります。
ルールのほとんどは、tat タイプの置換の代わりに tit を簡単に置き換えますが、将来の任意の時点で A の後に B が続く場合などのルールを定義したい状況があり、このルールを適用します。
これを行うには、構造体のツリーを使用しています。
struct node {
list<string> common; // the text which is not affected by conditions
string condition; // matching this string selects the left, otherwise the right
node *lptr, *rptr; // pointers to the child nodes, if needed
};
このようなルールに遭遇したときはいつでも、ルールが省略され適用された状態で出力を維持し、明確に解決されるまでどちらを使用するかの決定を遅らせることができます。
これは多少メモリを無駄にしますが、入力データを 2 回渡す必要がないようにするには最適な方法のようです (入力データのサイズは不明ですが、おそらく 1 メガ未満です)。
もちろん、このタイプの別のルールが 1 つまたは両方の子ノード内でトリガーされるようなケースが存在する可能性があるため、ツリー構造になっています。
子が親の前に決定されなければならないという制限はありません。親は子の 1 つのブランチでのみ決定可能である可能性があります。EOF に遭遇すると、未決定の子が誤った方向に決定されます。
したがって、ノードを巻き戻したり折りたたんだりするときに注意する必要があることは明らかです。
この一般的な問題に対するより簡単な解決策はありますか? 私のツリーが示すよりも効率的な方法で標準ライブラリ コンテナーを使用する方法はありますか?