コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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         = ">"
            });
        }