/// <summary> /// Продожает выполнение программы /// </summary> public void continue_execute() { if (exec != null) { exec.execute(); } }
/// <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(); }