本文整理汇总了C++中Grammar::FindCoord方法的典型用法代码示例。如果您正苦于以下问题:C++ Grammar::FindCoord方法的具体用法?C++ Grammar::FindCoord怎么用?C++ Grammar::FindCoord使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Grammar
的用法示例。
在下文中一共展示了Grammar::FindCoord方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: LoadAttribute
/**************************************************************************
ЗАГРУЗКА ОДНОЙ АТРИБУТНОЙ КООРДИНАТНОЙ ПАРЫ
из текстового файла
Общий формат:
коорд_имя : состояние
Особое внимание следует уделять автоматическому созданию AND-атрибутов
для многоохватных состояний. Если такое создание нежелательно, то
следует заключить имя состояния, входящего в группу многоохватных, в
круглые скобочки:
коор_имя : ( состояние )
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ:
true - действительно, загружен атрибут или тэг.
false - это не определение состояния атрибута или тэга.
****************************************************************************/
bool Form_Table::LoadAttribute(
Macro_Parser &txtfile,
Grammar& gram
)
{
const BSourceState back = txtfile.tellp();
bool negative_state = txtfile.probe(B_NEGATIVE); // считываем префикс в ~ПРИЧАСТИЕ
BethToken coord_name = txtfile.read();
// Индекс координаты в списке грамматики.
const GramCoordAdr iglob = gram.FindCoord(coord_name.string());
// Найдем атрибут в списке грамматического класса.
const int iattr = gram.classes()[iclass].attrs().FindTwice(iglob);
if (iattr == UNKNOWN)
{
const int itag = gram.classes()[iclass].tags().FindTwice(iglob);
if (itag == UNKNOWN)
{
txtfile.seekp(back);
return false;
}
}
// Если координата имеет два неявно объявленных состояния
// TRUE/FALSE, то состояние явно в данной секции не должно быть
// указано.
if (!gram.coords()[iglob.GetIndex()].IsBistable())
{
// Несколько состояний у координаты.
if (negative_state)
{
Print_Error(back, txtfile);
gram.GetIO().merr().printf("~ is appliable to bistable coordinates only, whereas [%us] is not bistable\n", coord_name.c_str());
throw E_ParserError();
}
txtfile.read_it(B_COLON);
// Учтем, что может встретиться AND-атрибут. Такая координата
// одновременно может иметь несколько состояний.
IntCollect statei;
IntCollect doload;
FOREVER
{
if (txtfile.eof())
{
Print_Error(txtfile);
gram.GetIO().merr().printf("End of file has been reached before list of attribute states in entry completely loaded\n");
throw E_ParserError();
}
// Теперь считаем состояние(-я) для заявленного атрибута.
const BSourceState back = txtfile.tellp();
BethToken state_name = txtfile.read();
bool letautoload = true;
if (state_name.GetToken() == B_ANY)
{
if (StoreQuantors())
{
attr.push_back(GramCoordPair(iglob,ANY_STATE));
break;
}
else if (statei.empty())
{
// Вместо имен состояний для AND-координаты указан квантор *.
// Инициализируем координату ВСЕМИ состояниями, заявленными
// для координаты.
const int ns = gram.coords()[iglob.GetIndex()].GetTotalStates();
//.........这里部分代码省略.........
示例2: LoadTxt
/*************************************************************************
ЗАГРУЗКА ОПИСАНИЯ ИЗ ТЕКСТОВОГО ФАЙЛА
1. Общий формат:
1.1 Заголовок
enum имя, синоним1, синоним2, ...
Кроме основного имени можно устанавливать альтернативные имена
координаты (синонимы). Это необходимо для работы с некоторыми
просторечными конструкциями (типа слова 'ЕГОННЫЙ'). Имя координаты
должно начинаться с буквы или символа '_'.
1.2 Список состояний (два взаимоисключающих случая):
... = имя_источника
- таким способом координата [имя] получает тот же список состояний,
что и заявленые для [имя_источник].
... { сост1 сост2 ... состN }
- в фигурных скобочках перечисляются имена состояний.
2. Один из особых случаев - координаты с двумя состояниями,
представимыми по смыслу как TRUE и FALSE. Формат описани
их несколько иной. Объявление имеет такой формат:
:
enum имя_координаты
:
То есть имена состояний явно не объявляются. Внутреннее описание
также не загружается подставными именами состояний, но при операциях
с координатами появление координаты с нулевым количеством состояний
отлавливается и особо учитывается.
**************************************************************************/
void GramCoord::LoadTxt(
Macro_Parser &txtfile,
const Grammar& gram,
bool IsRealized
)
{
is_realized = IsRealized;
BethToken coord_name = txtfile.read();
sol_check_coord_name(gram.GetDict(), txtfile, coord_name);
name.push_back(coord_name.c_str());
const bool Me = gram.GetDict().GetDebugLevel_ir() >= 3;
if (Me)
{
// Эхо-сообщение: начали трансляцию координаты.
gram.GetIO().mecho().printf(
"%us [%vfE%us%vn]->",
sol_get_token(B_COORDINATE).c_str(),
name.get(0).c_str()
);
}
BSourceState back = txtfile.tellp();
bool cname_loaded = false;
if (txtfile.read().GetToken() == B_AS)
{
c_name = txtfile.read();
back = txtfile.tellp();
cname_loaded = true;
}
else
txtfile.seekp(back);
// Цикл загрузки компонентов описания координаты.
bool loading = true;
while (loading)
{
const BethToken t1 = txtfile.read();
switch (t1.GetToken())
{
case B_EQUAL:
{
// Встретили спецификацию '='. Так что пересылаем себе состояния
// другой координаты, имя которой идёт следом.
const BethToken another = txtfile.read();
const GramCoordAdr ianother = gram.FindCoord(another.string());
if (ianother.GetIndex() == UNKNOWN)
{
Print_Error(another, txtfile);
MemFormatter f;
f.printf(
"The coordinate [%us] is not previously "
//.........这里部分代码省略.........