public static List <RelationshipToken> GetConflicts()
        {
            Dictionary <RelationshipToken, RelationshipToken> conflicts = new Dictionary <RelationshipToken, RelationshipToken>();

            foreach (var token in Table)
            {
                RelationshipToken conflict = Table.FirstOrDefault(c => c.FirstLinguisticUnit.Name == token.FirstLinguisticUnit.Name &&
                                                                  c.SecondLinguisticUnit.Name == token.SecondLinguisticUnit.Name &&
                                                                  c.Relationship != token.Relationship);
                if (conflict != null &&
                    !conflicts.Any(c =>
                                   c.Key.FirstLinguisticUnit.Name == conflict.FirstLinguisticUnit.Name &&
                                   c.Key.SecondLinguisticUnit.Name == conflict.SecondLinguisticUnit.Name &&
                                   c.Key.Relationship == conflict.Relationship) &&
                    !conflicts.Any(c =>
                                   c.Key.FirstLinguisticUnit.Name == token.FirstLinguisticUnit.Name &&
                                   c.Key.SecondLinguisticUnit.Name == token.SecondLinguisticUnit.Name &&
                                   c.Key.Relationship == token.Relationship))
                {
                    conflicts.Add(token, conflict);
                }
            }

            string str = string.Empty;

            foreach (var conflict in conflicts)
            {
                str += $"|\t{conflict.Key.FirstLinguisticUnit.Name}\t[ {conflict.Key.Relationship} ]\t{conflict.Key.SecondLinguisticUnit.Name}\t|";
                str += $"\t{conflict.Value.FirstLinguisticUnit.Name}\t[ {conflict.Value.Relationship} ]\t{conflict.Value.SecondLinguisticUnit.Name}\t|{Environment.NewLine}";
            }
            File.WriteAllText($@"{Environment.GetFolderPath(Environment.SpecialFolder.Desktop)}\conflicts.txt", str);
            return(new List <RelationshipToken>());
        }
        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         = ">"
            });
        }