internal override bool IsWordValid(Morpher morpher, Word word) { if (!base.IsWordValid(morpher, word)) { return(false); } if (IsBound && word.Allomorphs.Count == 1) { if (morpher.TraceManager.IsTracing) { morpher.TraceManager.ParseFailed(morpher.Language, word, FailureReason.BoundRoot, this, null); } return(false); } if (StemName != null && !StemName.IsRequiredMatch(word.SyntacticFeatureStruct)) { if (morpher.TraceManager.IsTracing) { morpher.TraceManager.ParseFailed(morpher.Language, word, FailureReason.RequiredStemName, this, StemName); } return(false); } foreach (RootAllomorph otherAllo in ((LexEntry)Morpheme).Allomorphs.Where(a => a != this && a.StemName != null)) { if (!otherAllo.StemName.IsExcludedMatch(word.SyntacticFeatureStruct, StemName)) { if (morpher.TraceManager.IsTracing) { morpher.TraceManager.ParseFailed(morpher.Language, word, FailureReason.ExcludedStemName, this, otherAllo.StemName); } return(false); } } return(true); }
public bool IsExcludedMatch(FeatureStruct fs, StemName stemName) { return(_regions.Except(stemName == null ? Enumerable.Empty <FeatureStruct>() : stemName.Regions, FreezableEqualityComparer <FeatureStruct> .Default).All(r => !r.Subsumes(fs))); }
public bool IsExcludedMatch(FeatureStruct fs, StemName stemName) { return _regions.Except(stemName == null ? Enumerable.Empty<FeatureStruct>() : stemName.Regions, FreezableEqualityComparer<FeatureStruct>.Default).All(r => !r.Subsumes(fs)); }
private void LoadStemName(XElement stemNameElem) { var posIDs = (string) stemNameElem.Attribute("partsOfSpeech"); FeatureSymbol[] pos = posIDs.Split(' ').Select(id => _posFeature.PossibleSymbols[id]).ToArray(); var regions = new List<FeatureStruct>(); foreach (XElement regionElem in stemNameElem.Elements("Regions").Elements("Region")) { var fs = new FeatureStruct(); fs.AddValue(_posFeature, pos); XElement headFeatElem = regionElem.Element("AssignedHeadFeatures"); if (headFeatElem != null) fs.AddValue(_headFeature, LoadFeatureStruct(headFeatElem, _language.SyntacticFeatureSystem)); XElement footFeatElem = regionElem.Element("AssignedFootFeatures"); if (footFeatElem != null) fs.AddValue(_footFeature, LoadFeatureStruct(footFeatElem, _language.SyntacticFeatureSystem)); fs.Freeze(); regions.Add(fs); } var stemName = new StemName(regions) {Name = (string) stemNameElem.Element("Name")}; _language.StemNames.Add(stemName); _stemNames[(string) stemNameElem.Attribute("id")] = stemName; }