我正在尝试创建一个允许有限的用户定义替换规则的文本解析器。
也就是说,我正在从 DOS ASCII 文件中读取代码,其中的顺序很重要,并且必须保持行号。有了这个输入,我想应用用户定义的替换规则(用这个字符串交换那个字符串,如果我们看到这个字符串后面跟着那个字符串执行这个翻译,等等)。
输出也是一个格式化的 DOS ASCII 文件。
大多数规则都是直接替换以牙还牙的类型替换,但是,在某些情况下,我想定义一个规则,例如如果 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
};
每当我遇到这样的规则时,我都可以在忽略和应用规则的情况下维护输出,延迟决定使用哪个规则,直到它明确解决。
这有点浪费内存,但似乎是避免两次传递输入数据的最佳方法(输入数据的大小未知,但可能小于 1 兆)。
当然,可能存在这样一种情况,即在一个或两个子节点中触发这种类型的不同规则,这就是树结构的原因。
没有限制必须在父母之前决定孩子,可能父母只能在孩子的一个分支上决定。遇到 EOF 将决定任何未决定的孩子在错误的方向。
所以很明显,在倒带和折叠节点时我必须小心。
这个一般问题有更简单的解决方案吗?有没有办法以比我的树更有效的方式使用标准库容器?