void LoadLanguage(XmlElement langElem) { string id = langElem.GetAttribute("id"); m_curMorpher = new Morpher(id, langElem.SelectSingleNode("Name").InnerText); m_morphers.Add(m_curMorpher); XmlNodeList posList = langElem.SelectNodes("PartsOfSpeech/PartOfSpeech"); foreach (XmlNode posNode in posList) { XmlElement posElem = posNode as XmlElement; string posId = posElem.GetAttribute("id"); m_curMorpher.AddPOS(new PartOfSpeech(posId, posElem.InnerText, m_curMorpher)); } XmlNodeList mprFeatList = langElem.SelectNodes("MorphologicalPhonologicalRuleFeatures/MorphologicalPhonologicalRuleFeature[@isActive='yes']"); foreach (XmlNode mprFeatNode in mprFeatList) { XmlElement mprFeatElem = mprFeatNode as XmlElement; string mprFeatId = mprFeatElem.GetAttribute("id"); m_curMorpher.AddMPRFeature(new MPRFeature(mprFeatId, mprFeatElem.InnerText, m_curMorpher)); } XmlNodeList mprFeatGroupList = langElem.SelectNodes("MorphologicalPhonologicalRuleFeatures/MorphologicalPhonologicalRuleFeatureGroup[@isActive='yes']"); foreach (XmlNode mprFeatGroupNode in mprFeatGroupList) LoadMPRFeatGroup(mprFeatGroupNode as XmlElement); XmlNode phonFeatSysNode = langElem.SelectSingleNode("PhonologicalFeatureSystem[@isActive='yes']"); if (phonFeatSysNode != null) LoadFeatureSystem(phonFeatSysNode as XmlElement, m_curMorpher.PhoneticFeatureSystem); XmlNode headFeatsNode = langElem.SelectSingleNode("HeadFeatures"); if (headFeatsNode != null) LoadFeatureSystem(headFeatsNode as XmlElement, m_curMorpher.HeadFeatureSystem); XmlNode footFeatsNode = langElem.SelectSingleNode("FootFeatures"); if (footFeatsNode != null) LoadFeatureSystem(footFeatsNode as XmlElement, m_curMorpher.FootFeatureSystem); XmlNodeList charDefTableList = langElem.SelectNodes("CharacterDefinitionTable[@isActive='yes']"); foreach (XmlNode charDefTableNode in charDefTableList) LoadCharDefTable(charDefTableNode as XmlElement); XmlNodeList featNatClassList = langElem.SelectNodes("NaturalClasses/FeatureNaturalClass[@isActive='yes']"); foreach (XmlNode natClassNode in featNatClassList) LoadFeatNatClass(natClassNode as XmlElement); XmlNodeList segNatClassList = langElem.SelectNodes("NaturalClasses/SegmentNaturalClass[@isActive='yes']"); foreach (XmlNode natClassNode in segNatClassList) LoadSegNatClass(natClassNode as XmlElement); XmlNodeList mrulesNodeList = langElem.SelectNodes("MorphologicalRules/*[@isActive='yes']"); if (mrulesNodeList != null) { foreach (XmlNode mruleNode in mrulesNodeList) { XmlElement mruleElem = mruleNode as XmlElement; try { switch (mruleElem.Name) { case "MorphologicalRule": LoadMRule(mruleNode as XmlElement); break; case "RealizationalRule": LoadRealRule(mruleNode as XmlElement); break; case "CompoundingRule": LoadCompoundRule(mruleNode as XmlElement); break; } } catch (LoadException le) { if (m_quitOnError) throw le; } } } HCObjectSet<MorphologicalRule> templateRules = new HCObjectSet<MorphologicalRule>(); XmlNodeList tempList = langElem.SelectNodes("Strata/AffixTemplate[@isActive='yes']"); foreach (XmlNode tempNode in tempList) LoadAffixTemplate(tempNode as XmlElement, templateRules); XmlNodeList stratumList = langElem.SelectNodes("Strata/Stratum[@isActive='yes']"); XmlElement surfaceElem = null; foreach (XmlNode stratumNode in stratumList) { XmlElement stratumElem = stratumNode as XmlElement; if (stratumElem.GetAttribute("id") == Stratum.SURFACE_STRATUM_ID) surfaceElem = stratumElem; else LoadStratum(stratumElem); } if (surfaceElem == null) throw CreateUndefinedObjectException(HCStrings.kstidNoSurfaceStratum, Stratum.SURFACE_STRATUM_ID); LoadStratum(surfaceElem); if (mrulesNodeList != null) { foreach (XmlNode mruleNode in mrulesNodeList) { XmlElement mruleElem = mruleNode as XmlElement; string ruleId = mruleElem.GetAttribute("id"); if (!templateRules.Contains(ruleId)) { MorphologicalRule mrule = m_curMorpher.GetMorphologicalRule(ruleId); if (mrule != null) { Stratum stratum = m_curMorpher.GetStratum(mruleElem.GetAttribute("stratum")); stratum.AddMorphologicalRule(mrule); } } } } XmlNodeList familyList = langElem.SelectNodes("Lexicon/Families/Family[@isActive='yes']"); foreach (XmlNode familyNode in familyList) { XmlElement familyElem = familyNode as XmlElement; LexFamily family = new LexFamily(familyElem.GetAttribute("id"), familyElem.InnerText, m_curMorpher); m_curMorpher.Lexicon.AddFamily(family); } XmlNodeList entryList = langElem.SelectNodes("Lexicon/LexicalEntry[@isActive='yes']"); foreach (XmlNode entryNode in entryList) { try { LoadLexEntry(entryNode as XmlElement); } catch (LoadException le) { if (m_quitOnError) throw le; } } // co-occurrence rules cannot be loaded until all of the morphemes and their allomorphs have been loaded XmlNodeList morphemeList = langElem.SelectNodes("Lexicon/LexicalEntry[@isActive='yes'] | MorphologicalRules/*[@isActive='yes']"); foreach (XmlNode morphemeNode in morphemeList) { XmlElement morphemeElem = morphemeNode as XmlElement; string morphemeId = morphemeElem.GetAttribute("id"); Morpheme morpheme = m_curMorpher.GetMorpheme(morphemeId); if (morpheme != null) { try { morpheme.RequiredMorphemeCoOccurrences = LoadMorphCoOccurs(morphemeElem.SelectSingleNode("RequiredMorphemeCoOccurrences")); } catch (LoadException le) { if (m_quitOnError) throw le; } try { morpheme.ExcludedMorphemeCoOccurrences = LoadMorphCoOccurs(morphemeElem.SelectSingleNode("ExcludedMorphemeCoOccurrences")); } catch (LoadException le) { if (m_quitOnError) throw le; } } XmlNodeList allomorphList = morphemeNode.SelectNodes("Allomorphs/Allomorph[@isActive='yes'] | MorphologicalSubrules/MorphologicalSubruleStructure[@isActive='yes']"); foreach (XmlNode alloNode in allomorphList) { XmlElement alloElem = alloNode as XmlElement; string alloId = alloElem.GetAttribute("id"); Allomorph allomorph = m_curMorpher.GetAllomorph(alloId); if (allomorph != null) { try { allomorph.RequiredAllomorphCoOccurrences = LoadAlloCoOccurs(alloElem.SelectSingleNode("RequiredAllomorphCoOccurrences")); } catch (LoadException le) { if (m_quitOnError) throw le; } try { allomorph.ExcludedAllomorphCoOccurrences = LoadAlloCoOccurs(alloElem.SelectSingleNode("ExcludedAllomorphCoOccurrences")); } catch (LoadException le) { if (m_quitOnError) throw le; } } } } XmlNodeList prules = langElem.SelectNodes("PhonologicalRules/*[@isActive='yes']"); foreach (XmlNode pruleNode in prules) { XmlElement pruleElem = pruleNode as XmlElement; try { switch (pruleElem.Name) { case "MetathesisRule": LoadMetathesisRule(pruleElem); break; case "PhonologicalRule": LoadPRule(pruleElem); break; } } catch (LoadException le) { if (m_quitOnError) throw le; } } }