void SyllabRule::LoadTxt(lem::Iridium::Macro_Parser &txtfile, Dictionary &dict) { lem::Iridium::BSourceState point_begin = txtfile.tellp(); id_src = dict.GetDebugSymbols().RegisterLocation(txtfile, point_begin); // шапка: syllab_rule XXXX language=YYY name = txtfile.read().string(); txtfile.read_it(B_LANGUAGE); txtfile.read_it(B_EQUAL); lem::Iridium::BethToken lang = txtfile.read(); id_language = dict.GetSynGram().Find_Language(lang.string()); if (id_language == UNKNOWN) { lem::Iridium::Print_Error(lang, txtfile); dict.GetIO().merr().printf("Unknown language name %us\n", lang.c_str()); throw lem::E_BaseException(); } txtfile.read_it(B_OFIGPAREN); txtfile.read_it(B_IF); txtfile.read_it(B_CONTEXT); condition.LoadTxt(txtfile, dict); txtfile.read_it(B_THEN); txtfile.read_it(B_OFIGPAREN); txtfile.read_it(B_CONTEXT); result.LoadTxt(txtfile, dict, condition); txtfile.read_it(B_CFIGPAREN); // закрываем блок then { ... } txtfile.read_it(B_CFIGPAREN); // закрываем тело правила return; }
void KB_Facts::LoadTxt(Solarix::Dictionary &dict, lem::Iridium::Macro_Parser &txtfile) { name = txtfile.read().string(); txtfile.read_it(B_LANGUAGE); txtfile.read_it(B_EQUAL); lem::Iridium::BethToken lang = txtfile.read(); id_language = dict.GetSynGram().Find_Language(lang.string()); if (id_language == UNKNOWN) { lem::Iridium::Print_Error(lang, txtfile); dict.GetIO().merr().printf("Unknown language name %us\n", lang.c_str()); throw lem::E_BaseException(); } txtfile.read_it(B_OFIGPAREN); n_ret = 0; while (!txtfile.eof()) { if (txtfile.probe(B_CFIGPAREN)) break; lem::Iridium::BethToken t = txtfile.read(); if (t.string().eqi(L"arity")) { txtfile.read_it(B_EQUAL); n_arg = txtfile.read_int(); } else if (t.string().eqi(L"return")) { txtfile.read_it(B_EQUAL); lem::Iridium::BethToken t_ret = txtfile.read(); if (t_ret.eqi(L"boolean")) { n_ret = 1; ret_type = 0; } else if (t_ret.eqi(L"integer")) { n_ret = 1; ret_type = 1; } else { lem::Iridium::Print_Error(t_ret, txtfile); dict.GetIO().merr().printf("Unknown return type %us\n", t_ret.c_str()); throw lem::E_BaseException(); } } else if (t.string().eqi(L"violation_score")) { txtfile.read_it(B_EQUAL); if (txtfile.probe(B_SUB)) violation_score = -txtfile.read_int(); else violation_score = txtfile.read_int(); } else if (t.string().eqi(L"violation_handler")) { txtfile.read_it(B_EQUAL); violation_handler = new PredicateTemplate(); PredicateTemplateParams_KB params(n_arg); violation_handler->LoadTxt(dict, txtfile, params); } else if (t.string().eqi(L"generic")) { allow_generic = true; } else { lem::Iridium::Print_Error(t, txtfile); dict.GetIO().merr().printf("Unknown property %us\n", t.c_str()); throw lem::E_BaseException(); } } return; }
void TrFun_CreateWordform::CompileDeclaration( PM_Automat &pm, lem::Iridium::Macro_Parser &txtfile, TrFunctions &functions, TrKnownVars &known_vars, const TrBuiltInFunSignature *signature ) { lem::Iridium::BSourceState ebeg = txtfile.tellp(); SynGram &sg = pm.GetDict().GetSynGram(); const lem::Iridium::BethToken &class_name = txtfile.read(); const int iclass = sg.FindClass(class_name); txtfile.read_it( B_COLON ); lem::Iridium::BSourceState ename = txtfile.tellp(); UCString entry_name = sol_read_multyname( pm.GetIO(), txtfile, B_OFIGPAREN ); const int v_ientry = sg.FindEntry( entry_name, iclass, false ); if( v_ientry==UNKNOWN ) { lem::Iridium::Print_Error( ename, txtfile ); pm.GetIO().merr().printf( "Unknown entry [%vfE%us:%us%vn]\n", class_name.c_str(), entry_name.c_str() ); throw E_ParserError(); } ientry = new TrFun_Constant( TrIntValue(sg.GetEntry(v_ientry).GetKey()) ); while( !txtfile.eof() ) { if( txtfile.pick().GetToken()==B_CFIGPAREN ) { break; } // Координатная пара или имя формы слова в апострофах lem::Iridium::BethToken cn = txtfile.read(); if( lem::in_quotes(cn.string()) ) { form_name = strip_quotes(cn.string()); } else { bool AFFIRM=true; if( cn.GetToken()==B_NEGATIVE ) { // Оператор отрицания перед определением координаты! AFFIRM=false; cn = txtfile.read(); } // Для бистабильных - просто имя координаты. int icoord=UNKNOWN, istate=UNKNOWN; icoord = sg.FindCoord(cn).GetIndex(); if( icoord==UNKNOWN ) { lem::Iridium::Print_Error( cn, txtfile ); pm.GetIO().merr().printf( "Unknown coordinate [%vfE%us%vn]\n", cn.c_str() ); throw E_ParserError(); } if( sg.coords()[icoord].IsBistable() ) { istate=AFFIRM ? 1 : 0; } else { txtfile.read_it( B_COLON ); const lem::Iridium::BethToken & sn = txtfile.read(); istate = sg.coords()[icoord].FindState(sn); if( istate==UNKNOWN ) { // Нет такого состояния для этого измерения. lem::Iridium::Print_Error(sn,txtfile); sg.GetIO().merr().printf( "State [%vfE%us%vn] is not declared for coordinate [%vfE%us%vn]\n" , sn.c_str(), cn.c_str() ); throw E_ParserError(); } } TrIntValue v2( icoord ); coords.push_back( new TrFun_Constant(v2) ); TrIntValue v3( istate ); states.push_back( new TrFun_Constant(v3) ); } } txtfile.read_it( B_CFIGPAREN ); return; }