예제 #1
0
    //

    public static LogicNode ConstructFromString(string input, Dictionary <string, CheckFunWrap> funcDict)
    {
        string            str       = input.Trim();
        Stack <LogicNode> StackNode = new Stack <LogicNode> ();
        Stack <char>      StackOpt  = new Stack <char> ();

        Dictionary <char, int> optPriority = new Dictionary <char, int> ();

        optPriority ['('] = 0;
        optPriority ['|'] = 1;
        optPriority ['&'] = 2;
        optPriority [')'] = 3;

        for (int i = 0; i < str.Length; i++)
        {
            if (char.IsWhiteSpace(input [i]))
            {
                continue;
            }
            if (input[i] == '!' || char.IsLetterOrDigit(input [i]))
            {
                bool anti = false;
                if (input [i] == '!')
                {
                    i   += 1;
                    anti = true;
                }

                int j = i;
                while (j < str.Length && char.IsLetterOrDigit(str [j]))
                {
                    j++;
                }
                if (j >= str.Length || str [j] != '(')
                {
                    Debug.Log("Error Invalid");
                    throw new UnityException("error invalid");
                }
                string funcName = str.Substring(i, j - i);
                i = j + 1;
                j = i;
                while (j < str.Length && str[j] != ')')
                {
                    j++;
                }
                if (j >= str.Length || str [j] != ')')
                {
                    Debug.Log("Error Invalid");
                    throw new UnityException("error invalid");
                }
                string   args = str.Substring(i, j - i);
                string[] argc = null;
                if (args == "")
                {
                    argc = new string[0];
                }
                else
                {
                    argc = args.Split(',');
                }
                i = j;
                LogicNode node = null;
                if (funcDict.ContainsKey(funcName))
                {
                    CheckFunWrap wrap = funcDict [funcName];
                    if (wrap.argNeed != argc.Length)
                    {
                        throw new UnityException("func arg error");
                    }
                    node = new LogicNode(wrap.func, argc);
                }
                else
                {
                    throw new UnityException("no func found");
                }
                node.anti = anti;
                StackNode.Push(node);
            }
            else
            {
                if (StackOpt.Count == 0)
                {
                    StackOpt.Push(str[i]);
                    continue;
                }
                if (str[i] == ')')
                {
                    while (StackOpt.Count > 0 && StackOpt.Peek() != '(')
                    {
                        LogicNode n2      = StackNode.Pop();
                        LogicNode n1      = StackNode.Pop();
                        char      op      = StackOpt.Pop();
                        LogicNode newNode = MergeNode(n1, n2, op);
                        StackNode.Push(newNode);
                    }

                    if (StackOpt.Peek() == '(')
                    {
                        StackOpt.Pop();
                    }
                }
                else
                {
                    if (str[i] != '(' && optPriority[str[i]] > optPriority[StackOpt.Peek()])
                    {
                        StackOpt.Push(str[i]);
                    }
                    else
                    {
                        while (StackOpt.Count > 0 && str[i] != '(' && optPriority[str[i]] <= optPriority[StackOpt.Peek()])
                        {
                            LogicNode n2      = StackNode.Pop();
                            LogicNode n1      = StackNode.Pop();
                            char      op      = StackOpt.Pop();
                            LogicNode newNode = MergeNode(n1, n2, op);
                            StackNode.Push(newNode);
                        }

                        StackOpt.Push(str[i]);
                    }
                }
            }
        }

        while (StackOpt.Count > 0)
        {
            LogicNode n2      = StackNode.Pop();
            LogicNode n1      = StackNode.Pop();
            char      op      = StackOpt.Pop();
            LogicNode newNode = MergeNode(n1, n2, op);
            StackNode.Push(newNode);
        }

        return(StackNode.Pop());
    }
예제 #2
0
 private void BindCheckFunc()
 {
     FuncDict ["True"]  = new CheckFunWrap(True, 0);
     FuncDict ["False"] = new CheckFunWrap(False, 0);
 }