本文整理汇总了C++中SynGram::classes方法的典型用法代码示例。如果您正苦于以下问题:C++ SynGram::classes方法的具体用法?C++ SynGram::classes怎么用?C++ SynGram::classes使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SynGram
的用法示例。
在下文中一共展示了SynGram::classes方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SaveTxt
void SG_CoordContext::SaveTxt( OFormatter &txt, SynGram &sg ) const
{
const UCString &class_name = sg.classes()[iclass].GetName();
txt.printf(
" %us:\"???\" { "
, class_name.c_str()
);
for( Container::size_type k=0; k<coords.size(); k++ )
{
const int icoord = coords[k].GetCoord().GetIndex();
const int istate = coords[k].GetState();
const UCString &coord_name = sg.coords()[ icoord ].GetName().front();
if( !sg.coords()[icoord].states().size() )
{
if( istate!=0 )
txt.printf( " %us", coord_name.c_str() );
else
txt.printf( " ~%us", coord_name.c_str() );
}
else
{
const UCString &state_name = sg.coords()[ icoord ].GetStateName( istate );
txt.printf( " %us:%us", coord_name.c_str(), state_name.c_str() );
}
}
txt.printf( " }" );
return;
}
示例2: LoadPreciser
void Word_Form::LoadPreciser(
CompilationContext &context,
Macro_Parser& txtfile,
SynGram& gram,
int iclass
)
{
// Тапереча в {} могет быть идти список уточняющих координат.
//
// Каждая уточняющая координата должна следовать такому формату:
//
// [~]имя_координаты:имя_состояния
//
// Причем, только если вместо имени статьи указан квантор всеобщности,
// то разрешается задавать АТРИБУТЫ как координаты.
//
// Особо обрабатываются координаты с неявно объявленными состояниями
// TRUE/FALSE. Следует учесть, что само упоминание имени такой координаты
// равносильно упоминанию также и имени состояния TRUE, а для объявлени
// состояния FALSE необходимо использовать конструкцию с оператором
// отрицания НЕ.
while(!txtfile.eof())
{
// Считываем имя координаты.
BethToken coord_name = txtfile.read();
// Может, список закончился, то есть встретилась '{' ?
if( coord_name.GetToken()==B_CFIGPAREN )
break;
// В двойных апострофах может идти имя формы, которую надо использовать вместо
// имени словарной статьи.
if( lem::in_quotes(coord_name.string()) )
{
Lexem *mname = new Lexem( strip_quotes(coord_name) );
gram.GetDict().GetLexAuto().TranslateLexem(*mname,false);
mname->Translate( gram.GetDict().GetGraphGram(), 2 );
name = RC_Lexem( mname );
}
else
{
bool AFFIRM=true;
if( coord_name.GetToken()==B_NEGATIVE )
{
// Оператор отрицания перед определением координаты!
AFFIRM=false;
coord_name = txtfile.read();
}
const GramCoordAdr iglob_coord = gram.FindCoord(coord_name.string());
// Попытаемся найти координату среди списка атрибутов и тэгов.
int iloc_coord = gram.classes()[iclass].attrs().find(iglob_coord);
// Нашли?
if( iloc_coord!=UNKNOWN )
{
// Да! Примем к сведению, что если для опорной точки задано
// имя словарной статьи, то мы не имеем право по логике вещей
// определять также и атрибуты, так как само определение словарной
// статьи определяет необходимые атрибуты.
if( entry_key!=ANY_STATE )
{
lem::Iridium::Print_Error(coord_name,txtfile);
gram.GetIO().merr().printf(
"The attribute can not be declared here, because entry is already declared\n"
);
throw E_ParserError();
}
}
else
{
// Попробуем найти координату среди списка измерений.
iloc_coord = gram.classes()[iclass].dims().find(iglob_coord);
if( iloc_coord==UNKNOWN )
iloc_coord = gram.classes()[iclass].tags().find(iglob_coord);
// Нашли?
if( iloc_coord==UNKNOWN && iclass!=SOL_EQUIL_INDEX )
{
// Нет. Таким образом, имя координаты не определяет
// ни тэг, ни измерение. Генерируем сообщение
// об ошибке.
lem::Iridium::Print_Error(coord_name,txtfile);
gram.GetIO().merr()
.printf(
"Coordinate [%us] is neither tag"
" nor dimention for the class [%us]\n"
, coord_name.string().c_str()
, gram.classes()[ iclass ].GetName().c_str()
);
throw E_ParserError();
}
//.........这里部分代码省略.........
示例3: LoadTxt
//.........这里部分代码省略.........
// Вероятно, следует также переслать координатные пары.
const SG_EntryForm& eef = ef.forms()[ ie.GetForm() ];
const CP_Array& dims = eef.coords();
for( Container::size_type ii=0; ii<dims.size(); ii++ )
{
// Здесь немного наворочено - прямо использовать конструктор без
// копирования в промежуточные поля нельзя из-за ошибки в
// кодогенераторе Symantec C++ (появляется General Protection Fault).
const GramCoordAdr ca = dims[ii].GetCoord();
const int cs = dims[ii].GetState();
pair.push_back( GramCoordEx( ca, cs, true ) );
}
// И наконец, пересылаем полное имя (лексическое содержимое) статьи.
// icenter=0;
// e_list.push_back( entry_key );
name = RC_Lexem( const_cast<Lexem*>(&ef.GetName()), null_deleter() );
}
return;
}
const BSourceState back=txtfile.tellp();
const BethToken t = txtfile.read();
bool read_ofigparen=true;
if( t.GetToken()==B_COLON )
{
// Считываем имя статьи, которое может в общем случае состоять
// из нескольких лексем. Признаком окончания имени служит
// открывающая фигурная скобка '{'.
Lexem *mname = new Lexem( sol_read_multyname( gram.GetIO(), txtfile,B_OFIGPAREN) );
// Преобразуем в мультилексему так, чтобы правильно распознавались
// объявления имен типа "ЕЩ^Ё".
gram.GetDict().GetLexAuto().TranslateLexem(*mname,false);
mname->Translate( gram.GetDict().GetGraphGram(), 2 );
//(*name) = mname;
name = RC_Lexem( mname );
// lexem_owner.resize(1);
// lexem_owner.Nullify();
read_ofigparen=false;
// Пытаемся найти статью.
if( *mname != sol_get_token(B_ANY) )
{
// Считан НЕ квантор всеобщности, так что это должно быть имя статьи.
// Попытаемся найти статью среди уже загруженных, причем ищем с
// критерием принадлежности определенному синтаксическому классу.
const int ientry=gram.FindEntry2(*mname,iclass);
// Нашли ?
if( ientry==UNKNOWN )
{
// Нет! Выводим сообщение об неверном имени словарной статьи.
lem::Iridium::Print_Error(txtfile);
gram.GetIO().merr().printf(
"The entry [%us:%us] is not previously declared in grammar\n"
, gram.classes()[iclass].GetName().c_str()
, mname->ToString().c_str()
);
throw E_ParserError();
}
// Запомним КЛЮЧ словарной статьи.
entry_key=gram.GetEntry(ientry).GetKey();
}
else
entry_key=ANY_STATE;
}
else
{
txtfile.seekp(back);
entry_key=ANY_STATE;
}
bool load_precise=true;
if( read_ofigparen )
{
const BSourceState back = txtfile.tellp();
if( txtfile.read().GetToken()!=B_OFIGPAREN )
{
// Секции уточнения координат нет.
txtfile.seekp(back);
load_precise = false;
}
}
if(load_precise)
LoadPreciser(context,txtfile,gram,iclass);
return;
}
示例4: Rename_By_States
// ***************************************************************
// Лексическое содержимое словоформы приводим в соответствие с
// координатами.
// ***************************************************************
void Word_Form::Rename_By_States( SynGram &sg, bool apply_versions )
{
iversion = seq_iversion++;
if( entry_key!=UNKNOWN )
{
try
{
const SG_Entry &E = sg.GetEntry(entry_key);
const int iclass = E.GetClass();
const GramClass &C = sg.classes()[ iclass ];
// Имеем список всех координатных пар. Из него надо выделить только
// измерения.
CP_Array dims;
dims.reserve(16);
for( Container::size_type ic=0; ic<pair.size(); ic++ )
{
if( C.dims().find( pair[ic].GetCoord() ) != UNKNOWN )
dims.push_back( pair[ic] );
}
// Собрали в список dims только измерения.
// Ищем подходящую по координатам форму.
const SG_EntryForm &F = E.FindFormAny(dims);
// Перекачаем ее координаты себе.
const CP_Array& c = F.coords();
for( Container::size_type i2=0; i2<c.size(); i2++ )
SetState( c[i2], false, false );
#if LEM_DEBUGGING==1
const int npairs2 = CastSizeToInt(pair.size());
#endif
// Нашли наиболее подходящую форму - берем ее лексическое содержание.
const Lexem &new_name = F.name();
name = RC_Lexem( new Lexem(new_name) );
/*
// Просто поменять имя словоформы нельзя, так как мы можем быть результатом
// свертки. Надо вычленить из списка name те лексемы, которые относятся к
// обновленной форме (грамматическому центру), и заменить их на новое
// значение.
// Начальная позиция в цепочке лексем
int i_from = lem::find( lexem_owner, icenter );
int n = std::count( lexem_owner.begin(), lexem_owner.end(), icenter );
UCStringSet parts;
new_name.Split(parts);
if( n == parts.size() )
{
// Число лексем в имени не поменялось
UCStringSet old_parts;
name->Split( old_parts );
for( int i=0; i<n; i++ )
old_parts[i_from+i] = parts[i];
name = RC_Lexem( new Lexem(old_parts) );
}
else
{
// Вряд ли возможная ситуация: у найденной формы имя имеет иное
// число лексем, чем у прежней формы.
//LEM_STOPIT;
// throw E_BaseException( L"Internal syntax engine error" );
}
*/
}
catch( const E_SG_NoForm& )
{
}
}
if( apply_versions )
for( lem::Container::size_type i=0; i<alt.size(); ++i )
alt[i]->Rename_By_States( sg, true );
return;
}