public void _const() { switch (curLex.get_type()) { case Type_of_lex.LEX_string: curLex.put_type(Type_of_lex._string); push(curLex); tableId.poliz_put_lex(curLex); getLex(); break; case Type_of_lex.LEX_num: curLex.put_type(Type_of_lex._int); //push(curLex); Lexem hlp = curLex; getLex(); if (curLex.get_type() == Type_of_lex.LEX_dot) //float { getLex(); if (curLex.get_type() != Type_of_lex.LEX_num) { throw new SystemException(curLex.ToString()); } else { //сделать лексему типа double string value = hlp.getName() + "." + curLex.getName(); hlp.put_type(Type_of_lex._double); hlp.putName(value); getLex(); } } push(hlp); tableId.poliz_put_lex(hlp); break; case Type_of_lex.LEX_FALSE: curLex.put_type(Type_of_lex._bool); curLex.putName("false"); push(curLex); tableId.poliz_put_lex(curLex); getLex(); break; case Type_of_lex.LEX_TRUE: curLex.put_type(Type_of_lex._bool); curLex.putName("true"); push(curLex); tableId.poliz_put_lex(curLex); getLex(); break; default: throw new SystemException(curLex.ToString()); } }
/// <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; }