Beispiel #1
0
        static bool VerificaPalavra(string palavra, AFN afn)
        {
            var estadosAux = new List <Estado>();

            /* Adicionamos o estado inicial na lista de estados
             * auxiliar para começar a verificação */
            estadosAux.Add(afn.EstadoInicial);

            foreach (char simbolo in palavra)
            {
                /* Buscamos os estados que possuem transição com o
                 * simbolo 'simbolo' partindo da lista de estados 'estadosAux' */
                estadosAux = Movimento(estadosAux, simbolo);

                /* Se a lista de estados for
                 * vazia a resposta será negativa */
                if (!estadosAux.Any())
                {
                    return(false);
                }
            }

            var resultado = false;

            var estadosFinais = afn.EstadosFinais;

            foreach (var estado in estadosAux)
            {
                /* Verificamos se o estado está na lista de estados finais
                 * Caso esteja, resultado = true */
                resultado = resultado || estadosFinais.Any(x => x.Nome == estado.Nome);
            }

            return(resultado);
        }
Beispiel #2
0
        /* Instanciando o autômato na mão */
        static void Exemplo1()
        {
            var no1 = new Estado("1", false);
            var no2 = new Estado("2", false);
            var no3 = new Estado("3", false);
            var no4 = new Estado("4", false);
            var no5 = new Estado("5", true);

            var listaEstados = new List <Estado> {
                no1, no2, no3, no4, no5
            };

            /* Arestas do No1 */
            var aresta1 = new Aresta('a', no2);

            no1.Arestas.Add(aresta1);

            /* Arestas do No1 */
            var aresta2 = new Aresta('b', no1);
            var aresta3 = new Aresta('a', no3);
            var aresta4 = new Aresta('a', no4);

            no2.Arestas.Add(aresta2);
            no2.Arestas.Add(aresta3);
            no2.Arestas.Add(aresta4);

            /* Arestas do No3 */
            var aresta5 = new Aresta('b', no4);

            no3.Arestas.Add(aresta5);

            /* Arestas do No4 */
            var aresta6 = new Aresta('a', no5);

            no4.Arestas.Add(aresta6);

            var simbolosAceitos = new List <char> {
                'a', 'b'
            };

            var afn = new AFN(listaEstados, no1, simbolosAceitos);

            /* Função Pe */
            var resultado1 = VerificaPalavra("aab", afn);

            Console.WriteLine($"Palavra: aab -> {(resultado1 ? "ACEITA" : "NÃO ACEITA")}");

            var resultado2 = VerificaPalavra("baaa", afn);

            Console.WriteLine($"Palavra: baaa -> {(resultado2 ? "ACEITA" : "NÃO ACEITA")}");

            var resultado3 = VerificaPalavra("aaa", afn);

            Console.WriteLine($"Palavra: aaa -> {(resultado3 ? "ACEITA" : "NÃO ACEITA")}");

            var resultado4 = VerificaPalavra("abababaaa", afn);

            Console.WriteLine($"Palavra: abababaaa -> {(resultado4 ? "ACEITA" : "NÃO ACEITA")}");
        }
Beispiel #3
0
        static void Main(string[] args)
        {
            String afnTeste = "AB*";

            AFN afn = new AFN(afnTeste);

            Console.WriteLine("AFN Estado gerados algoritmo de Thompson da expressão: " + afnTeste);
            Console.WriteLine("Estado inicial: " + afn.getEstadoIni().getNomeEstado());
            Console.WriteLine("Estado final: " + afn.getEstadoFim().getNomeEstado() + "\n");
            estados = afn.getEstado();
            for (int i = 0; i < estados.Count; i++)
            {
                List <iTransicao> t = estados[i].getTransicoes();
                Console.WriteLine(estados[i].getNomeEstado());

                for (int x = 0; x < t.Count; x++)
                {
                    Console.WriteLine("Objeto Transito: \n\t\t>>Pai " + t[x].getPai().getNomeEstado());
                    Console.WriteLine("\t\t>>" + t[x].getNomeTransicao());
                    Console.WriteLine("\t\t>><Próx>" + t[x].getProxEstado().getNomeEstado());
                }
            }
            Console.ReadKey();
        }
        public virtual string ReadMsg()
        {
            string msg = "";

            if (RawDataChar == null)
            {
                return("无数据");
            }

            if (RawDataChar.Length >= 14)
            {
                if (RawDataChar[0] == BaseProtocol.BeginChar && RawDataChar[RawDataChar.Length - 1] == BaseProtocol.EndChar)
                {
                    Length = (int)RawDataChar[1];
                    byte[] Body_b = new byte[Length];
                    byte   bState = RawDataChar[2];

                    IsPW = bState % 2 > 0;
                    IsTP = bState % 4 > 2;

                    Array.Copy(RawDataChar, 3, Body_b, 0, Body_b.Length);
                    CC  = RawDataChar[RawDataChar.Length - 2];
                    AFN = RawDataChar[14];
                    byte   CCN = FormatHelper.GetXorByte(Body_b, 0, Body_b.Length);
                    string s   = "CCN = " + CCN + "  Length =  " + Length + " body_b .length is " + Body_b.Length;
                    //update by kqz 2017-10:40 解决文件下发问题
                    if ((AFN == (byte)BaseProtocol.AFN.ToDtuSendFile) || (CCN == CC))
                    {
                        ControlField = RawDataChar[3];
                        //if (ControlField == (byte)BaseProtocol.ControlField.FromDtu)
                        if (Enum.IsDefined(typeof(BaseProtocol.ControlField), (int)ControlField))
                        {
                            StationType = RawDataChar[11];
                            StationCode = Convert.ToInt32(HexStringUtility.ByteArrayToHexString(new byte[] { RawDataChar[12], RawDataChar[13] }), 16);
                            AFN         = RawDataChar[14];
                            if (Enum.IsDefined(typeof(BaseProtocol.AFN), (int)AFN))
                            {
                                byte[] AddressField_b = new byte[7];
                                Array.Copy(RawDataChar, 4, AddressField_b, 0, 7);
                                AddressField = HexStringUtility.ByteArrayToHexString(AddressField_b);

                                //用户数据长度为长度减控制域1字节减地址域7字节减应用层功能码1字节减设备类型1字节减射频地址2字节减密码减时间戳
                                UserDataBytes = new byte[Length - 1 - 7 - 1 - 1 - 2 - (IsTP ? 2 : 0) - (IsPW ? 5 : 0)];
                                Array.Copy(RawDataChar, 15, UserDataBytes, 0, UserDataBytes.Length);
                                UserData = HexStringUtility.ByteArrayToHexString(UserDataBytes);

                                try
                                {
                                    if (IsTP)
                                    {
                                        byte[] TPBytes = new byte[5];
                                        Array.Copy(RawDataChar, RawDataChar.Length - 2 - 5, TPBytes, 0, TPBytes.Length);
                                        TP = HexStringUtility.ByteArrayToHexString(TPBytes);
                                    }
                                    if (IsPW)
                                    {
                                        byte[] PWBytes = new byte[2];
                                        Array.Copy(RawDataChar, RawDataChar.Length - 2 - 2 - (IsTP ? 5 : 0), PWBytes, 0, PWBytes.Length);
                                        PW = HexStringUtility.ByteArrayToHexString(PWBytes);
                                    }
                                }
                                catch
                                {
                                    msg = "密码时间戳格式不正确,IsPW:" + (IsPW ? "yes" : "no") + ",IsTP:" + (IsTP ? "yes" : "no");
                                }
                            }
                            else
                            {
                                msg = "功能码不对," + AFN.ToString("X");
                            }
                        }
                        else
                        {
                            msg = "控制域不对," + ControlField.ToString("X");
                        }
                    }
                    else
                    {
                        msg = s + "   校验码不对," + CC;
                    }
                }
                else
                {
                    msg = "开始结束字符不对," + RawDataChar[0].ToString("X") + " " + RawDataChar[RawDataChar.Length - 1].ToString("X");
                }
            }
            else
            {
                msg = "长度不足14," + RawDataChar.Length;
            }

            return(msg);
        }
Beispiel #5
0
        /* Lendo de um arquivo JSON */
        static void Exemplo2()
        {
            /* Realizamos a leitura do JSON e carregamos no objeto afnLeitura utilizando a classe AFNLeitura */
            var arquivoText = File.ReadAllText(@"C:/Users/Vinicius/Downloads/Teste.json");
            var afnLeitura  = JsonConvert.DeserializeObject <AFNLeitura>(arquivoText);

            /* Criamos os estados */
            var estados = afnLeitura.Estados.Select(x => new Estado(x, false)).ToList();

            /* Atualizamos os estados que são estados finais */
            foreach (var noFinailAux in afnLeitura.EstadosFinais)
            {
                var estadoAux = estados.Find(x => x.Nome == noFinailAux);
                estadoAux.NoFinal = true;
            }

            var arestas = new List <Aresta>();

            /* Preenchemos a lista de arestas */
            foreach (var arestaAux in afnLeitura.FuncaoPrograma)
            {
                var noOrigem  = estados.Find(x => x.Nome == arestaAux.Origem);
                var noDestino = estados.Find(x => x.Nome == arestaAux.Destino);
                var simbolo   = arestaAux.Simbolo;

                var arestaInserir = new Aresta(simbolo, noDestino);

                noOrigem.Arestas.Add(arestaInserir);
            }

            /* Buscamos o nó inicial a partir da lista de estados */
            var noInicial = estados.Find(x => x.Nome == afnLeitura.EstadoInicial);

            /* Instanciamos o AFN */
            var afn = new AFN(estados, noInicial, afnLeitura.Simbolos);

            var keepRunning = true;

            if (afn.IsValid)
            {
                Console.WriteLine("AFN: " + afnLeitura.ToString());

                var input = string.Empty;

                while (keepRunning)
                {
                    Console.WriteLine("Digite a palavra que deseja testar (Para sair, digite -1): ");
                    input = Console.ReadLine();

                    if (input.Contains("-1"))
                    {
                        keepRunning = false;
                    }
                    else
                    {
                        /* Função Pe */
                        var resultado = VerificaPalavra(input, afn);
                        Console.WriteLine($"Palavra: {input} -> {(resultado ? "ACEITA" : "NÃO ACEITA")}");
                    }
                }

                Console.WriteLine("Finalizando programa :)");
            }
            else
            {
                Console.WriteLine("O AFN inserido não é válido!");
            }
        }
        public void Insert(String name, ArrayList ar, String path)
        {
            ArrayList vuelta = new ArrayList(); // array que va a almacenar los elementos en orden inverso

            for (int i = ar.Count - 1; i >= 0; i--)
            {
                vuelta.Add(ar[i]);
                NodeController.getInstancia().InsertStack(ar[i].ToString());
            }
            String ast = "";

            foreach (var item in vuelta)
            {
                ast = ast + " " + item;
            }

            Console.WriteLine(ast);

            RegularExpression re = new RegularExpression(name, vuelta);

            arrayListER.Add(re);
            NodeController.getInstancia().Print(name, path);



            //Convierte la expresion regular de prefija a pos
            ArrayList regularExpresion = NodeController.getInstancia().ConvertExpression(NodeController.getInstancia().getRoot());
            ArrayList regex            = new ArrayList();


            try
            {
                regex = RegexController.Instance.infixToPostfix(regularExpresion);
            }
            catch (Exception a)
            {
                Console.WriteLine("Expresión mal ingresada");
            }

            string st = "";

            foreach (var item in regularExpresion)
            {
                st = st + item;
            }

            Console.WriteLine(name + "->" + st);

            //CONSTRUYE EL AUTOMATA ANF
            AFN aFN = new AFN();

            aFN.construirAutomata(regex);
            Automata.Automata afn_result = aFN.Afn;
            ThompsonControlador.Instance.generarDOT("AFN", name, afn_result);
            InsertAutomataAFNName("AFN " + name);
            //CONSTRUYE EL AUTOMATA AFD
            AFD AFD = new AFD();

            AFD.conversionAFN(afn_result);
            Automata.Automata afd_result = AFD.Afd;

            //CONSTRUYE EL AUTOMATA SIN ESTADO STRAMPA
            Automata.Automata afd_trampa = AFD.RemoveCheatStates(afd_result);
            ThompsonControlador.Instance.generarDOT("AFD", name, afd_trampa);
            InsertAutomataAFDName("AFD " + name);



            //CONSTRUYE LA TABLA
            ThompsonControlador.Instance.TableConstructor(name, path, afd_trampa);
            InsertTablaName(name + "Table");
            //ENVIA EL AUTOMATA A SER GUARDADO PARA POSTERIOR EVALUACION
            EvaluatorController.Instance.Insert(name, afd_trampa);


            NodeController.getInstancia().clearList();
        }
Beispiel #7
0
 private Transiciones transiciones;            //Contendra las transiciones de para el AFD
 public Thompson(List <Token> er, string nameEr)
 {
     this.er     = er;
     this.nameEr = nameEr;
     raiz        = create();
 }