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 SynPattern::LoadTxt( Dictionary &dict, lem::Iridium::Macro_Parser & txtfile, const SynPatterns &patterns, WordEntrySet &wordentry_set, const TrProcedureDeclaration &procs, TrFunctions &functions ) { lem::Iridium::BSourceState pattern_beginning = txtfile.tellp(); id_src = dict.GetDebugSymbols().RegisterLocation( txtfile, txtfile.tellp() ); if( dict.GetDebugLevel_ir()>=3 ) { dict.GetIO().mecho().printf( "pattern " ); } // ќпционально могут быть заданы целевой ¤зык и опции. while( !txtfile.eof() ) { if( txtfile.probe( B_OFIGPAREN ) ) break; if( txtfile.probe( 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(); } } else if( txtfile.probe( L"incomplete" ) ) { incomplete=true; } else { lem::Iridium::BethToken tname = txtfile.read(); name = tname.string(); if( dict.GetDebugLevel_ir()>=3 ) { dict.GetIO().mecho().printf( "%vfE%us%vn ", name.c_str() ); } if( !patterns.IsPatternName(name) ) { dict.GetIO().merr().printf( "Patterns group [%us] is not declared\n", name.c_str() ); lem::Iridium::Print_Error(tname,txtfile); throw lem::E_BaseException(); } const SynPatternOptions & group_options = patterns.GetOptions(name); id_language = group_options.GetLanguageId(); // —екци¤ export { ... } содержит объ¤влени¤ координат, которые паттерн выдает наружу // —начала попробуем вз¤ть содержимое экспорта по умолчанию, зарегистрированное в объ¤влении // группы паттернов. if( txtfile.probe(L"export") ) { export_info.LoadTxt( dict, txtfile ); } else { const SynPatternOptions & p_options = patterns.GetOptions(name); export_info = p_options.GetExport(); } export_info.RegisterExport( *compilation_context ); if( txtfile.probe( 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 ); break; } } // —писок опорных точек в фигурных скобочках lem::Iridium::BSourceState beg = txtfile.tellp(); compilation_context->SetName( name ); compilation_context->Set(&wordentry_set); while( !txtfile.eof() ) { if( txtfile.pick().GetToken()==B_CFIGPAREN ) { txtfile.read(); break; } SlotProperties slot; slot.LoadTxt( dict, txtfile ); SynPatternPoint *p = new SynPatternPoint; p->LoadTxt( dict, txtfile, patterns, *compilation_context, procs, functions ); points.push_back(p); slots.push_back(slot); compilation_context->BeforeNextPointCompilation(); } if( points.empty() ) { lem::Iridium::Print_Error(beg,txtfile); dict.GetIO().merr().printf("Pattern must not be empty\n" ); throw E_Solarix(); } if( !compilation_context->PatternHasBeenCompiled(dict.GetSynGram()) ) { lem::Iridium::Print_Error(pattern_beginning,txtfile); dict.GetIO().merr().printf("Some export items are not actually exported\n" ); throw E_Solarix(); } points.back()->Terminator(); bool links_loaded=false, ngrams_loaded=false, predicates_loaded=false, constraints_loaded=false; while( !txtfile.eof() ) if( txtfile.probe(B_COLON) ) { lem::Iridium::BSourceState section_beg = txtfile.tellp(); if( txtfile.probe( L"links" ) ) { if( links_loaded ) { lem::Iridium::Print_Error(section_beg,txtfile); dict.GetIO().merr().printf("Redefinition of 'links'\n" ); throw E_Solarix(); } LoadLinks( dict, txtfile, *compilation_context ); links_loaded=true; } else if( txtfile.probe( L"ngrams" ) ) { if( ngrams_loaded ) { lem::Iridium::Print_Error(section_beg,txtfile); dict.GetIO().merr().printf("Redefinition of 'ngrams'\n" ); throw E_Solarix(); } LoadNGrams( dict, txtfile, *compilation_context ); ngrams_loaded=true; } else if( txtfile.probe( L"predicates" ) ) { if( predicates_loaded ) { lem::Iridium::Print_Error(section_beg,txtfile); dict.GetIO().merr().printf("Redefinition of 'predicates'\n" ); throw E_Solarix(); } LoadPredicates( dict, txtfile, *compilation_context ); predicates_loaded=true; } /* else if( sparse && txtfile.probe( L"constraints" ) ) { if( constraints_loaded ) { lem::Iridium::Print_Error(section_beg,txtfile); dict.GetIO().merr().printf("Redefinition of 'constraints'\n" ); throw E_Solarix(); } LoadConstraints( dict, txtfile, *compilation_context ); constraints_loaded=true; }*/ else { lem::Iridium::Print_Error(txtfile); dict.GetIO().merr().printf("Unexpected token\n" ); throw E_Solarix(); } } else { break; } // ќпорные точки могут теперь выполнить внутренние оптимизации, в частности - учесть использование // маркировок и улучшить эффективность директивы @mark() for( lem::Container::size_type i=0; i<points.size(); ++i ) points[i]->OptimizeAfterCompilation( *compilation_context ); // Ѕезым¤нные паттерны, то есть правила самого верхнего уровн¤, должны быть прив¤заны к ¤зыку с помощью директивы { language=XXX } if( id_language==UNKNOWN && name.empty() ) { lem::Iridium::Print_Error(pattern_beginning,txtfile); dict.GetIO().merr().printf("Pattern must be bound to a language\n" ); throw E_Solarix(); } if( dict.GetDebugLevel_ir()>=3 ) { dict.GetIO().mecho().printf( "%vfAOK%vn\n" ); } return; }