/// <summary> /// Indexer handling reading adn writing to the registry /// </summary> /// <param name="key">target variable</param> /// <returns>variable value</returns> public IExpression this[VariableExpression key] { get { return registry.ContainsKey(key.Value) ? registry[key.Value] : key; } set { if (registry.ContainsKey(key.Value)) { if(registry[key.Value].Value==value.Value) return; throw new Exception("registry values missmatch " + value + " + " +registry[key.Value]); } registry.Add(key.Value, value); } }
/// <summary> /// Consume next token /// </summary> /// <param name="l">the lexer</param> /// <param name="expr">output expression</param> static void EvalToken(ref Lexer l, out IExpression expr) { switch (l.Token) { case Token.QuotedString: case Token.Float: case Token.Int: case Token.False: case Token.True: if (FuncStack.Count == 0) { expr = new ValueExpression(l.Value); return; } ParamStack.Peek().Add(new ValueExpression(l.Value)); break; case Token.Variable: if (FuncStack.Count == 0) { expr = new VariableExpression(l.Value); return; } ParamStack.Peek().Add(new VariableExpression(l.Value)); break; case Token.Function: FuncStack.Push(l.Value); break; case Token.LeftBrace: ParamStack.Push(new List<IExpression>()); break; case Token.RightBrace: if(FuncStack.Count == 1) { var p = ParamStack.Pop().ToArray(); expr = new FunctionExpression(FuncStack.Pop(), p); return; } var param = ParamStack.Pop().ToArray(); ParamStack.Peek().Add(new FunctionExpression(FuncStack.Pop(),param)); break; case Token.Comma: case Token.Dot: case Token.Space: break; default: throw new ArgumentOutOfRangeException(); } expr = null; }