public static bool TryCreateParseMorph(FdoCache cache, XElement morphElem, out ParseMorph morph) { XElement formElement = morphElem.Element("MoForm"); Debug.Assert(formElement != null); var hvoForm = (string)formElement.Attribute("DbRef"); XElement msiElement = morphElem.Element("MSI"); Debug.Assert(msiElement != null); var msaHvoStr = (string)msiElement.Attribute("DbRef"); return TryCreateParseMorph(cache, hvoForm, msaHvoStr, out morph); }
private static bool TryCreateParseMorph(FdoCache cache, XElement morphElem, out ParseMorph morph) { XElement formElement = morphElem.Element("MoForm"); Debug.Assert(formElement != null); var formHvo = (string) formElement.Attribute("DbRef"); XElement msiElement = morphElem.Element("MSI"); Debug.Assert(msiElement != null); var msaHvo = (string) msiElement.Attribute("DbRef"); // Normally, the hvo for MoForm is a MoForm and the hvo for MSI is an MSA // There are four exceptions, though, when an irregularly inflected form is involved: // 1. <MoForm DbRef="x"... and x is an hvo for a LexEntryInflType. // This is one of the null allomorphs we create when building the // input for the parser in order to still get the Word Grammar to have something in any // required slots in affix templates. The parser filer can ignore these. // 2. <MSI DbRef="y"... and y is an hvo for a LexEntryInflType. // This is one of the null allomorphs we create when building the // input for the parser in order to still get the Word Grammar to have something in any // required slots in affix templates. The parser filer can ignore these. // 3. <MSI DbRef="y"... and y is an hvo for a LexEntry. // The LexEntry is a variant form for the first set of LexEntryRefs. // 4. <MSI DbRef="y"... and y is an hvo for a LexEntry followed by a period and an index digit. // The LexEntry is a variant form and the (non-zero) index indicates // which set of LexEntryRefs it is for. ICmObject objForm; if (!cache.ServiceLocator.GetInstance<ICmObjectRepository>().TryGetObject(int.Parse(formHvo), out objForm)) { morph = null; return false; } var form = objForm as IMoForm; if (form == null) { morph = null; return true; } // Irregulary inflected forms can have a combination MSA hvo: the LexEntry hvo, a period, and an index to the LexEntryRef Tuple<int, int> msaTuple = ProcessMsaHvo(msaHvo); ICmObject objMsa; if (!cache.ServiceLocator.GetInstance<ICmObjectRepository>().TryGetObject(msaTuple.Item1, out objMsa)) { morph = null; return false; } var msa = objMsa as IMoMorphSynAnalysis; if (msa != null) { morph = new ParseMorph(form, msa); return true; } var msaAsLexEntry = objMsa as ILexEntry; if (msaAsLexEntry != null) { // is an irregularly inflected form // get the MoStemMsa of its variant if (msaAsLexEntry.EntryRefsOS.Count > 0) { ILexEntryRef lexEntryRef = msaAsLexEntry.EntryRefsOS[msaTuple.Item2]; ILexSense sense = MorphServices.GetMainOrFirstSenseOfVariant(lexEntryRef); var inflType = lexEntryRef.VariantEntryTypesRS[0] as ILexEntryInflType; morph = new ParseMorph(form, sense.MorphoSyntaxAnalysisRA, inflType); return true; } } // if it is anything else, we ignore it morph = null; return true; }