コード例 #1
0
        public override string Convert(LuaSkeleton.LuaSkeleton lua, string assignTo, List <IExpression> args)
        {
            var         fCond  = args[0].Optimize();
            var         fValue = args[1];
            IExpression fElse  = null;
            var         arg    = args[2];

            if (args.Count == 4)
            {
                arg   = args[3];
                fElse = args[2];
            }

            var c      = lua.FreeVar("cond");
            var result = "";

            result += "local " + c + "\n";
            var condApplied = fCond.Apply(arg);
            var isString    = condApplied.Types.First().Equals(Typs.String);

            result += Snippets.Convert(lua, c, condApplied) + "\n";
            result += $"if ( {c} or {c} == \"yes\" ) then \n";
            result += "    " + Snippets.Convert(lua, assignTo, fValue.Apply(arg)).Indent();

            if (fElse != null)
            {
                result += "else\n";
                result += "    " + Snippets.Convert(lua, assignTo, fElse.Apply(arg)).Indent();
            }

            result += "end\n";
            return(result);
        }
コード例 #2
0
        public static object Run(this IExpression e, Context c, Dictionary <string, string> tags)
        {
            try {
                var result = e.Apply(new Constant(tags)).Evaluate(c);
                while (result is IExpression ex)
                {
                    result = ex.Apply(new Constant(tags)).Evaluate(c);
                }

                return(result);
            }
            catch (Exception err) {
                throw new Exception($"While evaluating the expression {e} with arguments a list of tags", err);
            }
        }
コード例 #3
0
        public override object Evaluate(Context c, params IExpression[] arguments)
        {
            var         conditionfunc = arguments[0];
            var         thenfunc      = arguments[1];
            IExpression elsefunc      = null;
            IExpression argument      = arguments[2];

            if (arguments.Length == 4)
            {
                elsefunc = arguments[2];
                argument = arguments[3];
            }

            var condition = ((IExpression)conditionfunc).Apply(argument).Evaluate(c);

            if (condition != null && (condition.Equals("yes") || condition.Equals("true") || condition.Equals(true)))
            {
                return(thenfunc.Apply(argument).Evaluate(c));
            }
            else
            {
                return(elsefunc?.Apply(argument)?.Evaluate(c));
            }
        }
コード例 #4
0
 public static IExpression Apply(this IExpression function, params IExpression[] args)
 {
     return(function.Apply(args.ToList()));
 }
コード例 #5
0
 public static IExpression Apply(this IExpression function, IEnumerable <IExpression> args)
 {
     return(function.Apply(args.ToList()));
 }
コード例 #6
0
        /// <summary>
        /// Parses the specified lexer's tokens.
        /// </summary>
        /// <param name="lexer">The lexer.</param>
        /// <returns></returns>
        /// <exception cref="MonkeyspeakException">
        /// </exception>
        /// <exception cref="Exception">String length limit exceeded.</exception>
        public override IEnumerable <Trigger> Parse(AbstractLexer lexer)
        {
            Trigger     currentTrigger = Trigger.Undefined, lastTrigger = Trigger.Undefined;
            Token       token = Token.None, prevToken = default(Token), nextToken = default(Token);
            IExpression expr = null;

            foreach (var t in lexer.Read())
            {
                token = t;
                var tokenType = token.Type;

                if (!Expressions.Instance.ContainsKey(tokenType))
                {
                    continue;
                }

                if (token == default(Token))
                {
                    continue;
                }
                if (VisitToken != null)
                {
                    token = VisitToken(ref token);
                }

                var sourcePos = token.Position;

                string value = token.GetValue(lexer);

                //Logger.Debug<Parser>(token);
                switch (tokenType)
                {
                case TokenType.TRIGGER:
                    if (currentTrigger != Trigger.Undefined)
                    {
                        if (expr != null)
                        {
                            expr.Apply(currentTrigger);
                        }
                        yield return(currentTrigger);

                        lastTrigger    = currentTrigger;
                        currentTrigger = Trigger.Undefined;
                    }
                    expr           = Expressions.Create(tokenType, sourcePos, value);
                    lastTrigger    = currentTrigger;
                    currentTrigger = expr.GetValue <Trigger>();
                    break;

                case TokenType.VARIABLE:
                case TokenType.TABLE:
                    expr = Expressions.Create(tokenType, sourcePos, value);
                    break;

                case TokenType.STRING_LITERAL:
                    if (value.Length > Engine.Options.StringLengthLimit)
                    {
                        throw new MonkeyspeakException("String length limit exceeded.");
                    }
                    expr = Expressions.Create(tokenType, sourcePos, value);
                    break;

                case TokenType.NUMBER:
                    double val = double.Parse(value, System.Globalization.NumberStyles.AllowDecimalPoint
                                              | System.Globalization.NumberStyles.AllowLeadingSign
                                              | System.Globalization.NumberStyles.AllowExponent);
                    expr = Expressions.Create(tokenType, sourcePos, val);
                    break;

                case TokenType.COMMENT:
                    // we don't care about comments
                    break;

                case TokenType.PREPROCESSOR:
                    break;

                case TokenType.END_OF_FILE:
                    if (currentTrigger != Trigger.Undefined)
                    {
                        expr.Apply(currentTrigger);
                        yield return(currentTrigger);

                        lastTrigger    = currentTrigger;
                        currentTrigger = Trigger.Undefined;
                    }
                    break;

                default: break;
                }
                if (expr != null)
                {
                    if (currentTrigger != Trigger.Undefined)
                    {
                        expr.Apply(currentTrigger);
                    }
                    expr = null;
                }
            }
            if (currentTrigger != Trigger.Undefined)
            {
                yield return(currentTrigger);
            }
        }