void LoadMRule(XmlElement mruleNode) { string id = mruleNode.GetAttribute("id"); string name = mruleNode.SelectSingleNode("Name").InnerText; AffixalMorphologicalRule mrule = new AffixalMorphologicalRule(id, name, m_curMorpher); XmlElement glossElem = mruleNode.SelectSingleNode("Gloss") as XmlElement; if (glossElem != null) mrule.Gloss = new Gloss(glossElem.GetAttribute("id"), glossElem.InnerText, m_curMorpher); string multApp = mruleNode.GetAttribute("multipleApplication"); if (!string.IsNullOrEmpty(multApp)) mrule.MaxNumApps = Convert.ToInt32(multApp); mrule.RequiredPOSs = LoadPOSs(mruleNode.GetAttribute("requiredPartsOfSpeech")); string outPOSId = mruleNode.GetAttribute("outputPartOfSpeech"); PartOfSpeech outPOS = null; if (!string.IsNullOrEmpty(outPOSId)) { outPOS = m_curMorpher.GetPOS(outPOSId); if (outPOS == null) throw CreateUndefinedObjectException(string.Format(HCStrings.kstidUnknownPOS, outPOSId), outPOSId); } mrule.OutPOS = outPOS; mrule.RequiredHeadFeatures = LoadSynFeats(mruleNode.SelectSingleNode("RequiredHeadFeatures"), m_curMorpher.HeadFeatureSystem); mrule.RequiredFootFeatures = LoadSynFeats(mruleNode.SelectSingleNode("RequiredFootFeatures"), m_curMorpher.FootFeatureSystem); mrule.OutHeadFeatures = LoadSynFeats(mruleNode.SelectSingleNode("OutputHeadFeatures"), m_curMorpher.HeadFeatureSystem); mrule.OutFootFeatures = LoadSynFeats(mruleNode.SelectSingleNode("OutputFootFeatures"), m_curMorpher.FootFeatureSystem); HCObjectSet<Feature> obligHeadFeats = new HCObjectSet<Feature>(); string obligHeadIdsStr = mruleNode.GetAttribute("outputObligatoryFeatures"); if (!string.IsNullOrEmpty(obligHeadIdsStr)) { string[] obligHeadIds = obligHeadIdsStr.Split(' '); foreach (string obligHeadId in obligHeadIds) { Feature feature = m_curMorpher.HeadFeatureSystem.GetFeature(obligHeadId); if (feature == null) throw CreateUndefinedObjectException(string.Format(HCStrings.kstidUnknownFeat, obligHeadId), obligHeadId); obligHeadFeats.Add(feature); } } mrule.ObligatoryHeadFeatures = obligHeadFeats; mrule.IsBlockable = mruleNode.GetAttribute("blockable") == "true"; XmlNodeList subruleList = mruleNode.SelectNodes("MorphologicalSubrules/MorphologicalSubruleStructure[@isActive='yes']"); foreach (XmlNode subruleNode in subruleList) { try { LoadMSubrule(subruleNode as XmlElement, mrule); } catch (LoadException le) { if (m_quitOnError) throw le; } } if (mrule.SubruleCount > 0) m_curMorpher.AddMorphologicalRule(mrule); }
void LoadMSubrule(XmlElement msubruleNode, AffixalMorphologicalRule mrule) { string id = msubruleNode.GetAttribute("id"); Dictionary<string, string> varFeatIds; AlphaVariables varFeats = LoadAlphaVars(msubruleNode.SelectSingleNode("VariableFeatures"), out varFeatIds); XmlElement inputElem = msubruleNode.SelectSingleNode("InputSideRecordStructure") as XmlElement; Dictionary<string, int> partIds = new Dictionary<string, int>(); List<PhoneticPattern> lhsList = LoadReqPhoneticInput(inputElem.SelectSingleNode("RequiredPhoneticInput"), 0, varFeats, varFeatIds, partIds); XmlElement outputElem = msubruleNode.SelectSingleNode("OutputSideRecordStructure") as XmlElement; List<MorphologicalOutput> rhsList = LoadPhoneticOutput(outputElem.SelectSingleNode("MorphologicalPhoneticOutput"), varFeats, varFeatIds, partIds, mrule.ID); MorphologicalTransform.RedupMorphType redupMorphType = GetRedupMorphType(outputElem.GetAttribute("redupMorphType")); AffixalMorphologicalRule.Subrule sr = new AffixalMorphologicalRule.Subrule(id, id, m_curMorpher, lhsList, rhsList, varFeats, redupMorphType); sr.RequiredMPRFeatures = LoadMPRFeatures(inputElem.GetAttribute("requiredMPRFeatures")); sr.ExcludedMPRFeatures = LoadMPRFeatures(inputElem.GetAttribute("excludedMPRFeatures")); sr.OutputMPRFeatures = LoadMPRFeatures(outputElem.GetAttribute("MPRFeatures")); sr.RequiredEnvironments = LoadEnvs(msubruleNode.SelectSingleNode("RequiredEnvironments")); sr.ExcludedEnvironments = LoadEnvs(msubruleNode.SelectSingleNode("ExcludedEnvironments")); sr.Properties = LoadProperties(msubruleNode.SelectSingleNode("Properties")); mrule.AddSubrule(sr); m_curMorpher.AddAllomorph(sr); }