more correct and more efficient rule matching
parent
86c0d6b635
commit
dfb94f28b3
38
main.cc
38
main.cc
|
@ -199,11 +199,10 @@ struct ObState {
|
||||||
Uint32 *func = nullptr;
|
Uint32 *func = nullptr;
|
||||||
for (auto &sr: rlist.iter()) {
|
for (auto &sr: rlist.iter()) {
|
||||||
Rule &r = *sr.rule;
|
Rule &r = *sr.rule;
|
||||||
if (!r.func)
|
if (r.func) {
|
||||||
continue;
|
func = r.func;
|
||||||
if (func)
|
break;
|
||||||
return error(1, "redefinition of rule '%s'", tname);
|
}
|
||||||
func = r.func;
|
|
||||||
}
|
}
|
||||||
if (func) {
|
if (func) {
|
||||||
cscript::StackedValue targetv, sourcev, sourcesv;
|
cscript::StackedValue targetv, sourcev, sourcesv;
|
||||||
|
@ -241,16 +240,45 @@ struct ObState {
|
||||||
|
|
||||||
int exec_rule(ConstCharRange target, ConstCharRange from = nullptr) {
|
int exec_rule(ConstCharRange target, ConstCharRange from = nullptr) {
|
||||||
Vector<SubRule> rlist;
|
Vector<SubRule> rlist;
|
||||||
|
SubRule *frule = nullptr;
|
||||||
|
bool exact = false;
|
||||||
for (auto &rule: rules.iter()) {
|
for (auto &rule: rules.iter()) {
|
||||||
if (target == rule.target) {
|
if (target == rule.target) {
|
||||||
rlist.push().rule = &rule;
|
rlist.push().rule = &rule;
|
||||||
|
if (rule.func) {
|
||||||
|
if (frule && exact)
|
||||||
|
return error(1, "redefinition of rule '%s'",
|
||||||
|
target);
|
||||||
|
if (!frule)
|
||||||
|
frule = &rlist.back();
|
||||||
|
else {
|
||||||
|
*frule = rlist.back();
|
||||||
|
rlist.pop();
|
||||||
|
}
|
||||||
|
exact = true;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (exact || !rule.func)
|
||||||
|
continue;
|
||||||
ConstCharRange sub = ob_compare_subst(target, rule.target);
|
ConstCharRange sub = ob_compare_subst(target, rule.target);
|
||||||
if (!sub.empty()) {
|
if (!sub.empty()) {
|
||||||
SubRule &sr = rlist.push();
|
SubRule &sr = rlist.push();
|
||||||
sr.rule = &rule;
|
sr.rule = &rule;
|
||||||
sr.sub = sub;
|
sr.sub = sub;
|
||||||
|
if (frule) {
|
||||||
|
if (sub.size() == frule->sub.size())
|
||||||
|
return error(1, "redefinition of rule '%s'",
|
||||||
|
target);
|
||||||
|
if (sub.size() < frule->sub.size()) {
|
||||||
|
if (!frule)
|
||||||
|
frule = &sr;
|
||||||
|
else {
|
||||||
|
*frule = sr;
|
||||||
|
rlist.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rlist.empty() && !ob_check_file(target)) {
|
if (rlist.empty() && !ob_check_file(target)) {
|
||||||
|
|
Loading…
Reference in New Issue