Esempio n. 1
0
        private void EliminarProducoesUnitarias()
        {
            GrammarNoUnitarianProductions = new Grammar();
            GrammarNoUnitarianProductions.Terminals.AddRange(GrammarNoEmpty.Terminals);
            GrammarNoUnitarianProductions.Variables.AddRange(GrammarNoEmpty.Variables);
            for (int i = 0; i < GrammarNoEmpty.Rules.Count; i++)
            {
                RuleProduction rgAtual = GrammarNoEmpty.Rules[i];
                GrammarNoUnitarianProductions.AddRule(rgAtual.Source, rgAtual.Destiny.Copy());
            }
            bool trocou = true;

            while (trocou)
            {
                trocou = false;
                for (int i = GrammarNoUnitarianProductions.Rules.Count - 1; i >= 0; i--)
                {
                    RuleProduction rgAtual = GrammarNoUnitarianProductions.Rules[i];

                    if (rgAtual.IsUnityVariable())
                    {
                        var regras = GrammarNoUnitarianProductions.GetRules(rgAtual.FirstDestiny().Name);
                        foreach (var item in regras)
                        {
                            GrammarNoUnitarianProductions.AddRule(rgAtual.Source, item.Destiny.Copy());
                        }
                        trocou = true;
                        GrammarNoUnitarianProductions.Rules.Remove(rgAtual);
                    }
                }
            }
        }
Esempio n. 2
0
        public void EliminarProducoesVazio()
        {
            GrammarNoEmpty = new Grammar();

            GrammarNoEmpty.Terminals.AddRange(Source.Terminals);
            GrammarNoEmpty.Variables.AddRange(Source.Variables);
            for (int i = 0; i < Source.Rules.Count; i++)
            {
                RuleProduction regraAtual = Source.Rules[i];
                Symbol         orig       = regraAtual.Source;

                List <SymbolList> destinos = new List <SymbolList>();

                if (Source.Rules[i].Destiny.Count == 1 && Source.Rules[i].Destiny[0] == Symbol.EmptyTerminal)
                {
                    //Do Nothing
                }
                else
                {
                    if (regraAtual.Destiny.Count > 0)
                    {
                        destinos.Add(regraAtual.Destiny);
                        for (int j = 0; j < destinos.Count; j++)
                        {
                            for (int k = 0; k < VariablesEmpty.Count; k++)
                            {
                                if (destinos[j].Contains(VariablesEmpty[k]))
                                {
                                    var destino = regraAtual.Destiny;

                                    while (destino.Contains(VariablesEmpty[k]))
                                    {
                                        destino = destino.RemoveFirst(VariablesEmpty[k]);

                                        if (destinos.FirstOrDefault(list => list == destino) == null &&
                                            !destino.IsEmpty())
                                        {
                                            destinos.Add(destino);
                                        }
                                    }
                                }
                            }
                        }
                    }

                    for (int j = 0; j < destinos.Count; j++)
                    {
                        var destino = destinos[j].Copy();
                        GrammarNoEmpty.AddRule(orig, destino);
                    }
                }
            }
        }
Esempio n. 3
0
 private void GenerateNewVars()
 {
     Normalized   = new Grammar();
     NewVariables = new SymbolList();
     foreach (var item in simplified.Terminals)
     {
         int    newId = GetNewId();
         Symbol s     = new Symbol(newId, string.Empty, false);
         NewVariables.Add(s);
         NewRoles.Add(Normalized.AddRule(newId, item));
         DicVariablesTerminals.Add(item, s);
     }
 }
 private void GenerateNewVars()
 {
     Normalized = new Grammar();
     NewVariables = new SymbolList();
     foreach (var item in simplified.Terminals)
     {
         int newId = GetNewId();
         Symbol s = new Symbol(newId, string.Empty, false);
         NewVariables.Add(s);
         NewRoles.Add(Normalized.AddRule(newId, item));
         DicVariablesTerminals.Add(item, s);
     }
 }
Esempio n. 5
0
 public Simplification(Grammar source)
 {
     this.Source = source;
     Simplified  = new Grammar();
     FillTableEmpty();
     EliminarProducoesVazio();
     FillClosures();
     EliminarProducoesUnitarias();
     FillVariablesAcessibleTerminals();
     FillAcessibles(GrammarNoUnitarianProductions);
     GenerateSimplified();
     if (VariablesEmpty.Contains(Simplified.VariableStart))
     {
         Simplified.AddRule(Simplified.VariableStart.Id, Symbol.EmptyTerminal);
     }
 }
 public Simplification(Grammar source)
 {
     this.Source = source;
     Simplified = new Grammar();
     FillTableEmpty();
     EliminarProducoesVazio();
     FillClosures();
     EliminarProducoesUnitarias();
     FillVariablesAcessibleTerminals();
     FillAcessibles(GrammarNoUnitarianProductions);
     GenerateSimplified();
     if (VariablesEmpty.Contains(Simplified.VariableStart))
     {
         Simplified.AddRule(Simplified.VariableStart.Id, Symbol.EmptyTerminal);
     }
 }
Esempio n. 7
0
        private void FillNewsNames()
        {
            NewNames = new Dictionary <Symbol, Symbol>();

            SymbolList visitados = new SymbolList();

            Queue <Symbol> variaveisAVisitar = new Queue <Symbol>();

            variaveisAVisitar.Enqueue(simplified.VariableStart);

            int i = 1;

            NewNames.Add(simplified.VariableStart, new Symbol(GetNewId(), string.Format("A{0:000}", i), false));
            visitados.Add(simplified.VariableStart);
            while (variaveisAVisitar.Count > 0)
            {
                var variavelAtual = variaveisAVisitar.Dequeue();

                List <RuleProduction> regrasAtuais = simplified.GetRules(variavelAtual);

                foreach (var item in regrasAtuais)
                {
                    foreach (var itemDestino in item.Destiny)
                    {
                        if (!itemDestino.Terminal && !visitados.Contains(itemDestino))
                        {
                            variaveisAVisitar.Enqueue(itemDestino);
                            i++;
                            NewNames.Add(itemDestino, new Symbol(GetNewId(), string.Format("A{0:000}", i), false));
                            visitados.Add(itemDestino);
                        }
                    }
                }
            }

            Normalized = new Grammar();
            Normalized.VariableStart = simplified.VariableStart;
            Normalized.Variables.AddRange(simplified.Variables);
            Normalized.Terminals.AddRange(simplified.Terminals);
            Normalized.VariablesEmpty = simplified.VariablesEmpty;
            for (i = 0; i < simplified.Rules.Count; i++)
            {
                Normalized.AddRule(simplified.Rules[i].Source, simplified.Rules[i].Destiny.Copy());
            }
        }
        private void FillNewsNames()
        {
            NewNames = new Dictionary<Symbol, Symbol>();

            SymbolList visitados = new SymbolList();

            Queue<Symbol> variaveisAVisitar = new Queue<Symbol>();

            variaveisAVisitar.Enqueue(simplified.VariableStart);

            int i = 1;
            NewNames.Add(simplified.VariableStart, new Symbol(GetNewId(), string.Format("A{0:000}", i), false));
            visitados.Add(simplified.VariableStart);
            while (variaveisAVisitar.Count > 0)
            {
                var variavelAtual = variaveisAVisitar.Dequeue();

                List<RuleProduction> regrasAtuais = simplified.GetRules(variavelAtual);

                foreach (var item in regrasAtuais)
                {
                    foreach (var itemDestino in item.Destiny)
                    {
                        if (!itemDestino.Terminal && !visitados.Contains(itemDestino))
                        {
                            variaveisAVisitar.Enqueue(itemDestino);
                            i++;
                            NewNames.Add(itemDestino, new Symbol(GetNewId(), string.Format("A{0:000}", i), false));
                            visitados.Add(itemDestino);
                        }
                    }
                }
            }

            Normalized = new Grammar();
            Normalized.VariableStart = simplified.VariableStart;
            Normalized.Variables.AddRange(simplified.Variables);
            Normalized.Terminals.AddRange(simplified.Terminals);
            Normalized.VariablesEmpty = simplified.VariablesEmpty;
            for (i = 0; i < simplified.Rules.Count; i++)
            {
                Normalized.AddRule(simplified.Rules[i].Source, simplified.Rules[i].Destiny.Copy());
            }
        }
        private CompilerFuzzy Compiler4()
        {
            //LR(1)
            //0. S
            //0 → S$
            //1. S → V = E
            //2. S → E
            //3. E → V
            //4. V → x
            //5. V → ∗E
            List<RecognitionToken> recs = new List<RecognitionToken>();
            var requal = new RecognitionToken(1, "equal", "=", "#7bf6b6", norm, conorm);
            var rast = new RecognitionToken(2, "ast", "*", "#f28686", norm, conorm);
            var rx = new RecognitionToken(3, "x", "x", "#fbdb65", norm, conorm);
            recs.Add(requal);
            recs.Add(rast);
            recs.Add(rx);

            Grammar grammar = new Grammar();
            var x = new Symbol(1, "x", true, 'x');
            x.SetCustomValue("RecToken", rx);

            var ast = new Symbol(2, "*", true, '*');
            ast.SetCustomValue("RecToken", rast);

            var equal = new Symbol(3, "=", true, '=');
            equal.SetCustomValue("RecToken", requal);

            var S = new Symbol(4, "S", false);
            var V = new Symbol(5, "V", false);
            var V1 = new Symbol(7, "V1", false);
            var E = new Symbol(6, "E", false);

            grammar.Terminals.AddRange(new SymbolList(x, ast, equal));

            grammar.Variables.AddRange(new SymbolList(S, V, E, V1));
            grammar.VariableStart = S;
            grammar.AddRule(S, V, equal, E);
            grammar.AddRule(S, E);
            grammar.AddRule(E, V);
            grammar.AddRule(E, V1).Pertinence = 0.8;
            var ruleV = grammar.AddRule(V, x);
            grammar.AddRule(V1, equal).Parent = ruleV;
            grammar.AddRule(V, ast, E);

            return new CompilerFuzzy(recs, grammar, null, null, norm, conorm);
        }
        public void EliminarProducoesVazio()
        {
            GrammarNoEmpty = new Grammar();

            GrammarNoEmpty.Terminals.AddRange(Source.Terminals);
            GrammarNoEmpty.Variables.AddRange(Source.Variables);
            for (int i = 0; i < Source.Rules.Count; i++)
            {
                RuleProduction regraAtual = Source.Rules[i];
                Symbol orig = regraAtual.Source;

                List<SymbolList> destinos = new List<SymbolList>();

                if (Source.Rules[i].Destiny.Count == 1 && Source.Rules[i].Destiny[0] == Symbol.EmptyTerminal)
                {
                    //Do Nothing
                }
                else
                {

                    if (regraAtual.Destiny.Count > 0)
                    {
                        destinos.Add(regraAtual.Destiny);
                        for (int j = 0; j < destinos.Count; j++)
                        {
                            for (int k = 0; k < VariablesEmpty.Count; k++)
                            {
                                if (destinos[j].Contains(VariablesEmpty[k]))
                                {
                                    var destino = regraAtual.Destiny;

                                    while (destino.Contains(VariablesEmpty[k]))
                                    {
                                        destino = destino.RemoveFirst(VariablesEmpty[k]);

                                        if (destinos.FirstOrDefault(list => list == destino) == null
                                                && !destino.IsEmpty())
                                        {
                                            destinos.Add(destino);
                                        }
                                    }
                                }
                            }
                        }
                    }

                    for (int j = 0; j < destinos.Count; j++)
                    {
                        var destino = destinos[j].Copy();
                        GrammarNoEmpty.AddRule(orig, destino);
                    }
                }
            }
        }
        private void EliminarProducoesUnitarias()
        {
            GrammarNoUnitarianProductions = new Grammar();
            GrammarNoUnitarianProductions.Terminals.AddRange(GrammarNoEmpty.Terminals);
            GrammarNoUnitarianProductions.Variables.AddRange(GrammarNoEmpty.Variables);
            for (int i = 0; i < GrammarNoEmpty.Rules.Count; i++)
            {
                RuleProduction rgAtual = GrammarNoEmpty.Rules[i];
                GrammarNoUnitarianProductions.AddRule(rgAtual.Source, rgAtual.Destiny.Copy());
            }
            bool trocou = true;
            while (trocou)
            {
                trocou = false;
                for (int i = GrammarNoUnitarianProductions.Rules.Count - 1; i >= 0; i--)
                {
                    RuleProduction rgAtual = GrammarNoUnitarianProductions.Rules[i];

                    if (rgAtual.IsUnityVariable())
                    {
                        var regras = GrammarNoUnitarianProductions.GetRules(rgAtual.FirstDestiny().Name);
                        foreach (var item in regras)
                        {
                            GrammarNoUnitarianProductions.AddRule(rgAtual.Source, item.Destiny.Copy());
                        }
                        trocou = true;
                        GrammarNoUnitarianProductions.Rules.Remove(rgAtual);
                    }
                }
            }
        }