예제 #1
0
        public static void Closure(LRConfigSet ConfigSet)
        {
            LRConfigSet setB = new LRConfigSet();
            short       num3 = (short)(ConfigSet.Count() - 1);

            for (short i = 0; i <= num3; i = (short)(i + 1))
            {
                LRConfig           config2 = ConfigSet[i];
                LookaheadSymbolSet set     = TotalLookahead(config2);
                SymbolBuild        build   = config2.NextSymbol(0);
                if ((build != null) && (build.Type == SymbolType.Nonterminal))
                {
                    LRConfigSet partialClosure = build.PartialClosure;
                    short       num4           = (short)(partialClosure.Count() - 1);
                    for (short j = 0; j <= num4; j = (short)(j + 1))
                    {
                        LRConfig config = partialClosure[j];
                        LRConfig item   = new LRConfig(config.Parent, 0, config.LookaheadSet);
                        if (config.InheritLookahead)
                        {
                            item.LookaheadSet.UnionWith(set);
                        }
                        setB.Add(item);
                    }
                }
            }
            ConfigSet.UnionWith(setB);
        }
예제 #2
0
        private static LookaheadSymbolSet TotalLookahead(LRConfig Config)
        {
            bool flag;
            LookaheadSymbolSet set = new LookaheadSymbolSet();

            for (int i = 0; (i < Config.CheckaheadCount()) & !flag; i++)
            {
                short offset = (short)i;
                i = offset;
                SymbolBuild       build  = Config.Checkahead(offset);
                ConfigTrackSource source = (ConfigTrackSource)Conversions.ToInteger(Interaction.IIf(build.Type == SymbolType.Nonterminal, ConfigTrackSource.First, ConfigTrackSource.Config));
                int num4 = build.First.Count() - 1;
                for (int j = 0; j <= num4; j++)
                {
                    LookaheadSymbol item = new LookaheadSymbol(build.First[j]);
                    if (item.Parent.Type != SymbolType.Nonterminal)
                    {
                        item.Configs.Add(new ConfigTrack(Config, source));
                        set.Add(item);
                    }
                }
                flag = !build.Nullable;
            }
            if (!flag)
            {
                set.UnionWith(Config.LookaheadSet);
            }
            return(set);
        }
예제 #3
0
        private static void ComputeLRState(LRStateBuild State)
        {
            short       num2;
            SymbolBuild build2;
            short       num3 = (short)(BuilderApp.BuildTables.Symbol.Count() - 1);

            for (num2 = 0; num2 <= num3; num2 = (short)(num2 + 1))
            {
                GotoList[num2] = null;
            }
            short num4 = (short)(State.ConfigSet.Count() - 1);

            for (num2 = 0; num2 <= num4; num2 = (short)(num2 + 1))
            {
                LRConfig config = State.ConfigSet[num2];
                build2 = config.NextSymbol(0);
                if (build2 != null)
                {
                    short tableIndex = build2.TableIndex;
                    if (GotoList[tableIndex] == null)
                    {
                        GotoList[tableIndex] = new LRConfigSet();
                    }
                    LRConfig item = new LRConfig(config.Parent, config.Position + 1, config.LookaheadSet);
                    GotoList[tableIndex].Add(item);
                }
            }
            short num5 = (short)(BuilderApp.BuildTables.Symbol.Count() - 1);

            for (num2 = 0; num2 <= num5; num2 = (short)(num2 + 1))
            {
                if (GotoList[num2] == null)
                {
                    continue;
                }
                build2 = BuilderApp.BuildTables.Symbol[num2];
                Closure(GotoList[num2]);
                LRStateBuild state = new LRStateBuild
                {
                    ConfigSet = GotoList[num2]
                };
                switch (build2.Type)
                {
                case SymbolType.Nonterminal:
                {
                    State.Add(new LRAction(build2, LRActionType.Goto, CreateLRState(state)));
                    Notify.Analyzed++;
                    continue;
                }

                case SymbolType.End:
                {
                    State.Add(new LRAction(build2, LRActionType.Accept));
                    continue;
                }
                }
                State.Add(new LRAction(build2, LRActionType.Shift, CreateLRState(state)));
                Notify.Analyzed++;
            }
        }
예제 #4
0
 public bool IsLessThan(LRConfig ConfigB)
 {
     if (this.Position != ConfigB.Position)
     {
         return(this.Position > ConfigB.Position);
     }
     return((this.Parent.TableIndex != ConfigB.TableIndex()) && (this.Parent.TableIndex < ConfigB.TableIndex()));
 }
예제 #5
0
 public LRConfig(LRConfig Config)
 {
     this.LookaheadSet     = new LookaheadSymbolSet();
     this.Parent           = Config.Parent;
     this.Position         = Config.Position;
     this.LookaheadSet     = new LookaheadSymbolSet();
     this.Modified         = Config.Modified;
     this.InheritLookahead = Config.InheritLookahead;
     this.LookaheadSet.Copy(Config.LookaheadSet);
 }
예제 #6
0
 private static bool PopulateLookahead(LRConfig Config)
 {
     if (Config.InheritLookahead)
     {
         bool flag = false;
         for (short i = 0; (i < Config.CheckaheadCount()) & !flag; i = (short)(i + 1))
         {
             flag = !Config.Checkahead(i).Nullable;
         }
         return(!flag);
     }
     return(false);
 }
예제 #7
0
        public int CompareTo(object obj)
        {
            LRConfig config = (LRConfig)obj;

            if (this.IsEqualTo(config))
            {
                return(0);
            }
            if (this.IsLessThan(config))
            {
                return(-1);
            }
            return(1);
        }
예제 #8
0
        public DictionarySet.MemberResult Union(DictionarySet.IMember NewObject)
        {
            bool     flag;
            LRConfig config    = (LRConfig)NewObject;
            LRConfig newObject = new LRConfig(this);

            if (newObject.LookaheadSet.UnionWith(config.LookaheadSet))
            {
                flag = true;
                newObject.Modified = true;
            }
            else
            {
                newObject.Modified = this.Modified | config.Modified;
                flag = false;
            }
            newObject.InheritLookahead = this.InheritLookahead | config.InheritLookahead;
            return(new DictionarySet.MemberResult(newObject, flag));
        }
예제 #9
0
        public LRConfigCompare CompareCore(LRConfig ConfigB)
        {
            if ((this.Parent.TableIndex == ConfigB.TableIndex()) & (this.Position == ConfigB.Position))
            {
                LRConfigCompare compare2;
                switch (this.LookaheadSet.CompareTo(ConfigB.LookaheadSet))
                {
                case DictionarySet.Compare.Equal:
                    return(LRConfigCompare.EqualFull);

                case DictionarySet.Compare.UnEqual:
                    return(LRConfigCompare.EqualCore);

                case DictionarySet.Compare.Subset:
                    return(LRConfigCompare.ProperSubset);
                }
                return(compare2);
            }
            return(LRConfigCompare.UnEqual);
        }
예제 #10
0
        private static LRStateBuild CreateInitialState(Symbol StartSymbol)
        {
            ProductionBuild rule        = new ProductionBuild();
            SymbolBuild     nonTerminal = new SymbolBuild
            {
                Type = SymbolType.Nonterminal,
                Name = "S'"
            };

            rule.SetHead(nonTerminal);
            rule.Handle().Add((SymbolBuild)StartSymbol);
            rule.Handle().Add((SymbolBuild)BuilderApp.BuildTables.Symbol.GetFirstOfType(SymbolType.End));
            LRConfig     item   = new LRConfig(rule);
            LRStateBuild build3 = new LRStateBuild();

            build3.ConfigSet.Add(item);
            build3.Expanded = false;
            Closure(build3.ConfigSet);
            return(build3);
        }
예제 #11
0
        private static LRStateBuild GotoSymbol(LRStateBuild State, SymbolBuild TheSymbol)
        {
            LRStateBuild build2 = new LRStateBuild();
            short        num2   = (short)(State.ConfigSet.Count() - 1);

            for (short i = 0; i <= num2; i = (short)(i + 1))
            {
                LRConfig config = State.ConfigSet[i];
                Symbol   symbol = config.NextSymbol(0);
                if ((symbol != null) && symbol.IsEqualTo(TheSymbol))
                {
                    LRConfig item = new LRConfig(config.Parent, config.Position + 1, config.LookaheadSet);
                    build2.ConfigSet.Add(item);
                }
            }
            if (build2.ConfigSet.Count() >= 1)
            {
                Closure(build2.ConfigSet);
            }
            return(build2);
        }
예제 #12
0
 public ConfigTrack(LRConfig Config, ConfigTrackSource Source)
 {
     this.Parent     = Config;
     this.FromConfig = Source == ConfigTrackSource.Config;
     this.FromFirst  = Source == ConfigTrackSource.First;
 }
예제 #13
0
        private static LRConfigSet GetClosureConfigSet(SymbolBuild Sym)
        {
            bool            flag;
            LRConfig        config;
            short           num2;
            SymbolBuild     build;
            LRConfig        config2;
            ProductionBuild build2;
            LRConfigSet     setB = new LRConfigSet();
            LRConfigSet     set  = new LRConfigSet();
            short           num3 = (short)(BuilderApp.BuildTables.Production.Count() - 1);
            short           num  = 0;

            while (num <= num3)
            {
                build2 = BuilderApp.BuildTables.Production[num];
                if (build2.Head.IsEqualTo(Sym))
                {
                    config2 = new LRConfig
                    {
                        Position         = 0,
                        Modified         = true,
                        LookaheadSet     = new LookaheadSymbolSet(),
                        Parent           = build2,
                        InheritLookahead = true
                    };
                    set.Add(config2);
                }
                num = (short)(num + 1);
            }
            do
            {
                setB.Clear();
                flag = false;
                short num4 = (short)(set.Count() - 1);
                num2 = 0;
                while (num2 <= num4)
                {
                    config = set[num2];
                    if (!config.IsComplete() & config.Modified)
                    {
                        build = config.NextSymbol(0);
                        if (build.Type == SymbolType.Nonterminal)
                        {
                            short num5 = (short)(BuilderApp.BuildTables.Production.Count() - 1);
                            num = 0;
                            while (num <= num5)
                            {
                                build2 = BuilderApp.BuildTables.Production[num];
                                if (build2.Head.IsEqualTo(build))
                                {
                                    config2 = new LRConfig(build2, 0, TotalLookahead(config));
                                    setB.Add(config2);
                                }
                                num = (short)(num + 1);
                            }
                        }
                        set[num2].Modified = false;
                    }
                    num2 = (short)(num2 + 1);
                }
            }while (set.UnionWith(setB));
            do
            {
                flag = false;
                short num6 = (short)(set.Count() - 1);
                for (num2 = 0; num2 <= num6; num2 = (short)(num2 + 1))
                {
                    config = set[num2];
                    build  = config.NextSymbol(0);
                    if ((build != null) && ((config.InheritLookahead & PopulateLookahead(config)) & (build.Type == SymbolType.Nonterminal)))
                    {
                        short num7 = (short)(set.Count() - 1);
                        for (num = 0; num <= num7; num = (short)(num + 1))
                        {
                            config = set[num];
                            if (((config.Position == 0) & config.Parent.Head.IsEqualTo(build)) & !config.InheritLookahead)
                            {
                                config.InheritLookahead = true;
                                flag = true;
                            }
                        }
                    }
                }
            }while (flag);
            return(set);
        }
예제 #14
0
        public bool IsGreaterThan(LRConfig ConfigB)
        {
            LRConfig configB = this;

            return(ConfigB.IsLessThan(configB));
        }
예제 #15
0
 public bool IsEqualTo(LRConfig Config)
 {
     return((this.Parent.TableIndex == Config.TableIndex()) & (this.Position == Config.Position));
 }
예제 #16
0
 public bool HasEqualCore(LRConfig Config)
 {
     return(this.IsEqualTo(Config));
 }
예제 #17
0
        private static void ComputeReductions()
        {
            LRConflictItem[] itemArray = new LRConflictItem[BuilderApp.BuildTables.Symbol.Count() + 1];
            short            num4      = (short)(BuilderApp.BuildTables.LALR.Count - 1);

            for (short i = 0; i <= num4; i = (short)(i + 1))
            {
                LRConflict   shiftReduce;
                LRStateBuild build = BuilderApp.BuildTables.LALR[i];
                short        num5  = (short)(BuilderApp.BuildTables.Symbol.Count() - 1);
                short        index = 0;
                while (index <= num5)
                {
                    itemArray[index] = new LRConflictItem(BuilderApp.BuildTables.Symbol[index]);
                    index            = (short)(index + 1);
                }
                short num6 = (short)(build.ConfigSet.Count() - 1);
                short num2 = 0;
                while (num2 <= num6)
                {
                    short    num7;
                    LRConfig item = build.ConfigSet[num2];
                    switch (((int)item.NextAction()))
                    {
                    case 1:
                        itemArray[item.NextSymbol(0).TableIndex].Shifts.Add(item);
                        goto Label_0137;

                    case 2:
                        num7  = (short)(item.LookaheadSet.Count() - 1);
                        index = 0;
                        goto Label_012D;

                    default:
                        goto Label_0137;
                    }
Label_0100:
                    itemArray[item.LookaheadSet[index].Parent.TableIndex].Reduces.Add(item);
                    index = (short)(index + 1);
Label_012D:
                    if (index <= num7)
                    {
                        goto Label_0100;
                    }
Label_0137:
                    num2 = (short)(num2 + 1);
                }
                short num8 = (short)(BuilderApp.BuildTables.Symbol.Count() - 1);
                index = 0;
                while (index <= num8)
                {
                    if ((itemArray[index].Shifts.Count() >= 1) & (itemArray[index].Reduces.Count() >= 1))
                    {
                        short num9 = (short)(itemArray[index].Shifts.Count() - 1);
                        num2 = 0;
                        while (num2 <= num9)
                        {
                            itemArray[index].Shifts[num2].Status = LRStatus.Warning;
                            num2 = (short)(num2 + 1);
                        }
                        short num10 = (short)(itemArray[index].Reduces.Count() - 1);
                        num2 = 0;
                        while (num2 <= num10)
                        {
                            itemArray[index].Reduces[num2].Status = LRStatus.Warning;
                            num2 = (short)(num2 + 1);
                        }
                        build.Status = LRStatus.Warning;
                        build.Note   = "Shift-Reduce Conflict";
                        build.ConflictList.Add(new LRConflictItem(itemArray[index], LRConflict.ShiftReduce));
                        shiftReduce = LRConflict.ShiftReduce;
                        BuilderApp.Log.Add(SysLogSection.LALR, SysLogAlert.Warning, "A Shift-Reduce Conflict was fixed", BuilderApp.BuildTables.Symbol[index].Text(false) + " can follow a completed rule and also be shifted." + GetConflictResolvedDesc(shiftReduce), Conversions.ToString((int)i));
                    }
                    index = (short)(index + 1);
                }
                short num11 = (short)(BuilderApp.BuildTables.Symbol.Count() - 1);
                for (index = 0; index <= num11; index = (short)(index + 1))
                {
                    if ((itemArray[index].Reduces.Count() == 1) & (itemArray[index].Shifts.Count() == 0))
                    {
                        SymbolBuild theSymbol = BuilderApp.BuildTables.Symbol[index];
                        build.Add(new LRAction(theSymbol, LRActionType.Reduce, itemArray[index].Reduces[0].Parent.TableIndex));
                    }
                    else if (itemArray[index].Reduces.Count() > 1)
                    {
                        short num12 = (short)(itemArray[index].Reduces.Count() - 1);
                        for (num2 = 0; num2 <= num12; num2 = (short)(num2 + 1))
                        {
                            itemArray[index].Reduces[num2].Status = LRStatus.Critical;
                        }
                        build.Status = LRStatus.Critical;
                        build.Note   = "Reduce-Reduce Conflict";
                        build.ConflictList.Add(new LRConflictItem(itemArray[index], LRConflict.ReduceReduce));
                        shiftReduce = LRConflict.ReduceReduce;
                        BuilderApp.Log.Add(SysLogSection.LALR, SysLogAlert.Critical, "Reduce-Reduce Conflict", BuilderApp.BuildTables.Symbol[index].Text(false) + " can follow more than one completed rule. " + GetConflictDesc(shiftReduce), Conversions.ToString((int)i));
                    }
                }
            }
        }
예제 #18
0
 // Methods
 public ConfigTrack(ConfigTrack Track)
 {
     this.Parent     = Track.Parent;
     this.FromConfig = Track.FromConfig;
     this.FromFirst  = Track.FromFirst;
 }