예제 #1
0
        public BinaryExper GetResultFromBrackets(Token t, out int number)
        {
            BinaryExper now_exper = new BinaryExper();


            int          LP_count     = 1;
            List <Token> inter_tokens = new List <Token>();

            inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "KEEP"));
            inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "="));

            for (int i = 1; i < q.Count - 1; i++)
            {
                string v = q[t.seq + i].GetValue();
                if (v != ")")
                {
                    if (v == "(")
                    {
                        LP_count++;
                    }
                    Token nt = q[t.seq + i];
                    nt.seq = inter_tokens.Count;
                    inter_tokens.Add(nt);
                }
                else
                {
                    LP_count--;
                    Token nt = q[t.seq + i];
                    nt.seq = inter_tokens.Count;

                    if (LP_count == 0)
                    {
                        break;
                    }
                    else
                    {
                        inter_tokens.Add(nt);
                    }
                }
            }
            Token nt2 = new OperatorToken(0, inter_tokens.Count, ";"); nt2.seq = inter_tokens.Count; inter_tokens.Add(nt2);

            BinaryExper vvv = new BinaryExper(GetValueFromTokens(inter_tokens));

            vvv.Calculate();
            number = inter_tokens.Count - 3;
            return(vvv);
        }
예제 #2
0
        public string Calculate()
        {
            if (Left != null)
            {
                Left.Calculate();
            }
            else
            {
            }
            if (Right != null)
            {
                Right.Calculate();
            }
            switch (Operator)
            {
            case "+":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        value = (float.Parse(Left.value) + float.Parse(Right.value)).ToString();
                    }
                    else
                    {
                        value = Left.value + Right.value;
                    }
                }
                else
                {
                    value = Left.value + Right.value;
                }
                break;
            }

            case "==":
            {
                if (Left.value == Right.value)
                {
                    value = "true";
                }
                else
                {
                    value = "false";
                }
                break;
            }

            case "!=":
            {
                if (Left.value != Right.value)
                {
                    value = "true";
                }
                else
                {
                    value = "false";
                }
                break;
            }

            case ">=":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }
                        value = (float.Parse(Left.value) >= float.Parse(Right.value)) ? "true" : "false";
                        break;
                    }
                }
                value = Left.value + Right.value;
                break;
            }

            case "<=":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }
                        value = (float.Parse(Left.value) <= float.Parse(Right.value)) ? "true" : "false";
                        break;
                    }
                }
                value = Left.value + Right.value;
                break;
            }

            case "<":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }
                        value = (float.Parse(Left.value) < float.Parse(Right.value)) ? "true" : "false";
                        break;
                    }
                }
                value = Left.value + Right.value;
                break;
            }

            case ">":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }
                        value = (float.Parse(Left.value) > float.Parse(Right.value)) ? "true" : "false";
                        break;
                    }
                }
                value = Left.value + Right.value;
                break;
            }

            case "*":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }

                        value = (float.Parse(Left.value) * float.Parse(Right.value)).ToString();
                    }
                    else
                    {
                        value = Left.value + Right.value;
                    }
                }
                else
                {
                    value = Left.value + Right.value;
                }
                break;
            }

            case "%":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }
                        value = (float.Parse(Left.value) % float.Parse(Right.value)).ToString();
                    }
                    else
                    {
                        value = Left.value + Right.value;
                    }
                }
                else
                {
                    value = Left.value + Right.value;
                }
                break;
            }

            case "/":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }
                        value = (float.Parse(Left.value) / float.Parse(Right.value)).ToString();
                    }
                    else
                    {
                        value = Left.value + Right.value;
                    }
                }
                else
                {
                    value = Left.value + Right.value;
                }
                break;
            }

            case "-":
            {
                if (IsNumeric(Left.value))
                {
                    if (IsNumeric(Right.value))
                    {
                        if (Left.value == "")
                        {
                            Left.value = "0";
                        }
                        if (Right.value == "")
                        {
                            Right.value = "0";
                        }
                        value = (float.Parse(Left.value) - float.Parse(Right.value)).ToString();
                    }
                    else
                    {
                        value = Left.value + Right.value;
                    }
                }
                else
                {
                    value = Left.value + Right.value;
                }
                break;
            }

            case "=":
            {
                value = Left.value = Right.value;
                if (Left.var_name != null)
                {
                    if (VariableList.instance.var_name.Contains(Left.var_name))
                    {
                        VariableList.instance.var_data[VariableList.instance.var_name.IndexOf(Left.var_name)] = value;
                    }
                }
                break;
            }

            case "":
            {
                if (Left != null)
                {
                    value = Left.value;
                }
                break;
            }
            }
            return(value);
        }
예제 #3
0
        public BinaryExper GetExper(Token t)
        {
            if (t == null) //如果t是空则返回空值
            {
                return(new BinaryExper(""));
            }

            //  Console.WriteLine("<<<" + t.GetValue());

            #region 保留字段的函数检测
            if (t.GetValue() == "print")
            {
                int         TokenDis;
                BinaryExper v = GetResultFromBrackets(q[t.seq + 1], out TokenDis);

                if (q[t.seq + 3].GetValue() == ")" && q[t.seq + 4].GetValue() == ";")
                {
                    if (q[t.seq + 2].type == Types.Identifier)
                    {
                        Console.WriteLine(GetVar(q[t.seq + 2].GetValue()));
                    }
                    else
                    {
                        Console.WriteLine(q[t.seq + 2].GetValue().Replace("\"", ""));
                    }
                    now_run_id = t.seq + 5;
                    return(new BinaryExper(""));
                }
                else
                {
                    Console.WriteLine(v.Calculate().Replace("\"", ""));
                    now_run_id = t.seq + TokenDis + 4;
                    return(new BinaryExper(""));
                }
            }
            else if (t.GetValue() == "if")
            {
                int         TokenDis;
                BinaryExper v = GetResultFromBrackets(q[t.seq + 1], out TokenDis);
                if (v.Calculate() == "true")
                {
                    int tokenDis2;
                    GetFieldResult(q[t.seq + TokenDis + 3], out tokenDis2);
                    now_run_id = t.seq + TokenDis + 3 + tokenDis2 + 2;
                    //Console.WriteLine("TRUE>>>" + q[now_run_id].GetValue());
                    return(new BinaryExper(""));
                }
                else
                {
                    int LP_count = 1;
                    int tokenDis = 0;
                    for (int i = 1; i < q.Count; i++)
                    {
                        tokenDis++;
                        if (q[t.seq + TokenDis + 3 + i].GetValue() == "}")
                        {
                            LP_count--;
                            if (LP_count == 0)
                            {
                                break;
                            }
                        }
                        else
                        {
                            if (q[t.seq + TokenDis + 3 + i].GetValue() == "{")
                            {
                                LP_count++;
                            }
                        }
                    }
                    now_run_id = t.seq + TokenDis + 4 + tokenDis;
                    // Console.WriteLine("FASLE>>>"+q[now_run_id-2].GetValue() + q[now_run_id-1].GetValue() + q[now_run_id].GetValue() + q[now_run_id+1].GetValue() );
                    return(new BinaryExper(""));
                }
            }
            else if (t.GetValue() == "[" && q[t.seq + 2].GetValue() == "]" && q[t.seq + 3].GetValue() == ";")
            {
                SetVar(q[t.seq + 1].GetValue(), (t.seq + 2).ToString());
                now_run_id = t.seq + 4;
                return(new BinaryExper(""));
            }
            else if (t.GetValue() == "goto" && q[t.seq + 2].GetValue() == ";")
            {
                now_run_id = int.Parse(GetVar(q[t.seq + 1].GetValue()));
                return(new BinaryExper(""));
            }
            else if (t.GetValue() == "quit" && q[t.seq + 1].GetValue() == "(" && q[t.seq + 2].GetValue() == ")" && q[t.seq + 3].GetValue() == ";")
            {
                Environment.Exit(0);
                return(new BinaryExper(""));
            }
            else if (t.GetValue() == "clear" && q[t.seq + 1].GetValue() == "(" && q[t.seq + 2].GetValue() == ")" && q[t.seq + 3].GetValue() == ";")
            {
                Console.Clear();
                return(new BinaryExper(""));
            }
            else if (t.GetValue() == "input")
            {
                if (q[t.seq + 1].GetValue() == "(")
                {
                    if (q[t.seq + 3].GetValue() == ")" && q[t.seq + 4].GetValue() == ";")
                    {
                        if (q[t.seq + 2].type == Types.Identifier)
                        {
                            string name = q[t.seq + 2].GetValue();
                            if (!VariableList.instance.var_name.Contains(name))
                            {
                                VariableList.instance.var_name.Add(name);
                                VariableList.instance.var_data.Add("");
                            }

                            VariableList.instance.var_data[VariableList.instance.var_name.IndexOf(name)] = Console.ReadLine();;
                            now_run_id = t.seq + 5;
                            return(new BinaryExper(""));
                        }
                    }
                }
            }

            #endregion

            #region 四则运算
            if (t.seq < q.Count)
            {
                if (q[t.seq + 1].GetValue() == ";")
                {
                    now_run_id = t.seq + 2;
                    BinaryExper e = new BinaryExper(t);
                    return(e);
                }
            }
            else
            {
                BinaryExper e = new BinaryExper(t);
                return(new BinaryExper(e));
            }
            BinaryExper now_exper = new BinaryExper();

            #region 括号
            if (t.GetValue() == "(")
            {
                int          LP_count     = 1;
                List <Token> inter_tokens = new List <Token>();
                inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "KEEP"));
                inter_tokens.Add(new OperatorToken(0, inter_tokens.Count, "="));


                for (int i = 1; i < q.Count - 1; i++)
                {
                    string v = q[t.seq + i].GetValue();
                    if (v != ")")
                    {
                        if (v == "(")
                        {
                            LP_count++;
                        }
                        Token nt = q[t.seq + i];
                        nt.seq = inter_tokens.Count;
                        inter_tokens.Add(nt);
                    }
                    else
                    {
                        LP_count--;
                        Token nt = q[t.seq + i];
                        nt.seq = inter_tokens.Count;

                        if (LP_count == 0)
                        {
                            break;
                        }
                        else
                        {
                            inter_tokens.Add(nt);
                        }
                    }
                }
                Token nt2 = new OperatorToken(0, inter_tokens.Count, ";"); nt2.seq = inter_tokens.Count; inter_tokens.Add(nt2);

                BinaryExper vvv = new BinaryExper(GetValueFromTokens(inter_tokens));
                vvv.Calculate();

                if (q.Count > (t.seq + inter_tokens.Count + 1))
                {
                    now_exper.Left     = vvv;
                    now_exper.Operator = q[t.seq + inter_tokens.Count - 1].GetValue();
                    if (now_exper.Operator == ";")
                    {
                        now_run_id = t.seq + inter_tokens.Count;
                        now_exper  = vvv;
                    }
                    else
                    {
                        now_exper.Right = GetExper(q[t.seq + inter_tokens.Count]);
                    }
                    return(now_exper);
                }
                else
                {
                    now_exper = vvv;
                    return(now_exper);
                }
            }
            #endregion
            now_exper.Left     = new BinaryExper(t);
            now_exper.Operator = q[t.seq + 1].GetValue();
            if (now_exper.Operator == "*" | now_exper.Operator == "/" | now_exper.Operator == "%")
            {
                if (q[t.seq + 2].GetValue() != "(")
                {
                    now_exper.Right = new BinaryExper(q[t.seq + 2]);
                    if (q[t.seq + 3].GetValue() == ";")
                    {
                        now_run_id = t.seq + 4;
                        return(now_exper);
                    }
                    //检测右子树再右边的内容
                    BinaryExper new_exper = new BinaryExper();
                    new_exper.Left     = now_exper;
                    new_exper.Operator = q[t.seq + 3].GetValue();
                    new_exper.Right    = GetExper(q[t.seq + 4]);
                    return(new_exper);
                }
                else
                {
                    int tokenDis = 0;
                    now_exper.Right = GetResultFromBrackets(q[t.seq + 2], out tokenDis);
                    if (q[t.seq + 4 + tokenDis].GetValue() == ";")
                    {
                        now_run_id = t.seq + 4 + 1 + tokenDis;
                        return(now_exper);
                    }
                    BinaryExper new_exper = new BinaryExper();
                    new_exper.Left     = now_exper;
                    new_exper.Operator = q[t.seq + 4 + tokenDis].GetValue();
                    new_exper.Right    = GetExper(q[t.seq + 5 + tokenDis]);
                    return(new_exper);
                }
            }
            else
            {
                now_exper.Right = GetExper(q[t.seq + 2]);
                return(now_exper);
            }
            //递归走起
            #endregion
        }