예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}