Warning: session_start(): open(/var/lib/php/sessions/sess_p8jcdl4qf4gljge6ada70rmlbr, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
concept Rule {
CtxRule1 source;
Explain explain;
}
static new TreeMap regexpMacros;
static new TreeSet patterns;
p {
silentGC();
L rules = ctxFindRules(#1200000);
regexpMacros.putAll(ctxLoadRegexpMacros(#1200000));
//pnl(regexpMacros);
print("Found " + n(rules, "rules") + ", " + n(regexpMacros, "macros"));
for (CtxRule1 rule : rules) {
Explain e = explain(rule.text(), ctxParsingRules(), "rule");
if (e == null)
print("Bad rule: " + rule.text());
else {
cnew(Rule, source := rule, explain := e);
}
}
evalRulesOnString("wie geht es dir");
save("patterns");
botSleep();
}
sS answer(S s) {
ret evalRulesOnString(s);
}
static S evalRulesOnString(S s) {
for (Rule rule) try {
if (evalRule(rule.explain, s)) {
//print("Fire! " + rule.source.file);
print("Fire! " + rule.source.text());
}
} catch e {
printExplainTree(rule.explain);
rethrow(e);
}
ret "";
}
static bool evalRule(Explain e, S input) {
ret eval(e.sub(1), input);
}
static bool eval(Explain exp, S input) {
if (exp.is("bracket"))
ret eval(exp.sub(0), input);
if (exp.is("and"))
ret eval(exp.sub(0), input) && eval(exp.sub(1), input);
if (exp.is("or"))
ret eval(exp.sub(0), input) || eval(exp.sub(1), input);
if (exp.is("neg"))
ret !eval(exp.sub(0), input);
if (exp.is("quoted")) {
S pattern = unquoteCtx(exp.tok().get(1));
ret evalPattern(pattern, input);
}
if (exp.singleEqualChild())
ret eval(exp.sub(0), input);
throw todo(exp.className());
}
sbool evalPattern(S pat, S input) {
if (empty(pat)) false; // XXX
pat = ctxExpandMacros(pat, regexpMacros);
print("Pattern: " + pat);
patterns.add(pat);
ret regexpCtx(pat, input).find();
}