protected virtual StateDescriptionDelegate EvalCompExpr(ParseTree tree)
        {
            bool complement = false;

            for (int i = 0; i < nodes.Count; i++)
            {
                ParseNode node = nodes[i];
                if (node.Token.Type == TokenType.COMPLEMENT)
                {
                    complement = true;
                }
                else if (node.Token.Type == TokenType.Atom)
                {
                    StateDescriptionDelegate value = node.Compile(tree);
                    if (complement)
                    {
                        return(delegate(int effects)
                        {
                            return !value(effects);
                        });
                    }
                    else
                    {
                        return(value);
                    }
                }
            }
            return(null);
        }
        protected virtual StateDescriptionDelegate EvalDiffExpr(ParseTree tree)
        {
            StateDescriptionDelegate a = null;
            StateDescriptionDelegate b = null;
            int i = 0;

            for (; i < nodes.Count; i++)
            {
                ParseNode node = nodes[i];
                if (node.Token.Type == TokenType.IntExpr)
                {
                    a = node.Compile(tree);
                    i++;
                    break;
                }
            }
            for (; i < nodes.Count; i++)
            {
                ParseNode node = nodes[i];
                if (node.Token.Type == TokenType.IntExpr)
                {
                    b = node.Compile(tree);
                    break;
                }
            }
            if (b != null)
            {
                return(delegate(int effects)
                {
                    return a(effects) && !b(effects);
                });
            }
            else
            {
                return(a);
            }
        }
        internal StateDescriptionDelegate Compile(ParseTree tree)
        {
            StateDescriptionDelegate Value = null;

            switch (Token.Type)
            {
            case TokenType.Start:
                Value = EvalStart(tree);
                break;

            case TokenType.UnionExpr:
                Value = EvalUnionExpr(tree);
                break;

            case TokenType.DiffExpr:
                Value = EvalDiffExpr(tree);
                break;

            case TokenType.IntExpr:
                Value = EvalIntExpr(tree);
                break;

            case TokenType.CompExpr:
                Value = EvalCompExpr(tree);
                break;

            case TokenType.Atom:
                Value = EvalAtom(tree);
                break;

            default:
                Value = delegate { return(true); };
                break;
            }
            return(Value);
        }