예제 #1
0
파일: Ejecutar.cs 프로젝트: XiomRB/OLC1_PY1
        public ExpresionRegular buscarExp(string id)
        {
            int i = 0;

            while (i < expresiones.Count)
            {
                ExpresionRegular exp = (ExpresionRegular)expresiones[i];
                if (exp.getId().Equals(id))
                {
                    return(exp);
                }
                i++;
            }
            return(null);
        }
예제 #2
0
        public void analizar(RichTextBox texto, ArrayList conjuntos, ArrayList expresiones, ArrayList cadenas)
        {
            Token     token;
            ArrayList tokens = this.lexico.analizar(texto);

            for (i = 0; i < tokens.Count; i++)
            {
                token = (Token)tokens[i];
                if (token.getTipo() == Token.TIPO.IDENTIFICADOR)
                {
                    Token tokensig = (Token)tokens[i + 1];
                    switch (tokensig.getTipo())
                    {
                    case Token.TIPO.FLECHA:
                        tokensig = (Token)tokens[i + 2];
                        if (tokensig.getTipo() == Token.TIPO.CONJ)
                        {
                            conjuntos.Add(new Conjunto(token.getLexema(), tokensig.getLexema()));
                            i += 2;
                        }
                        else
                        {
                            i += 2;
                            Stack <Object []> lista = new Stack <Object[]>();
                            while (tokensig.getTipo() != Token.TIPO.PUNTOCOMA)
                            {
                                switch (tokensig.getTipo())
                                {
                                case Token.TIPO.CERRADURAKLEENE:
                                case Token.TIPO.CERRADURAPOSITIVA:
                                case Token.TIPO.CONCATENACION:
                                case Token.TIPO.OR:
                                case Token.TIPO.INTERROGACION:
                                case Token.TIPO.ENTER:
                                case Token.TIPO.TAB:
                                case Token.TIPO.COMILLA:
                                case Token.TIPO.APOSTROFE:
                                    lista.Push(new object[2] {
                                        tokensig.getLexema(), tokensig.getTipo()
                                    });
                                    break;

                                case Token.TIPO.TODO:
                                    int l = tokensig.getLexema().Length;
                                    lista.Push(new object[2] {
                                        tokensig.getLexema().Substring(2, l - 4), tokensig.getTipo()
                                    });
                                    break;

                                case Token.TIPO.CADENA:
                                    int m = tokensig.getLexema().Length;
                                    lista.Push(new object[2] {
                                        tokensig.getLexema().Substring(1, m - 2), tokensig.getTipo()
                                    });
                                    break;

                                case Token.TIPO.LLAVEABRE:
                                    tokensig = (Token)tokens[i + 1];
                                    if (tokensig.getTipo() == Token.TIPO.IDENTIFICADOR)
                                    {
                                        Conjunto conj;
                                        int      c = 0;
                                        while (c < conjuntos.Count)
                                        {
                                            conj = (Conjunto)conjuntos[c];
                                            if (tokensig.getLexema().Equals(conj.nombre))
                                            {
                                                lista.Push(new object[2] {
                                                    conj.conjunto, Token.TIPO.CONJ
                                                });
                                                break;
                                            }
                                            c++;
                                        }
                                    }
                                    i += 2;
                                    break;
                                }
                                i++;
                                tokensig = (Token)tokens[i];
                            }
                            ExpresionRegular exp = new ExpresionRegular(token.getLexema());
                            exp.setAFN(p.crearAFN(lista, exp.simbolos));
                            expresiones.Add(exp);
                        }

                        break;

                    case Token.TIPO.DOSPUNTOS:
                        tokensig = (Token)tokens[i + 2];
                        if (tokensig.getTipo() == Token.TIPO.CADENA)
                        {
                            string cad = tokensig.getLexema();
                            cadenas.Add(new CadenaAValidar(token.getLexema(), cad.Substring(1, cad.Length - 2)));
                            i += 2;
                        }
                        break;
                    }
                }
            }
        }
예제 #3
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);
        }