public static List <LinguisticUnit> GetLast(LinguisticUnit nonTerminal) { var last = new List <LinguisticUnit>(); var rule = Grammar.First(r => r.LeftPart.Name == nonTerminal.Name); foreach (var rightPart in rule.RightParts) { last.Add(rightPart.LinguisticUnits.Last()); } return(last); }
public static List <LinguisticUnit> GetLastPlus(LinguisticUnit nonTerminal, List <LinguisticUnit> lastPlus = null) { lastPlus = lastPlus ?? new List <LinguisticUnit>(); var rule = Grammar.First(r => r.LeftPart.Name == nonTerminal.Name); foreach (var rightPart in rule.RightParts) { if (rightPart.LinguisticUnits.Last().Type == LinguisticUnitType.NonTerminal && !lastPlus.Any(l => l.Name == rightPart.LinguisticUnits.Last().Name)) { lastPlus.Add(rightPart.LinguisticUnits.Last()); GetLastPlus(rightPart.LinguisticUnits.Last(), lastPlus); } else { if (!lastPlus.Any(l => l.Name == rightPart.LinguisticUnits.Last().Name)) { lastPlus.Add(rightPart.LinguisticUnits.Last()); } } } return(lastPlus); }
public static void BuildTable() { LinguisticUnit dollar = new LinguisticUnit { Name = "$" }; void AddToRelationshipsTable(RelationshipToken relationshipToken) { if (Table.FirstOrDefault(rt => rt.FirstLinguisticUnit.Name.Equals(relationshipToken.FirstLinguisticUnit.Name) && rt.Relationship.Equals(relationshipToken.Relationship) && rt.SecondLinguisticUnit.Name.Equals(relationshipToken.SecondLinguisticUnit.Name)) is null) { Table.Add(relationshipToken); } } foreach (var rule in Grammar) { foreach (var rightPart in rule.RightParts) { for (int i = 0; i < rightPart.LinguisticUnits.Count; i++) { if (i + 1 < rightPart.LinguisticUnits.Count) { var equalRelation = new RelationshipToken { FirstLinguisticUnit = rightPart.LinguisticUnits[i], SecondLinguisticUnit = rightPart.LinguisticUnits[i + 1], Relationship = "=" }; AddToRelationshipsTable(equalRelation); if (equalRelation.SecondLinguisticUnit.Type == LinguisticUnitType.NonTerminal) { var firstPlus = GetFirstPlus(equalRelation.SecondLinguisticUnit); foreach (var first in firstPlus) { var lowerRelation = new RelationshipToken { FirstLinguisticUnit = equalRelation.FirstLinguisticUnit, SecondLinguisticUnit = first, Relationship = "<" }; AddToRelationshipsTable(lowerRelation); } } if (equalRelation.FirstLinguisticUnit.Type == LinguisticUnitType.NonTerminal) { var lastPlus = GetLastPlus(equalRelation.FirstLinguisticUnit); foreach (var last in lastPlus) { var higherRelation = new RelationshipToken { FirstLinguisticUnit = last, SecondLinguisticUnit = equalRelation.SecondLinguisticUnit, Relationship = ">" }; AddToRelationshipsTable(higherRelation); } } if (equalRelation.FirstLinguisticUnit.Type == LinguisticUnitType.NonTerminal && equalRelation.SecondLinguisticUnit.Type == LinguisticUnitType.NonTerminal) { var lastPlus = GetLastPlus(equalRelation.FirstLinguisticUnit); var firstPlus = GetFirstPlus(equalRelation.SecondLinguisticUnit); foreach (var last in lastPlus) { foreach (var first in firstPlus) { AddToRelationshipsTable(new RelationshipToken { FirstLinguisticUnit = last, SecondLinguisticUnit = first, Relationship = ">" }); } } } } AddToRelationshipsTable(new RelationshipToken { FirstLinguisticUnit = rightPart.LinguisticUnits[i], SecondLinguisticUnit = dollar, Relationship = ">" }); AddToRelationshipsTable(new RelationshipToken { FirstLinguisticUnit = dollar, SecondLinguisticUnit = rightPart.LinguisticUnits[i], Relationship = "<" }); } } } AddToRelationshipsTable(new RelationshipToken { FirstLinguisticUnit = dollar, SecondLinguisticUnit = Grammar.First().LeftPart, Relationship = "<" }); AddToRelationshipsTable(new RelationshipToken { FirstLinguisticUnit = Grammar.First().LeftPart, SecondLinguisticUnit = dollar, Relationship = ">" }); }