/// <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);
     }
 }
Exemple #2
0
        /// <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;
        }