static Interpreter() { TagFuncs = new Dictionary <string, FuncDef>(); TagFuncs["rep"] = TagFuncs["r"] = new FuncSig(Repeat, ParamFlags.None); TagFuncs["num"] = TagFuncs["n"] = new FuncSig(Number, ParamFlags.None, ParamFlags.None); TagFuncs["sep"] = TagFuncs["s"] = new FuncSig(Separator, ParamFlags.Code); TagFuncs["before"] = new FuncSig(Before, ParamFlags.Code); TagFuncs["after"] = new FuncSig(After, ParamFlags.Code); TagFuncs["chance"] = new FuncSig(Chance, ParamFlags.None); TagFuncs["sync"] = new FuncSig(Sync, ParamFlags.None, ParamFlags.None); TagFuncs["desync"] = new FuncSig(Desync); TagFuncs["pin"] = new FuncSig(Pin, ParamFlags.None); TagFuncs["unpin"] = new FuncSig(Unpin, ParamFlags.None); TagFuncs["step"] = new FuncSig(Step, ParamFlags.None); TagFuncs["reset"] = new FuncSig(Reset, ParamFlags.None); TagFuncs["first"] = new FuncSig(First, ParamFlags.Code); TagFuncs["last"] = new FuncSig(Last, ParamFlags.Code); TagFuncs["middle"] = new FuncSig(Middle, ParamFlags.Code); TagFuncs["notfirst"] = new FuncSig(NotFirst, ParamFlags.Code); TagFuncs["notlast"] = new FuncSig(NotLast, ParamFlags.Code); TagFuncs["notmiddle"] = new FuncSig(NotMiddle, ParamFlags.Code); TagFuncs["odd"] = new FuncSig(Odd, ParamFlags.Code); TagFuncs["even"] = new FuncSig(Even, ParamFlags.Code); TagFuncs["nth"] = new FuncSig(Nth, ParamFlags.None, ParamFlags.None, ParamFlags.Code); TagFuncs["repnum"] = TagFuncs["rn"] = new FuncSig(RepNum); TagFuncs["repindex"] = TagFuncs["ri"] = new FuncSig(RepIndex); TagFuncs["repcount"] = TagFuncs["rc"] = new FuncSig(RepCount); TagFuncs["alt"] = new FuncSig(Alt, ParamFlags.Code, ParamFlags.Code); TagFuncs["match"] = new FuncSig(ReplaceMatch); TagFuncs["group"] = new FuncSig(ReplaceGroup, ParamFlags.None); TagFuncs["arg"] = new FuncSig(Arg, ParamFlags.None); TagFuncs["numfmt"] = new FuncSig(NumFmt, ParamFlags.None); TagFuncs["caps"] = new FuncSig(Caps, ParamFlags.None); TagFuncs["capsinfer"] = new FuncSig(CapsInfer, ParamFlags.None); TagFuncs["out"] = new FuncSig(Out, ParamFlags.None, ParamFlags.None); TagFuncs["close"] = new FuncSig(Close, ParamFlags.None); TagFuncs["extern"] = new FuncSig(Extern, ParamFlags.None); TagFuncs["mark"] = new FuncSig(Mark, ParamFlags.None); TagFuncs["dist"] = new FuncSig(Dist, ParamFlags.None, ParamFlags.None); TagFuncs["get"] = new FuncSig(Get, ParamFlags.None); TagFuncs["send"] = new FuncSig(Send, ParamFlags.None, ParamFlags.None); TagFuncs["len"] = new FuncSig(Length, ParamFlags.None); TagFuncs["char"] = new FuncDef( new FuncSig(Character, ParamFlags.None), new FuncSig(CharacterMulti, ParamFlags.None, ParamFlags.None)); TagFuncs["define"] = new FuncSig(DefineFlag, ParamFlags.None | ParamFlags.Multi); TagFuncs["undef"] = new FuncSig(UndefineFlag, ParamFlags.None | ParamFlags.Multi); TagFuncs["ifdef"] = new FuncSig(IfDef, ParamFlags.None, ParamFlags.Code); TagFuncs["ifndef"] = new FuncSig(IfNDef, ParamFlags.None, ParamFlags.Code); TagFuncs["else"] = new FuncSig(Else, ParamFlags.Code); }
public FuncTagBlueprint(Interpreter interpreter, RantPattern source, Stringe name, IEnumerable <Token <R> >[] argData = null) : base(interpreter) { Source = source; Name = name.Trim(); FuncDef defs; if (!RantFuncs.F.TryGetValue(Name.Value, out defs)) { throw new RantException(Source, Name, "A function of the name '" + Name.Value + "' does not exist."); } if ((_tagDef = defs.GetSignature((argData == null ? 0 : argData.Length))) == null) { throw new RantException(Source, Name, "The function '" + Name.Value + "' has no signature that accepts " + (argData == null ? 0 : argData.Length) + " argument(s)."); } if (argData == null) { _args = new Argument[0]; } else { var lastType = _tagDef.Parameters.Last(); // Insert token arguments into the array, set string args to null. _args = argData.Select((a, i) => (i >= _tagDef.ParamCount ? lastType.HasFlag(ParamFlags.Code) // Covers multi params : _tagDef.Parameters[i].HasFlag(ParamFlags.Code)) ? Argument.FromTokens(a) : null).ToArray(); // Queue string arguments on the stack. for (int i = 0; i < argData.Length; i++) { if ((i >= _tagDef.ParamCount && !lastType.HasFlag(ParamFlags.Code)) || !_tagDef.Parameters[i].HasFlag(ParamFlags.Code)) { interpreter.PushState(Interpreter.State.CreateSub(source, argData[i], interpreter)); } } } }
static RantFuncs() { F = new Dictionary <string, FuncDef>(StringComparer.InvariantCultureIgnoreCase); // Repeaters, probability, and block attributes F["rep"] = F["r"] = new FuncSig(Repeat, ParamFlags.None); F["sep"] = F["s"] = new FuncSig(Separator, ParamFlags.Code); F["before"] = new FuncSig(Before, ParamFlags.Code); F["after"] = new FuncSig(After, ParamFlags.Code); F["chance"] = new FuncSig(Chance, ParamFlags.None); F["break"] = new FuncSig(Break); F["repnum"] = F["rn"] = new FuncSig(RepNum); F["repindex"] = F["ri"] = new FuncSig(RepIndex); F["repcount"] = F["rc"] = new FuncSig(RepCount); // Synchronizers F["sync"] = F["x"] = new FuncDef( new FuncSig(SyncCreateApply, ParamFlags.None, ParamFlags.None), new FuncSig(SyncApply, ParamFlags.None) ); F["xreset"] = new FuncSig(SyncReset, ParamFlags.None); F["xseed"] = new FuncSig(SyncReseed, ParamFlags.None, ParamFlags.None); F["xnone"] = new FuncSig(Desync); F["xnew"] = new FuncSig(SyncCreate, ParamFlags.None, ParamFlags.None); F["xpin"] = new FuncSig(Pin, ParamFlags.None); F["xunpin"] = new FuncSig(Unpin, ParamFlags.None); F["xstep"] = new FuncSig(Step, ParamFlags.None); // RNG manipulation F["branch"] = F["b"] = new FuncDef( new FuncSig(Branch, ParamFlags.None), new FuncSig(BranchScope, ParamFlags.None, ParamFlags.Code) ); F["merge"] = F["m"] = new FuncSig(Merge); F["generation"] = F["g"] = new FuncDef(new FuncSig(Generation), new FuncSig(GenerationSet, ParamFlags.None)); // Repeater conditionals F["first"] = new FuncSig(First, ParamFlags.Code); F["last"] = new FuncSig(Last, ParamFlags.Code); F["middle"] = new FuncSig(Middle, ParamFlags.Code); F["notfirst"] = new FuncSig(NotFirst, ParamFlags.Code); F["notlast"] = new FuncSig(NotLast, ParamFlags.Code); F["notmiddle"] = new FuncSig(NotMiddle, ParamFlags.Code); F["odd"] = new FuncSig(Odd, ParamFlags.Code); F["even"] = new FuncSig(Even, ParamFlags.Code); F["nth"] = new FuncDef( new FuncSig(Nth, ParamFlags.None, ParamFlags.None, ParamFlags.Code), new FuncSig(NthSimple, ParamFlags.None, ParamFlags.Code) ); // Quantifier conditionals F["alt"] = new FuncSig(Alt, ParamFlags.Code, ParamFlags.Code); F["any"] = new FuncSig(Any, ParamFlags.Code, ParamFlags.Code); // Replacers F["match"] = new FuncSig(ReplaceMatch); F["group"] = new FuncSig(ReplaceGroup, ParamFlags.None); // Subrotuine interaction F["arg"] = new FuncSig(Arg, ParamFlags.None); // Formatting F["numfmt"] = new FuncSig(NumFmt, ParamFlags.None); F["caps"] = F["case"] = new FuncSig(Caps, ParamFlags.None); // TODO: [caps] is deprecated. Remove it eventually. F["capsinfer"] = new FuncSig(CapsInfer, ParamFlags.None); // Channels F["out"] = new FuncSig(Out, ParamFlags.None, ParamFlags.None); F["close"] = new FuncSig(Close, ParamFlags.None); // External interaction F["extern"] = F["ext"] = new FuncSig(Extern, ParamFlags.None, ParamFlags.Multi); // Markers and targets F["mark"] = new FuncSig(Mark, ParamFlags.None); F["dist"] = new FuncSig(Dist, ParamFlags.None, ParamFlags.None); F["get"] = new FuncSig(Get, ParamFlags.None); F["send"] = new FuncSig(Send, ParamFlags.None, ParamFlags.None); F["osend"] = new FuncSig(SendOverwrite, ParamFlags.None, ParamFlags.None); F["clrt"] = new FuncSig(ClearTarget, ParamFlags.None); // String generation, manipulation, and analysis F["len"] = new FuncSig(Length, ParamFlags.None); F["char"] = new FuncDef( new FuncSig(Character, ParamFlags.None), new FuncSig(CharacterMulti, ParamFlags.None, ParamFlags.None)); F["num"] = F["n"] = new FuncSig(Number, ParamFlags.None, ParamFlags.None); F["dec"] = new FuncSig(NumberDec); // Flags F["define"] = new FuncSig(DefineFlag, ParamFlags.None | ParamFlags.Multi); F["undef"] = new FuncSig(UndefineFlag, ParamFlags.None | ParamFlags.Multi); F["ifdef"] = new FuncSig(IfDef, ParamFlags.None, ParamFlags.Code); F["ifndef"] = new FuncSig(IfNDef, ParamFlags.None, ParamFlags.Code); F["else"] = new FuncSig(Else, ParamFlags.Code); // Comparisons F["cmp"] = new FuncSig(Compare, ParamFlags.None, ParamFlags.None, ParamFlags.Code); F["is"] = new FuncSig(CmpIs, ParamFlags.None, ParamFlags.Code); // Misc F["src"] = new FuncSig(Src); }