Ejemplo n.º 1
0
 private object GetValue(Dictionary <ExpNode, object> valueDict, ExpNode node)
 {
     if (valueDict.ContainsKey(node))
     {
         return(valueDict[node]);
     }
     return(null);
 }
Ejemplo n.º 2
0
 public void AddChild(ExpNode n)
 {
     if (ChildList == null)
     {
         ChildList = new List <ExpNode>();
     }
     ChildList.Add(n);
 }
Ejemplo n.º 3
0
 private void SetValue(Dictionary <ExpNode, object> valueDict, ExpNode node, object value)
 {
     if (valueDict.ContainsKey(node))
     {
         valueDict[node] = value;
     }
     else
     {
         valueDict.Add(node, value);
     }
 }
Ejemplo n.º 4
0
        private void CompileExp(ExpNode expNode, List <Instruction> list)
        {
            if (expNode.ChildList != null)
            {
                foreach (ExpNode child in expNode.ChildList)
                {
                    CompileExp(child, list);
                }
            }

            Instruction i = MapTokenToInstruction(expNode.Token);

            list.Add(i);
        }
Ejemplo n.º 5
0
        private List <ExpNode> Process(List <ExpNode> list, ProcessType type)
        {
            //Parens
            TokenType oToken    = type == ProcessType.Brackets ? TokenType.Obrack : TokenType.Oparen;
            TokenType cToken    = type == ProcessType.Brackets ? TokenType.Cbrack : TokenType.Cparen;
            var       bi        = FindInner(list, oToken, cToken);
            var       innerList = CreateInnerList(list, bi);

            if (IsFuncOrList(bi.Item1, list, type))
            {
                ExpNode node = list[bi.Item1 - 1];
                if (type == ProcessType.Parens)
                {
                    node.IsFunction = true;
                    List <List <ExpNode> > arglist = SplitFuncArguments(innerList);

                    foreach (List <ExpNode> arg in arglist)
                    {
                        List <ExpNode> argResult = BuildTree(arg);
                        if (argResult.Count > 1)
                        {
                            throw new Exception("Function Argument must resolve to a single ExpNode. spiz.");
                        }
                        node.AddChild(argResult[0]);
                    }
                }
                else
                {
                    node.IsListIndex = true;
                    List <ExpNode> indexResult = BuildTree(innerList);
                    if (indexResult.Count > 1)
                    {
                        throw new Exception("List Index must resolve to a single ExpNode. spiz.");
                    }
                    node.AddChild(indexResult[0]);
                }
                list.RemoveRange(bi.Item1, bi.Item2 - bi.Item1 + 1);
                return(BuildTree(list));
            }
            else
            {
                list.RemoveRange(bi.Item1, bi.Item2 - bi.Item1 + 1);
                var ls = BuildTree(innerList);
                list.InsertRange(bi.Item1, ls);
                return(BuildTree(list));
            }
        }
Ejemplo n.º 6
0
 private int FindIndexOfFirstOp(List <ExpNode> list, List <TokenType> ops)
 {
     for (int i = 0; i < list.Count; i++)
     {
         ExpNode node = list[i];
         if (node.IsLeaf())
         {
             foreach (TokenType op in ops)
             {
                 if (node.Token.Type == op)
                 {
                     return(i);
                 }
             }
         }
     }
     return(-1);
 }
Ejemplo n.º 7
0
        public object Eval(AST ast, ExpNode n, State state, Dictionary <ExpNode, object> valueDict)
        {
            if (n.Token.Type == TokenType.Const)
            {
                return(n.Token.Value);
            }

            object v = GetValue(valueDict, n);

            if (v != null)
            {
                return(v);
            }

            if (n.IsFunction)
            {
                List <object> argList = new List <object>();
                foreach (ExpNode arg in n.ChildList)
                {
                    object r = Eval(ast, arg, state, valueDict);
                    SetValue(valueDict, arg, r);
                    argList.Add(r);
                }

                v = EvalFunc(ast, n.FunctionName, argList, state);
                SetValue(valueDict, n, v);
                return(v);
            }
            else if (n.IsListIndex)
            {
                //Sanity Check
                if (n.ChildList.Count > 1)
                {
                    throw new Exception("List Index can only have 1 child spiz.");
                }
                object index = Eval(ast, n.ChildList[0], state, valueDict);
                index = Sub(state, index);
                SetValue(valueDict, n.ChildList[0], index);

                var list = (List <object>)state[n.ListName].Value;
                v = list[int.Parse(index.ToString())];
                return(v);
            }

            if (n.Token.Type == TokenType.VarName)
            {
                v = n.Token.Value;
                v = Sub(state, v);
                return(v);
            }


            //Sanity check
            if (!n.Token.IsOp())
            {
                throw new Exception("Op Type expected.. spiz.");
            }

            TokenType op = n.Token.Type;

            object lValue = Eval(ast, n.ChildList[0], state, valueDict);

            lValue = Sub(state, lValue);

            object rValue = Eval(ast, n.ChildList[1], state, valueDict);

            rValue = Sub(state, rValue);

            switch (op)
            {
            case TokenType.Plus:
                v = ToInt(lValue) + ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.Minus:
                v = ToInt(lValue) - ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.Divide:
                v = ToInt(lValue) / ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.Multiply:
                v = ToInt(lValue) * ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.Mod:
                v = ToInt(lValue) % ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.Equal:
                v = ToString(lValue) == ToString(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.NotEq:
                v = ToString(lValue) != ToString(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.Lessthan:
                v = ToInt(lValue) < ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.LessThanEq:
                v = ToInt(lValue) <= ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.Morethan:
                v = ToInt(lValue) > ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            case TokenType.MoreThanEq:
                v = ToInt(lValue) >= ToInt(rValue);
                SetValue(valueDict, n, v);
                return(v);

            default:
                throw new NotImplementedException("spiz");
            }
        }
Ejemplo n.º 8
0
 public Expression(ExpNode expNode)
 {
     ExpTree = expNode;
 }
Ejemplo n.º 9
0
 public Expression(List <Token> exp)
 {
     Exp     = exp;
     ExpTree = BuildTree();
 }