public override string ToString()
        {
            Func <int, string> getp = (i) => {
                if (list != null && i >= 0 && i < list.Count)
                {
                    return(list[i].ToString());
                }
                return("?");
            };
            Func <string> sl = () => {
                string a = "";
                if (list != null)
                {
                    foreach (var i in list)
                    {
                        a += i.ToString();
                    }
                }
                return(a);
            };
            Func <string> slc = () => {
                string a = "";
                if (list != null)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        if (i != 0)
                        {
                            a += ",";
                        }
                        a += list[i].ToString();
                    }
                }
                return(a);
            };
            Func <string> get2p = () => {
                return("(" + getp(0) + "," + getp(1) + ")");
            };
            Func <bool, string> ifstr = (b) => {
                string d = (b ? "if" : "else if") + getp(0);
                for (int i = 1; i < list.Count; i++)
                {
                    d += getp(i);
                }
                return(d);
            };
            Func <string> pointstr = () => {
                //if (list.Count==2) return GetPointerName() + list[0] +"." +list[1];
                //return GetPointerName() + "." +sl();

                return(GetListElement(0).ToString() + "." + GetListElement(1).ToString());
            };


            string s = "";

            switch (group)
            {
            //case GROUP.BEHAVIOUR:   s = "behaviour \"" + decname + "\"" + sl(); break;
            case GROUP.DEC_FUNC:      s = "function " + decname + sl(); break;

            case GROUP.DEC_VAR:       s = "var " + decname + sl(); break;

            case GROUP.BLOCK_M:       s = " {" + sl() + "} "; break;

            case GROUP.BLOCK_C:       s = "(" + slc() + ")"; break;

            case GROUP.BLOCK_L:       s = "[" + slc() + "]"; break;

            //case GROUP.BLOCK_L_CLAMP: s =   slc(); break;
            case GROUP.PROGRAM:       s = "<pgm>" + sl() + "</pgm>\n.\n."; break;

            case GROUP.FUNCTION:      s = raw + sl(); break;

            case GROUP.SENTENCE:      s = "`" + sl() + ";"; break;

            case GROUP.POINTER:       s = pointstr(); break; // raw + "." +sl(); break;

            case GROUP.RETURN:        s = raw; break;

            case GROUP.QUOTE:
            case GROUP.NAME:          s = "\"" + raw + "\""; break;

            case GROUP.NUMBER:        s = "#" + raw; break;

            case GROUP.SPECIALCHAR:   s = "/" + raw + "/"; break;

            case GROUP.SPECIALWORD:   s = "/" + raw + "/"; break;

            case GROUP.VARIABLE:      s = "$" + raw + sl(); break;

            case GROUP.IF:            s = ifstr(true); break;

            case GROUP.ELSE:          s = "else " + getp(0); break;

            case GROUP.ELSEIF:        s = ifstr(false); break;

            case GROUP.op_Multiply:
            case GROUP.op_Division:
            case GROUP.op_Modulus:
            case GROUP.op_Addition:
            case GROUP.op_Subtraction:
            case GROUP.op_Equality:
            case GROUP.op_LessThan:
            case GROUP.op_GreaterThan:
            case GROUP.op_LessThanOrEqual:
            case GROUP.op_GreaterThanOrEqua:
            case GROUP.op_Assign:    s = group.ToString().Substring(2) + get2p(); break;



            default:                 s = "<<" + group.ToString() + ":" + sl() + ">>"; break;
            }

            return(s);
        }