Пример #1
0
        private static bool DoSubDefinition(Token <TokenType> first, Interpreter interpreter, SourceReader reader, State state)
        {
            bool meta = reader.Take(TokenType.Question);

            reader.Read(TokenType.LeftSquare);

            var parameters = new List <Tuple <string, ParamFlags> >();
            var tName      = reader.Read(TokenType.Text, "subroutine name");

            if (!Util.ValidateName(tName.Value))
            {
                throw new RantException(reader.Source, tName, "Invalid subroutine name: '" + tName.Value + "'");
            }

            if (!reader.Take(TokenType.Colon))
            {
                reader.Read(TokenType.RightSquare);
            }
            else
            {
                while (true)
                {
                    bool isTokens = reader.Take(TokenType.At);
                    parameters.Add(Tuple.Create(reader.Read(TokenType.Text, "parameter name").Value, isTokens ? ParamFlags.Code : ParamFlags.None));
                    if (reader.Take(TokenType.RightSquare, false))
                    {
                        break;
                    }
                    reader.Read(TokenType.Semicolon);
                }
            }

            reader.SkipSpace();
            reader.Read(TokenType.Colon);

            var body = reader.ReadToScopeClose(TokenType.LeftSquare, TokenType.RightSquare, BracketPairs.All).ToArray();

            if (meta)
            {
                interpreter.PushState(State.CreateDerivedDistinct(reader.Source, body, interpreter));
                state.AddPreBlueprint(new FunctionBlueprint(interpreter, _ =>
                {
                    _.Engine.Subroutines.Define(tName.Value, Subroutine.FromString(tName.Value, _.PopResultString(), parameters.ToArray()));
                    return(false);
                }));
            }
            else
            {
                interpreter.Engine.Subroutines.Define(tName.Value, Subroutine.FromTokens(tName.Value, reader.Source, body, parameters.ToArray()));
            }

            return(meta);
        }
Пример #2
0
        private static bool DoSubCall(Token <TokenType> first, Interpreter interpreter, SourceReader reader, State state)
        {
            var name = reader.ReadToken();

            if (!Util.ValidateName(name.Value))
            {
                throw new RantException(reader.Source, name, "Invalid subroutine name '" + name.Value + "'");
            }

            bool none = false;

            if (!reader.Take(TokenType.Colon))
            {
                if (!reader.Take(TokenType.RightSquare))
                {
                    throw new RantException(reader.Source, name, "Expected ':' or ']' after subroutine name.");
                }

                none = true;
            }

            IEnumerable <Token <TokenType> >[] args = null;
            Subroutine sub = null;

            if (none)
            {
                if ((sub = interpreter.Engine.Subroutines.Get(name.Value, 0)) == null)
                {
                    throw new RantException(reader.Source, name, "No subroutine was found with the name '" + name.Value + "' and 0 parameters.");
                }
            }
            else
            {
                args = reader.ReadItemsToClosureTrimmed(TokenType.LeftSquare, TokenType.RightSquare, TokenType.Semicolon,
                                                        BracketPairs.All).ToArray();
                if ((sub = interpreter.Engine.Subroutines.Get(name.Value, args.Length)) == null)
                {
                    throw new RantException(reader.Source, name, "No subroutine was found with the name '" + name.Value + "' and " + args.Length + " parameter" + (args.Length != 1 ? "s" : "") + ".");
                }
            }

            state.AddPreBlueprint(new SubCallBlueprint(interpreter, reader.Source, sub, args));

            return(true);
        }
Пример #3
0
 public void Define(string name, Subroutine sub)
 {
     _table[Tuple.Create(name.ToLower().Trim(), sub.ParamCount)] = sub;
 }
Пример #4
0
 internal void Remove(Subroutine sub)
 {
     _table.Remove(_table.FirstOrDefault(x => x.Value == sub).Key);
 }