예제 #1
0
        public void crearTransiciones(SubAFN afn, Stack <object[]> simbolos)
        {
            EstadoAFD nuevo = new EstadoAFD(0);

            nuevo.setCerradura(0);
            estados.Add(nuevo);
            for (int e = 0; e < estados.Count; e++)
            {
                for (int i = 0; i < estados[e].getCerraduras().Count; i++)
                {
                    Estado est = afn.getEstado(estados[e].getCerradura(i)); //entra al estado que indica la cerradura
                    if (estados[e].getCerradura(i) == afn.getFinal().getId())
                    {
                        estados[e].setAcepta();
                    }
                    foreach (TransicionThompson t in est.getTransiciones())
                    {
                        if (t.getLexema().Equals("ε") && !estados[e].encontrarC(t.getFinal().getId()))
                        {
                            estados[e].setCerradura(t.getFinal().getId());
                            if (t.getFinal().getId().Equals(afn.getFinal().getId()))
                            {
                                estados[e].setAcepta();
                            }
                        }
                        else if (!t.getLexema().Equals("ε"))
                        {
                            int m = encontrarMovimiento(t.getLexema(), estados[e]);
                            if (m == estados[e].getMovimiento().Count) //si el mover con dicho simbolo no existe
                            {
                                Movimiento mov = new Movimiento(t.getLexema(), encontrarSimbolo(simbolos, t.getLexema()));
                                mov.getMov().setCerradura(t.getFinal().getId());
                                mov.setMove(t.getFinal().getId());
                                estados[e].setMovimiento(mov);
                            }
                            else // si ya existe, se agrega a que otro estado se puede mover con la misma letra
                            {
                                estados[e].getMov(m).getMov().setCerradura(t.getFinal().getId());
                                estados[e].getMov(m).setMove(t.getFinal().getId());
                                estados[e].getMov(m).getMov().getCerraduras().Sort();
                            }
                        }
                    }
                }
                estados[e].getCerraduras().Sort();
                int edo = encontrarEstado(estados[e].getCerraduras(), e);
                if (edo != e)
                {
                    estados.RemoveAt(e);
                    e--;
                }
                else
                {
                    for (int t = 0; t < estados[e].getMovimiento().Count; t++)
                    {
                        int m = encontrarMovEstado(estados[e].getMov(t).getMoves(), e);
                        if (m != -1)
                        {
                            estados[e].getMov(t).getMov().setId(m);
                        }
                        else
                        {
                            EstadoAFD n = estados[e].getMov(t).getMov();
                            n.setId(estados.Count);
                            estados.Add(n);
                        }
                    }
                }
            }
        }
예제 #2
0
파일: Ejecutar.cs 프로젝트: XiomRB/OLC1_PY1
        public string validarLexema(CadenaAValidar cadena)
        {
            ExpresionRegular exp    = buscarExp(cadena.getId());
            string           valida = "Cadena Valida";
            int    estado           = 0;
            int    edoant           = 0;
            string tok = "";
            char   c;
            string aux;
            string cad = cadena.getCadena() + "¿";

            for (int i = 0; i < cad.Length; i++)
            {
                c = cad.ElementAt(i);
                int j = 0;
                if (c == '¿' && i == cad.Length - 1)
                {
                    if (exp.afd.getEstado(estado).isAceptable())
                    {
                        cadena.tokens.Add(new Token(0, i, tok, Token.TIPO.CADENA));
                    }
                    else
                    {
                        cadena.errores.Add(new Token(0, i, tok, Token.TIPO.DESCONOCIDO));
                    }
                    tok = "";
                    if (i < cad.Length - 1 && estado != 0)
                    {
                        i--;
                    }
                    estado = 0;
                }
                else
                {
                    bool val = false;
                    while (j < exp.afd.getEstado(estado).getMovimiento().Count)
                    {
                        Movimiento mov = exp.afd.getEstado(estado).getMov(j);
                        if (mov.getTipo() == Token.TIPO.TODO)
                        {
                            if (cad.Length >= mov.getId().Length)
                            {
                                int tam = cad.Length - i + 1;
                                if (tam >= mov.getId().Length)
                                {
                                    aux = cad.Substring(i, mov.getId().Length);
                                    if (aux.Equals(mov.getId()))
                                    {
                                        edoant = estado;
                                        estado = mov.getMov().getId();
                                        i     += mov.getId().Length - 1;
                                        tok   += aux;
                                        val    = true;
                                        break;
                                    }
                                }
                            }
                        }
                        else if (mov.getTipo() == Token.TIPO.CONJ)
                        {
                            if (mov.getId().Length == 1)
                            {
                                if (c.ToString() == mov.getId())
                                {
                                    edoant = estado;
                                    estado = mov.getMov().getId();
                                    tok   += c;
                                    val    = true;
                                    break;
                                }
                            }
                            else if (mov.getId().Length == 2)
                            {
                                bool encontrado = false;
                                if (mov.getId().Equals("\\n"))
                                {
                                    if (c == '\n')
                                    {
                                        encontrado = true;
                                    }
                                    else if (mov.getId().Equals("\\t"))
                                    {
                                        if (c == '\t')
                                        {
                                            encontrado = true;
                                        }
                                        else if (mov.getId().Equals("\\\'"))
                                        {
                                            if (c == '\'')
                                            {
                                                encontrado = true;
                                            }
                                            else if (mov.getId().Equals("\\\""))
                                            {
                                                if (c == '"')
                                                {
                                                    encontrado = true;
                                                }
                                            }
                                        }
                                    }
                                }
                                if (encontrado)
                                {
                                    tok   += c;
                                    val    = true;
                                    edoant = estado;
                                    estado = mov.getMov().getId();
                                    break;
                                }
                            }
                            else if (mov.getId().ElementAt(1) == '~')
                            {
                                if (c >= mov.getId().ElementAt(0) && c <= mov.getId().ElementAt(2))
                                {
                                    edoant = estado;
                                    val    = true;
                                    tok   += c;
                                    estado = mov.getMov().getId();
                                    break;
                                }
                            }
                            else if (mov.getId().ElementAt(1) == ',')
                            {
                                int z = 0;
                                while (z < mov.getId().Length)
                                {
                                    if (c == mov.getId().ElementAt(z))
                                    {
                                        edoant = estado;
                                        tok   += c;
                                        val    = true;
                                        estado = mov.getMov().getId();
                                        break;
                                    }
                                    z += 2;
                                }
                                if (z < mov.getId().Length)
                                {
                                    break;
                                }
                            }
                        }
                        else if (mov.getTipo() == Token.TIPO.CADENA)
                        {
                            if (c.ToString() == mov.getId())
                            {
                                tok   += c;
                                edoant = estado;
                                val    = true;
                                estado = mov.getMov().getId();
                                break;
                            }
                        }
                        else if (mov.getTipo() == Token.TIPO.APOSTROFE)
                        {
                            if (c == '\'')
                            {
                                tok   += c;
                                val    = true;
                                edoant = estado;
                                estado = mov.getMov().getId();
                                break;
                            }
                        }
                        else if (mov.getTipo() == Token.TIPO.COMILLA)
                        {
                            if (c == '"')
                            {
                                tok   += c;
                                edoant = estado;
                                val    = true;
                                estado = mov.getMov().getId();
                                break;
                            }
                        }
                        else if (mov.getTipo() == Token.TIPO.ENTER)
                        {
                            if (c == '\n')
                            {
                                tok   += c;
                                edoant = estado;
                                val    = true;
                                estado = mov.getMov().getId();
                                break;
                            }
                        }
                        else if (mov.getTipo() == Token.TIPO.TAB)
                        {
                            if (c == '\t')
                            {
                                tok   += c;
                                val    = true;
                                edoant = estado;
                                estado = mov.getMov().getId();
                                break;
                            }
                        }
                        j++;
                    }
                    if (j >= exp.afd.getEstado(edoant).getMovimiento().Count || !val)
                    {
                        if (exp.afd.getEstado(estado).isAceptable())
                        {
                            cadena.tokens.Add(new Token(0, i, tok, Token.TIPO.CADENA));
                        }
                        else
                        {
                            if (tok.Equals(""))
                            {
                                tok = c.ToString();
                            }
                            cadena.errores.Add(new Token(0, i, tok, Token.TIPO.DESCONOCIDO));
                        }
                        tok = "";
                        if (i < cad.Length - 1 && estado != 0)
                        {
                            i--;
                        }
                        estado = 0;
                    }
                }
            }
            if (cadena.errores.Count != 0)
            {
                valida = "Cadena No Valida";
            }
            return(valida);
        }
예제 #3
0
 public void setMovimiento(Movimiento mov)
 {
     movimientos.Add(mov);
 }