public List <List <string> > Generate()
        {
            if (variables.Count == 0)
            {
                ExpressionStack stack = new ExpressionStack();
                foreach (var token in expression)
                {
                    stack.Push(token);
                }
                return(new List <List <string> > {
                    new List <string>()
                    {
                        stack.ForceEval().Result.ToString()
                    }
                });
            }
            List <List <string> > ret = new List <List <string> >();

            //


            ret.Add(variables.Select(var => var).Prepend("№").ToList()); //DEEP COPY



            for (int i = 0; i < 2 << (variables.Count - 1); i++)
            {
                Dictionary <string, bool> varibaleValues = new Dictionary <string, bool>();

                List <string> row = new List <string> {
                    i.ToString()
                };

                foreach (var(variable, j) in variables.Select((variable, j) => (variable, j)))
                {
                    varibaleValues[variable] = Convert.ToBoolean((i >> (variables.Count - 1 - j)) & 1);

                    row.Add(varibaleValues[variable].ToString());
                }



                ExpressionStack stack = new ExpressionStack(varibaleValues);

                stack.OnEval = (ExprResult result) =>
                {
                    if (i == 0)
                    {
                        ret[0].Add(result.Expression);
                    }

                    row.Add(result.Result.ToString());
                };

                foreach (var token in expression)
                {
                    stack.Push(token);
                }
                stack.ForceEval();
                ret.Add(row);
            }

            return(ret);
        }