Beispiel #1
0
 string IProductionVisitor <int, string> .VisitAlternation <T>(AlternationProduction <T> alternationProduction, int DotLocation)
 {
     if (DotLocation == 0)
     {
         return(String.Format("{0} ::=.({1}|{2})", alternationProduction.DebugName,
                              alternationProduction.Production1.DebugName,
                              alternationProduction.Production2.DebugName));
     }
     else
     {
         return(String.Format("{0} ::= ({1}|{2}).", alternationProduction.DebugName,
                              alternationProduction.Production1.DebugName,
                              alternationProduction.Production2.DebugName));
     }
 }
Beispiel #2
0
        bool IProductionVisitor <ClosureInfo, bool> .VisitAlternation <T>(AlternationProduction <T> alternationProduction, ClosureInfo arg)
        {
            if (arg.DotLocation == 0)
            {
                if (!alternationProduction.Production1.IsTerminal)
                {
                    arg.IsChanged = arg.LR0ItemSet.Add(new LR0Item(alternationProduction.Production1.Info.Index, 0)) || arg.IsChanged;
                }

                if (!alternationProduction.Production2.IsTerminal)
                {
                    arg.IsChanged = arg.LR0ItemSet.Add(new LR0Item(alternationProduction.Production2.Info.Index, 0)) || arg.IsChanged;
                }
            }

            return(arg.IsChanged);
        }
Beispiel #3
0
        bool IProductionVisitor <bool, bool> .VisitAlternation <T>(AlternationProduction <T> alternationProduction, bool IsChanged)
        {
            var info = alternationProduction.Info;

            var info1 = alternationProduction.Production1.Info;
            var info2 = alternationProduction.Production2.Info;


            IsChanged = info.First.UnionCheck(info1.First) || IsChanged;
            IsChanged = info.First.UnionCheck(info2.First) || IsChanged;

            IsChanged = info1.Follow.UnionCheck(info.Follow) || IsChanged;
            IsChanged = info2.Follow.UnionCheck(info.Follow) || IsChanged;

            bool isNullable = info1.IsNullable || info2.IsNullable;

            if (info.IsNullable != isNullable)
            {
                IsChanged       = true;
                info.IsNullable = isNullable;
            }

            return(IsChanged);
        }
Beispiel #4
0
        List <IProduction> IProductionVisitor <List <IProduction>, List <IProduction> > .VisitAlternation <T>(AlternationProduction <T> alternationProduction, List <IProduction> Productions)
        {
            if (alternationProduction.Info != null)
            {
                return(Productions);
            }

            alternationProduction.Info = new ProductionInfo();

            alternationProduction.Production1.Accept(this, Productions);
            alternationProduction.Production2.Accept(this, Productions);

            alternationProduction.Info.Index       = Productions.Count;
            alternationProduction.Info.SymbolCount = 1;
            Productions.Add(alternationProduction);

            return(Productions);
        }
Beispiel #5
0
 IReadOnlyList <IProduction> IProductionVisitor <int, IReadOnlyList <IProduction> > .VisitAlternation <T>(AlternationProduction <T> alternationProduction, int DotLocation)
 {
     if (DotLocation == 0)
     {
         return(new IProduction[2] {
             alternationProduction.Production1, alternationProduction.Production2
         });
     }
     else
     {
         return(s_empty);
     }
 }
Beispiel #6
0
        bool IProductionVisitor <Tuple <int, bool, ISet <LR0Item> >, bool> .VisitAlternation <T>(AlternationProduction <T> alternationProduction, Tuple <int, bool, ISet <LR0Item> > arg)
        {
            int            DotLocation = arg.Item1;
            bool           IsChanged   = arg.Item2;
            ISet <LR0Item> LR0ItemSet  = arg.Item3;

            if (DotLocation == 0)
            {
                if (!alternationProduction.Production1.IsTerminal)
                {
                    IsChanged = LR0ItemSet.Add(new LR0Item(alternationProduction.Production1.Info.Index, 0)) || IsChanged;
                }

                if (!alternationProduction.Production2.IsTerminal)
                {
                    IsChanged = LR0ItemSet.Add(new LR0Item(alternationProduction.Production2.Info.Index, 0)) || IsChanged;
                }
            }

            return(IsChanged);
        }