示例#1
0
        /// <summary>
        /// Реализует выполнение описанных пользователем функций
        /// </summary>
        /// <param name="func_name"></param>
        public void run_func(string func_name)
        {
            int                old_curFunc = tableId.get_curFunc();
            int                num_of_func = tableId.getNumOfFunc(func_name);
            int                num_params  = tableId.get_num_of_param(func_name);
            int                old_csp     = cur_step_poliz;
            HtmlElement        helem;
            List <HtmlElement> helemCollect, collect_to_run_func;

            Lexem[] lex_arr = new Lexem[num_params];
            //в массиве лежат либо константы, либо переменные

            //создать новый экземпляр класса executer и вызвать из него выполнение проги
            setCurFunc(num_of_func);
            //Да, ничего не скопирует, но рекурсия станет возможной
            Executer func_exec = new Executer(tableId, in_stream, out_stream, wb);

            //передача параметров в вызываемую функцию
            for (int i = num_params - 1; i >= 0; i--)
            {
                lex_arr[i] = args.Pop();
            }
            //обнуление всех переменных внутри функции
            //func_exec.tableId.initialize_all_vars();
            for (int i = 0; i < num_params; i++)
            {
                if (lex_arr[i].get_type() == Type_of_lex._htmlelement || lex_arr[i].get_type() == Type_of_lex._htmlelementcollect)
                {
                    //func_exec.tableId.putValueOfLex(i, lex_arr[i].getName(), true);
                    setCurFunc(old_curFunc);
                    if (lex_arr[i].get_type() == Type_of_lex._htmlelement)
                    {
                        helem = func_exec.tableId.get_htmlElem_of_lex(lex_arr[i].getName());
                        setCurFunc(num_of_func);
                        func_exec.tableId.putHtmlElemValueOfLex(i, helem);
                    }
                    else
                    {
                        helemCollect = tableId.get_htmlElemCollect_of_lex(lex_arr[i].getName());
                        setCurFunc(num_of_func);

                        collect_to_run_func = new List <HtmlElement>(helemCollect.Count);
                        for (int j = 0; j < helemCollect.Count; j++)
                        {
                            collect_to_run_func.Add(helemCollect[j]);
                        }
                        //тут нужно передать не ссылку, а новый список
                        func_exec.tableId.putHtmlElemCollectValueOfLex(i, collect_to_run_func);
                    }
                }
                else
                {
                    func_exec.tableId.putValueOfLex(i, lex_arr[i].getName());
                }
                if (lex_arr[i].get_type() != Type_of_lex._undefined)
                {
                    func_exec.putTypeofLex(i, lex_arr[i].get_type());
                }
            }
            func_exec.execute();
            Lexem lex = null;

            if (func_exec.args.Count > 0)
            {
                lex = func_exec.args_pop();
            }

            //для добавления вспомогательной переменной
            if (lex != null)
            {
                Type_of_lex type = tableId.getTypeOfFunc(func_name);
                if (type == Type_of_lex._htmlelement || type == Type_of_lex._htmlelementcollect)
                {
                    string             res_name        = "";
                    HtmlElement        htmlElem        = null;
                    List <HtmlElement> htmlElemCollect = null;
                    if (type == Type_of_lex._htmlelement)
                    {
                        htmlElem        = tableId.get_htmlElem_of_lex(lex.getName());
                        htmlElemCollect = null;
                    }
                    else
                    {
                        htmlElemCollect = tableId.get_htmlElemCollect_of_lex(lex.getName());
                        htmlElem        = null;
                    }
                    setCurFunc(old_curFunc);
                    res_name = add_new_uniq_lexId(type, htmlElem, htmlElemCollect);
                    lex.putName(res_name);
                }
                args.Push(lex);
            }
            setCurFunc(old_curFunc);
            cur_step_poliz = old_csp;
        }
 /// <summary>
 /// Осуществлет интерпретацию программы
 /// </summary>
 /// <param name="web">Браузер</param>
 /// <param name="input">Окно ввода</param>
 /// <param name="output">Окно вывода</param>
 /// init run
 public void interpretation(System.Windows.Forms.TextBox input, System.Windows.Forms.RichTextBox output)
 {
     pars.analyze();
     exec = new Executer(pars.getTableId(), input, output, wb);
     exec.execute();
 }