示例#1
0
        public static string get_node_type_presentation(Node_Type type)
        {
            switch (type)
            {
            case Node_Type.nd_empty:      return("Пусто");

            case Node_Type.nd_string:     return("Строка");

            case Node_Type.nd_number:     return("Число");

            case Node_Type.nd_number_exp: return("Число с показателем степени");

            case Node_Type.nd_guid:       return("Уникальный идентификатор");

            case Node_Type.nd_list:       return("Список");

            case Node_Type.nd_binary:     return("Двоичные данные");

            case Node_Type.nd_binary2:    return("Двоичные данные 8.2");

            case Node_Type.nd_binary_d:   return("Двоичные данные data");

            case Node_Type.nd_link:       return("Ссылка");

            case Node_Type.nd_unknown:    return("<Неизвестный тип>");
            }
            return("<Неизвестный тип>");
        }
示例#2
0
        public void OutText(ref string text)
        {
            Node_Type lt = Node_Type.nd_unknown;

            if (num_subnode != 0)
            {
                if (text.Length != 0)
                {
                    text += Environment.NewLine;
                }

                text += "{";
                Tree t = first;
                while (t != null)
                {
                    t.OutText(ref text);
                    lt = t.type;
                    t  = t.next;
                    if (t != null)
                    {
                        text += ",";
                    }
                }
                if (lt == Node_Type.nd_list)
                {
                    text += Environment.NewLine;
                }
                text += "}";
            }
            else
            {
                switch (type)
                {
                case Node_Type.nd_string:
                    text += "\"";

                    //text += string.Re Replace(value, L"\"", L"\"\"", _ReplaceAll);
                    text += this.Value.Replace("\"", "\"\"");
                    text += "\"";
                    break;

                case Node_Type.nd_number:
                case Node_Type.nd_number_exp:
                case Node_Type.nd_guid:
                case Node_Type.nd_list:
                case Node_Type.nd_binary:
                case Node_Type.nd_binary2:
                case Node_Type.nd_link:
                case Node_Type.nd_binary_d:
                    text += this.Value;
                    break;

                default:
                    //if(err) err->AddError(L"Ошибка вывода потока. Пустой или неизвестный узел.");
                    break;
                }
            }
        }
示例#3
0
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="_value"></param>
        /// <param name="_type"></param>
        /// <param name="_parent"></param>
        public Tree(string _value, Node_Type _type, Tree _parent)
        {
            Value  = _value;
            type   = _type;
            parent = _parent;

            num_subnode = 0;
            index       = 0;

            if (parent != null)
            {
                parent.num_subnode++;

                prev = parent.last;

                if (prev != null)
                {
                    prev.next = this;
                    index     = prev.index + 1;
                }
                else
                {
                    parent.first = this;
                }

                parent.last = this;
            }
            else
            {
                prev = null;
            }

            next  = null;
            first = null;
            last  = null;
        }
示例#4
0
 public Tree AddChild(string _value = "", Node_Type _type = Node_Type.nd_empty)
 {
     return(new Tree(_value, _type, this));
 }
示例#5
0
        } // end of parce of tree

        /// <summary>
        /// Парсинг скобочного дерева 1С
        /// </summary>
        /// <param name="text"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public static Tree Parse_1Ctext(String text, String path)
        {
            StringBuilder __curvalue__ = new StringBuilder("");

            String    curvalue = "";
            Tree      ret      = new Tree("", Node_Type.nd_list, null);
            Tree      t        = ret;
            int       len      = text.Length;
            int       i        = 0;
            char      sym      = '0';
            Node_Type nt       = Node_Type.nd_unknown;

            _state state = _state.s_value;

            //for (i = 0; i <= len-1; i++)
            for (i = 1; i < len; i++)
            {
                sym = text[i];

                if (String.IsNullOrEmpty(sym.ToString()))
                {
                    break;
                }

                switch (state)
                {
                case _state.s_value:
                    switch (sym)
                    {
                    case ' ':         // space
                    case '\t':
                    case '\r':
                    case '\n':
                        break;

                    case '"':

                        __curvalue__.Clear();
                        state = _state.s_string;
                        break;

                    case '{':

                        t = new Tree("", Node_Type.nd_list, t);
                        break;

                    case '}':

                        if (t.Get_First() != null)
                        {
                            t.AddChild("", Node_Type.nd_empty);
                        }

                        t = t.Get_Parent();

                        if (t == null)
                        {
                            //if (msreg) msreg->AddError("Ошибка формата потока. Лишняя закрывающая скобка }.", "Позиция", i, "Путь", path);
                            //delete ret;
                            //String msreg = $"Ошибка формата потока. Лишняя закрывающая скобка. Позиция: { i }, Путь: {path}";
                            ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка }. Позиция " + i + ", Путь " + path);
                            ret = null;
                            return(null);
                        }
                        state = _state.s_delimitier;
                        break;

                    case ',':

                        t.AddChild("", Node_Type.nd_empty);
                        break;

                    default:

                        __curvalue__.Clear();
                        __curvalue__.Append(sym);
                        state = _state.s_nonstring;

                        break;
                    }
                    break;

                case _state.s_delimitier:
                    switch (sym)
                    {
                    case ' ':         // space
                    case '\t':
                    case '\r':
                    case '\n':
                        break;

                    case ',':
                        state = _state.s_value;
                        break;

                    case '}':
                        t = t.Get_Parent();
                        if (t == null)
                        {
                            /*
                             * if (msreg) msreg->AddError("Ошибка формата потока. Лишняя закрывающая скобка }.",
                             *   "Позиция", i,
                             *   "Путь", path);
                             */
                            ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка }. Позиция " + i + ", Путь " + path);
                            ret = null;
                            return(null);
                        }
                        break;

                    default:
                        /*
                         * if (msreg) msreg->AddError("Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя.",
                         *   "Символ", sym,
                         *   "Код символа", tohex(sym),
                         *   "Путь", path);
                         */
                        ShowMessage("Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя. Символ " + sym + ", Код символа " + sym.ToString() + ", Путь " + path);
                        ret = null;
                        return(null);
                    }
                    break;

                case _state.s_string:
                    if (sym == '"')
                    {
                        state = _state.s_quote_or_endstring;
                    }
                    else
                    {
                        __curvalue__.Append(sym);
                    }
                    break;

                case _state.s_quote_or_endstring:
                    if (sym == '"')
                    {
                        __curvalue__.Append(sym);
                        state = _state.s_string;
                    }
                    else
                    {
                        t.AddChild(__curvalue__.ToString(), Node_Type.nd_string);
                        switch (sym)
                        {
                        case ' ':         // space
                        case '\t':
                        case '\r':
                        case '\n':
                            state = _state.s_delimitier;
                            break;

                        case ',':
                            state = _state.s_value;
                            break;

                        case '}':
                            t = t.Get_Parent();
                            if (t == null)
                            {
                                /*
                                 * if (msreg) msreg->AddError("Ошибка формата потока. Лишняя закрывающая скобка }.",
                                 *   "Позиция", i,
                                 *   "Путь", path);
                                 */
                                ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка }. Позиция " + i.ToString() + ", Путь " + path);
                                ret = null;
                                return(null);
                            }
                            state = _state.s_delimitier;
                            break;

                        default:
                            /*
                             * if (msreg) msreg->AddError("Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя.",
                             *   "Символ", sym,
                             *   "Код символа", tohex(sym),
                             *   "Путь", path);
                             */
                            ShowMessage("Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя. Символ " + sym + ", Код символа " + sym.ToString() + ", Путь " + path);
                            ret = null;
                            return(null);
                        }
                    }
                    break;

                case _state.s_nonstring:
                    switch (sym)
                    {
                    case ',':
                        curvalue = __curvalue__.ToString();
                        nt       = ClassificationValue(curvalue);
                        if (nt == Node_Type.nd_unknown)
                        {
                            /*
                             * if (msreg) msreg->AddError("Ошибка формата потока. Неизвестный тип значения.",
                             * "Значение", curvalue,
                             * "Путь", path);
                             */
                            ShowMessage("Ошибка формата потока. Неизвестный тип значения. Значение " + curvalue + ", Путь " + path);
                        }
                        t.AddChild(curvalue, nt);
                        state = _state.s_value;
                        break;

                    case '}':
                        curvalue = __curvalue__.ToString();

                        nt = ClassificationValue(curvalue);

                        if (nt == Node_Type.nd_unknown)
                        {
                            //if (msreg) msreg->AddError("Ошибка формата потока. Неизвестный тип значения.", "Значение", curvalue, "Путь", path);
                            ShowMessage("Ошибка формата потока. Неизвестный тип значения. Значение " + curvalue + ", Путь " + path);
                        }
                        t.AddChild(curvalue, nt);
                        t = t.Get_Parent();
                        if (t == null)
                        {
                            /*
                             * if (msreg) msreg->AddError("Ошибка формата потока. Лишняя закрывающая скобка }.",
                             *   "Позиция", i,
                             *   "Путь", path);
                             */
                            ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка. Позиция " + i.ToString() + ", Путь " + path);
                            ret = null;
                            return(null);
                        }
                        state = _state.s_delimitier;
                        break;

                    default:
                        __curvalue__.Append(sym);
                        break;
                    }
                    break;

                default:
                    /*
                     * if (msreg) msreg->AddError("Ошибка формата потока. Неизвестный режим разбора.",
                     *   "Режим разбора", tohex(state),
                     *   "Путь", path);
                     */
                    ShowMessage("Ошибка формата потока. Неизвестный режим разбора. Режим разбора " + state.ToString() + ", Путь " + path);
                    ret = null;
                    return(null);
                }
            }


            if (state == _state.s_nonstring)
            {
                curvalue = __curvalue__.ToString();
                nt       = ClassificationValue(curvalue);
                if (nt == Node_Type.nd_unknown)
                {
                    /*
                     * if (msreg) msreg->AddError("Ошибка формата потока. Неизвестный тип значения.",
                     * "Значение", curvalue,
                     * "Путь", path);
                     */
                    ShowMessage("Ошибка формата потока. Неизвестный тип значения. Значение: " + curvalue + ", Путь " + path);
                }
                t.AddChild(curvalue, nt);
            }
            else
            if (state == _state.s_quote_or_endstring)
            {
                t.AddChild(__curvalue__.ToString(), Node_Type.nd_string);
            }
            else
            if (state != _state.s_delimitier)
            {
                /*
                 * if (msreg) msreg->AddError("Ошибка формата потока. Незавершенное значение",
                 *   "Режим разбора", tohex(state),
                 *   "Путь", path);
                 */
                ShowMessage("Ошибка формата потока. Незавершенное значение. Режим разбора: " + state.ToString() + ", Путь " + path);
                ret = null;
                return(null);
            }

            if (t != ret)
            {
                /*
                 * if (msreg) msreg->AddError("Ошибка формата потока. Не хватает закрывающих скобок } в конце текста разбора.",
                 *   "Путь", path);
                 */
                ShowMessage("Ошибка формата потока. Не хватает закрывающих скобок в конце текста разбора, путь " + path);
                ret = null;
                return(null);
            }

            return(ret);
        } // End parse_1Ctext
示例#6
0
        public static Tree Parse_1Cstream(Stream str, string err, string path)
        {
            StringBuilder __curvalue__ = new StringBuilder("");

            string curvalue = "";

            _state state = _state.s_value;

            int i = 0;

            Char sym = '0';

            int _sym = 0;

            Node_Type nt = Node_Type.nd_unknown;

            Tree ret = new Tree("", Node_Type.nd_list, null);

            Tree t = ret;

            //StreamReader reader = new StreamReader(str, true);
            StreamReader reader = new StreamReader(str, Encoding.ASCII, true); // т.к. файл в кодировке win1251

            for (i = 1, _sym = reader.Read(); _sym >= 0; i++, _sym = reader.Read())
            {
                sym = (Char)_sym;
                //if(i % 0x100000 == 0) if(err) err->Status(String(i/0x100000) + L" MB");
                switch (state)
                {
                case _state.s_value:
                    switch (sym)
                    {
                    case ' ':          // space
                    case '\t':
                    case '\r':
                    case '\n':
                        break;

                    case '"':
                        __curvalue__.Clear();
                        state = _state.s_string;
                        break;

                    case '{':
                        t = new Tree("", Node_Type.nd_list, t);
                        break;

                    case '}':
                        if (t.Get_First() != null)
                        {
                            t.AddChild("", Node_Type.nd_empty);
                        }
                        t = t.Get_Parent();
                        //if (t != null)
                        if (t is null)
                        {
                            // Ошибка формата потока. Лишняя закрывающая скобка }.
                            ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка }");
                            ret = null;
                            return(null);
                        }
                        state = _state.s_delimitier;
                        break;

                    case ',':
                        t.AddChild("", Node_Type.nd_empty);
                        break;

                    default:
                        __curvalue__.Clear();
                        __curvalue__.Append(sym);
                        state = _state.s_nonstring;
                        break;
                    }
                    break;

                case _state.s_delimitier:
                    switch (sym)
                    {
                    case ' ':          // space
                    case '\t':
                    case '\r':
                    case '\n':
                        break;

                    case ',':
                        state = _state.s_value;
                        break;

                    case '}':
                        t = t.Get_Parent();
                        //if (t != null)
                        if (t is null)
                        {
                            // Ошибка формата потока. Лишняя закрывающая скобка }.
                            ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка }");
                            ret = null;
                            return(null);
                        }
                        //state = _state.s_delimitier;
                        break;

                    default:
                        // Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя.
                        ShowMessage("Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя.");
                        __curvalue__.Clear();
                        __curvalue__.Append(sym);
                        ret = null;
                        return(null);
                    }
                    break;

                case _state.s_string:
                    if (sym == '"')
                    {
                        state = _state.s_quote_or_endstring;
                    }
                    else
                    {
                        __curvalue__.Append(sym);
                    }
                    break;

                case _state.s_quote_or_endstring:
                    if (sym == '"')
                    {
                        __curvalue__.Append(sym);
                        state = _state.s_string;
                    }
                    else
                    {
                        t.AddChild(__curvalue__.ToString(), Node_Type.nd_string);
                        switch (sym)
                        {
                        case ' ':
                        case '\t':
                        case '\r':
                        case '\n':
                            state = _state.s_delimitier;
                            break;

                        case ',':
                            state = _state.s_value;
                            break;

                        case '}':
                            t = t.Get_Parent();
                            //if (t != null)
                            if (t is null)
                            {
                                // Ошибка формата потока. Лишняя закрывающая скобка }.
                                ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка }.");
                                ret = null;
                                return(null);
                            }
                            state = _state.s_delimitier;
                            break;

                        default:
                            // Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя.
                            ShowMessage("Ошибка формата потока. Ошибочный символ в режиме ожидания разделителя.");
                            ret = null;
                            return(null);
                        }
                    }
                    break;

                case _state.s_nonstring:
                    switch (sym)
                    {
                    case ',':
                        curvalue = __curvalue__.ToString();
                        nt       = ClassificationValue(curvalue);
                        if (nt == Node_Type.nd_unknown)
                        {
                            // Ошибка формата потока. Неизвестный тип значения.
                            ShowMessage("Ошибка формата потока. Неизвестный тип значения.");
                        }
                        t.AddChild(curvalue, nt);
                        state = _state.s_value;
                        break;

                    case '}':
                        curvalue = __curvalue__.ToString();
                        nt       = ClassificationValue(curvalue);
                        if (nt == Node_Type.nd_unknown)
                        {
                            // Ошибка формата потока. Неизвестный тип значения.
                            ShowMessage("Ошибка формата потока. Неизвестный тип значения.");
                        }
                        t.AddChild(curvalue, nt);
                        t = t.Get_Parent();
                        //if (t != null)
                        if (t is null)
                        {
                            // Ошибка формата потока. Лишняя закрывающая скобка }.
                            ShowMessage("Ошибка формата потока. Лишняя закрывающая скобка }.");
                            ret = null;
                            return(null);
                        }
                        state = _state.s_delimitier;
                        break;

                    default:
                        __curvalue__.Append(sym);
                        break;
                    }
                    break;

                default:
                    if (1 != 1)
                    {
                        // Ошибка формата потока. Неизвестный режим разбора.
                        ShowMessage("Ошибка формата потока. Неизвестный режим разбора.");
                    }
                    ret = null;
                    return(null);
                }
            } // end of for

            if (state == _state.s_nonstring)
            {
                curvalue = __curvalue__.ToString();
                nt       = ClassificationValue(curvalue);
                if (nt == Node_Type.nd_unknown)
                {
                    // Ошибка формата потока. Неизвестный тип значения.
                    ShowMessage("Ошибка формата потока. Неизвестный тип значения.");
                }
                t.AddChild(curvalue, nt);
            }
            if (state == _state.s_quote_or_endstring)
            {
                t.AddChild(__curvalue__.ToString(), Node_Type.nd_string);
            }
            if (state != _state.s_delimitier)
            {
                ret = null;
                return(null);
            }
            if (t != ret)
            {
                // Ошибка формата потока. Не хватает закрывающих скобок } в конце текста разбора.
                ShowMessage("Ошибка формата потока. Не хватает закрывающих скобок } в конце текста разбора. ");
                ret = null;
                return(null);
            }
            return(ret);
        } // end of parce of tree
示例#7
0
 public void Set_Value(string v, Node_Type t)
 {
     Value = v;
     type  = t;
 }