/// Read expression from string, evaluate it and return the value public object Eval(string expression) { if (expression == null) { return(null); } if (_exprCache == null) { _exprCache = new PrecompiledCache(128); } IOperation ex = _exprCache[expression]; if (ex == null) { using (var sr = new ParsingReader(new StringReader(expression))) { ex = new Parser(TokenSpecialCharacters).Parse(sr); sr.SkipWhiteSpace(); sr.ReadAndThrowIfNot(-1); _exprCache[expression] = ex; } } if (ex == null) { return(null); } return(Eval(ex)); }
private IOperation parseVar() { Operations.OperationVariableAccess va = new Operations.OperationVariableAccess(); var cc = _reader.Peek(); bool blockMode = (cc == '{'); StringBuilder sb = new StringBuilder(); if (!blockMode) { while ((cc = _reader.Peek()) != -1) { var ch = (char)cc; if (!char.IsLetterOrDigit(ch) && _parser._tokenSpecialCharacters.IndexOf(ch) == -1) { break; } sb.Append(ch); _reader.Read(); } va.AddName(sb.ToString()); return(new Operations.OperationExpression(new IOperation[] { va })); } _reader.Read(); // Read { var v = _parser.ParseMulti(_reader); _reader.SkipWhiteSpaceAndComments(); _reader.ReadAndThrowIfNot('}'); // eat } return(v); }
/// Evaluate string and return the result of the evaluation, casted to the type T public T Eval <T>(string st) { using (var sr = new ParsingReader(new StringReader(st))) { var o = Eval <T>(sr); sr.SkipWhiteSpaceAndComments(); sr.ReadAndThrowIfNot(-1); return(o); } }
/// <summary> /// Try to get variable value /// </summary> /// <param name="key">Variable name</param> /// <param name="value">Where to store found variable value</param> /// <returns>true if variable is set</returns> public override bool TryGetValue(string key, out object value) { if (!IsCalculated(key)) { return(base.TryGetValue(key, out value)); } using (var sr = new ParsingReader(key)) { sr.SkipWhiteSpace(); value = sr.ReadNumber(); if (value != null) { sr.SkipWhiteSpace(); sr.ReadAndThrowIfNot(-1); return(true); } } value = EvalMulti(key); return(true); }
/// <summary> /// Try to get variable value /// </summary> /// <param name="key">Variable name</param> /// <param name="value">Where to store found variable value</param> /// <returns>true if variable is set</returns> public override bool TryGetValue(string key, out object value) { if (!IsCalculated(key)) { return(base.TryGetValue(key, out value)); } using (var sr = new ParsingReader(key)) { sr.SkipWhiteSpace(); value = sr.ReadNumber(); if (value != null) { sr.SkipWhiteSpace(); sr.ReadAndThrowIfNot(-1); return(true); } } if (!string.IsNullOrEmpty(key)) { switch (key[0]) { case '%': EnvironmentVariableTarget target = getTarget(ref key); value = Environment.GetEnvironmentVariable(key, target); return(value != null); case '~': value = Find(key.Substring(1), true); return(true); } } value = EvalMulti(key); return(true); }
/// Read multi-expression (like ${a|b|=3+5}) from the string, evaluate it and return the value public object EvalMulti(string multiExpression) { if (multiExpression == null) { return(null); } if (_exprCache == null) { _exprCache = new PrecompiledCache(128); } IOperation o = _exprCache[multiExpression]; if (o == null) { using (var sr = new ParsingReader(new StringReader(multiExpression))) { o = new Parser(TokenSpecialCharacters).ParseMulti(sr); sr.SkipWhiteSpace(); sr.ReadAndThrowIfNot(-1); _exprCache[multiExpression] = o; } } return(Eval(o)); }
private object expandVars(TransformRules rules, string s) { string begin; string end; if ((rules & TransformRules.ExpandDual) == TransformRules.ExpandDual) { begin = "${{"; end = "}}"; } else if ((rules & TransformRules.ExpandDualSquare) == TransformRules.ExpandDualSquare) { begin = "[["; end = "]]"; } else if ((rules & TransformRules.ExpandSquare) == TransformRules.ExpandSquare) { begin = "["; end = "]"; } else if ((rules & TransformRules.Expand) == TransformRules.Expand) { begin = "${"; end = "}"; } else { return(s); } if (s.IndexOf(begin, StringComparison.Ordinal) != -1) { StringBuilder sbNew = new StringBuilder(); using (var sr = new ParsingReader(new StringReader(s))) { int ptr = 0; bool first = true; while (!sr.IsEOF) { char ch = (char)sr.Read(); if (ch != begin[ptr]) { sbNew.Append(begin, 0, ptr); sbNew.Append(ch); ptr = 0; first = false; continue; } ptr++; if (ptr < begin.Length) { continue; } if (sr.Peek() == '{' || sr.Peek() == '[') { sbNew.Append(begin); ptr = 0; first = false; continue; } // object sv = EvalMulti(sr); sv = ((rules & TransformRules.ExpandTrimOnly) == TransformRules.ExpandTrimOnly) ? Utils.TransformStr(Utils.To <string>(sv), rules & TransformRules.TrimMask) : sv; sv = ((rules & TransformRules.ExpandReplaceOnly) == TransformRules.ExpandReplaceOnly) ? Utils.TransformStr(Utils.To <string>(sv), rules & TransformRules.ReplaceMask) : sv; // Now read the trailing stuff sr.SkipWhiteSpace(); for (ptr = 0; ptr < end.Length; ++ptr) { sr.ReadAndThrowIfNot(end[ptr]); } if (sr.IsEOF && first) { return(sv); } ptr = 0; first = false; sbNew.Append(Utils.To <string>(sv)); } for (int i = 0; i < ptr; ++i) { sbNew.Append(begin[i]); } } return(sbNew.ToString()); } return(s); }