Exemplo n.º 1
0
		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);
		}
Exemplo n.º 2
0
		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);
		}