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); }
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); } }
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)); } }
public static IExpression Apply(this IExpression function, params IExpression[] args) { return(function.Apply(args.ToList())); }
public static IExpression Apply(this IExpression function, IEnumerable <IExpression> args) { return(function.Apply(args.ToList())); }
/// <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); } }