public virtual LNode CallRule(RuleRef rref, bool recognizerMode)
{
Rule target = rref.Rule;
var @params = rref.Params;
if (recognizerMode)
{
target = target.MakeRecognizerVersion();
// Allow recognizers to take fewer arguments than the normal rule
// by truncating argument(s) at the call site.
int maxArgCount = target.Basis.CallsMin(S.Fn, 3) ? target.Basis.Args[2].ArgCount : 0;
if (@params.Count > maxArgCount)
{
@params = @params.First(maxArgCount);
}
}
LNode call = F.Call(target.Name, @params);
if (recognizerMode)
{
return(F.Call(S.If, F.Call(S.Not, call), F.Call(S.Return, F.@false)));
}
else
{
return(rref.AutoSaveResult(call));
}
}