Example #1
0
        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);
        }
Example #2
0
        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));
                    }
                }
            }
        }
Example #3
0
        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);
        }