コード例 #1
0
 /*-----------------------------------------------*/
 public void addtoken(token.Tipo tipo)
 {
     Out.AddLast(new token(tipo, auxL));
     ntokens++;
     auxL   = "";
     estado = 0;
 }
コード例 #2
0
 public void addErrortoken(token.Tipo tipo, String au)
 {
     Errores.AddLast(new token(tipo, au));
     auxL   = "";
     estado = 0;
 }
コード例 #3
0
        public LinkedList <token> escanear(String entrada)
        {
            nErrores = 0;

            entrada.ToLower();
            entrada    += "#";
            Out         = new LinkedList <token>();
            Errores     = new LinkedList <token>();
            expresiones = new LinkedList <expresion>();
            arboles     = new LinkedList <metodoArbol> ();
            nodo n;

            for (int i = 0; i < entrada.Length; i++)
            {
                c = entrada.ElementAt(i);

                switch (estado)
                {
                case 0:
                    auxL += entrada.ElementAt(i);
                    if (Char.IsLetter(c))
                    {
                        estado = 1;
                    }
                    else if (Char.IsDigit(c))
                    {
                        estado = 2;
                    }
                    else
                    {
                        switch (c)
                        {
                        case '{':
                            addtoken(token.Tipo.S_abrirLlaves);
                            break;

                        case '}':
                            addtoken(token.Tipo.S_cerrarLlaves);
                            break;

                        case ',':
                            addtoken(token.Tipo.S_coma);
                            break;

                        case ';':
                            esConjunto = false;
                            addtoken(token.Tipo.S_puntoComa);
                            break;

                        case '/':
                            estado = 3;
                            break;

                        case '%':
                            lexemas = true;
                            addtoken(token.Tipo.S_porcentaje);
                            break;

                        case ':':
                            addtoken(token.Tipo.S_dosPuntos);
                            break;

                        case '"':
                            //addtoken(token.Tipo.S_comillas);
                            estado = 4;
                            break;

                        case '<':
                            estado = 5;
                            break;

                        case '\\':
                            estado = 14;
                            break;

                        case '[':
                            estado = 15;
                            break;

                        case '-':
                            estado = 6;
                            break;

                        case '~':
                            addtoken(token.Tipo.conj);
                            break;

                        default:
                            if (EsSeparador(i, c, entrada.Length))
                            {
                                estado = 0;
                                auxL   = "";
                            }
                            else
                            {
                                Console.WriteLine("Caracter no reconcido" + c.ToString());
                                addErrortoken(token.Tipo.ERROR, c.ToString());
                                error  = true;
                                estado = 0;
                                nErrores++;
                            }
                            break;
                        }
                    }
                    break;

                case 1:

                    if (Char.IsLetter(c))
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 1;
                    }
                    else if (Char.IsDigit(c))
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 1;
                    }
                    else
                    {
                        if (entrada.ElementAt(i + 1).Equals(':') || entrada.ElementAt(i + 2).Equals(':'))
                        {
                            pyc = true;
                        }
                        token.Tipo tipoA = verificarPalabra();
                        addtoken(tipoA);
                        i--;
                    }

                    break;

                case 2:

                    if (Char.IsLetter(c))
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 1;
                    }
                    else if (Char.IsDigit(c))
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 2;
                    }
                    else
                    {
                        addtoken(token.Tipo.Numero);
                        i--;
                    }

                    break;

                case 3:
                    if (!(c == 10 || c == 13 || c == 11 || i == entrada.Length - 1))
                    {
                        auxL += entrada.ElementAt(i);
                    }
                    else
                    {
                        addtoken(token.Tipo.Comentario);
                        i--;
                    }
                    break;

                case 4:

                    if (!(c == '"'))
                    {
                        auxL += entrada.ElementAt(i);
                    }
                    else
                    {
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.Cadena);
                    }
                    break;

                case 5:
                    if (c == '!')
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 12;
                    }
                    else
                    {
                        if (EsSeparador(i, c, entrada.Length))
                        {
                            estado = 0;
                            auxL   = "";
                        }
                        else
                        {
                            Console.WriteLine("Caracter no reconcido" + c);
                            addErrortoken(token.Tipo.ERROR, c.ToString());
                            error  = true;
                            estado = 0;
                            nErrores++;
                        }
                    }
                    break;

                case 6:
                    if (c == '-')
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 6;
                    }
                    else if (c == '>')
                    {
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.flechita);
                        primUlt = 1;
                        estado  = 6;
                    }
                    else
                    {
                        if (esConjunto == true && lexemas == false)
                        {                                 //Def conjuntos
                            i--;
                            estado = 7;
                        }
                        else if (esConjunto == false && lexemas == true)
                        {                                 //Def Lexemas
                            i--;
                            estado = 8;
                        }
                        else
                        {                                  //Def expresiones
                            i--;
                            estado = 9;
                        }

                        break;
                    }
                    break;

                case 7:
                    if (Char.IsLetter(c))
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 7;
                    }
                    else if (Char.IsDigit(c))
                    {
                        auxL  += entrada.ElementAt(i);
                        estado = 7;
                    }
                    else
                    {
                        switch (c)
                        {
                        case ',':
                            auxL  += entrada.ElementAt(i);
                            estado = 7;
                            break;

                        case '~':
                            auxL  += entrada.ElementAt(i);
                            estado = 7;
                            break;

                        case ';':
                            addtoken(token.Tipo.conjunto);
                            auxL += entrada.ElementAt(i);
                            addtoken(token.Tipo.S_puntoComa);
                            esConjunto = false;
                            primUlt    = 1;
                            estado     = 0;
                            break;

                        default:
                            if (EsSeparador(i, c, entrada.Length))
                            {
                                estado = 7;
                                auxL   = "";
                            }
                            else
                            {
                                Console.WriteLine("Caracter no reconcido" + c);
                                addErrortoken(token.Tipo.ERROR, c.ToString());
                                error  = true;
                                estado = 0;
                                nErrores++;
                            }
                            break;
                        }
                    }
                    break;

                case 8:
                    if ((c == '"'))
                    {
                        estado = 13;
                    }
                    else
                    {
                        if (EsSeparador(i, c, entrada.Length))
                        {
                            estado = 8;
                            auxL   = "";
                        }
                        else
                        {
                            Console.WriteLine("Caracter no reconcido" + c);
                            addErrortoken(token.Tipo.ERROR, c.ToString());
                            error  = true;
                            estado = 0;
                            nErrores++;
                        }
                    }
                    break;

                case 9:

                    switch (c)
                    {
                    case '.':
                        auxL += entrada.ElementAt(i);
                        n     = new nodo(auxL, false, false, false);
                        expresiones.Last().getLista().AddLast(n);

                        addtoken(token.Tipo.concatenar);

                        estado = 9;
                        break;

                    case '*':
                        auxL += entrada.ElementAt(i);
                        n     = new nodo(auxL, false, true, true);
                        expresiones.Last().getLista().AddLast(n);

                        addtoken(token.Tipo.ceroMas);
                        estado = 9;
                        break;

                    case '+':
                        auxL += entrada.ElementAt(i);
                        n     = new nodo(auxL, false, true, false);
                        expresiones.Last().getLista().AddLast(n);

                        addtoken(token.Tipo.unoMas);
                        estado = 9;
                        break;

                    case '|':
                        auxL += entrada.ElementAt(i);
                        n     = new nodo(auxL, false, false, false);
                        expresiones.Last().getLista().AddLast(n);

                        addtoken(token.Tipo.disyun);

                        estado = 9;
                        break;

                    case '?':
                        auxL += entrada.ElementAt(i);
                        n     = new nodo(auxL, false, true, true);
                        expresiones.Last().getLista().AddLast(n);

                        addtoken(token.Tipo.ceroUno);
                        estado = 9;
                        break;

                    case '{':
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.S_abrirLlaves);
                        estado = 11;
                        break;

                    case '}':
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.S_cerrarLlaves);
                        estado = 11;
                        break;

                    case '"':

                        estado = 10;
                        break;

                    case ';':
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.S_puntoComa);
                        estado = 0;
                        break;

                    default:
                        if (EsSeparador(i, c, entrada.Length))
                        {
                            estado = 9;
                            auxL   = "";
                        }
                        else
                        {
                            auxL += entrada.ElementAt(i);
                            Console.WriteLine("Caracter no reconcido" + c);
                            addErrortoken(token.Tipo.ERROR, c.ToString());
                            error  = true;
                            estado = 0;
                            nErrores++;
                        }
                        break;
                    }
                    break;

                case 10:
                    if (!(c == '"'))
                    {
                        auxL += entrada.ElementAt(i);
                    }
                    else
                    {
                        n = new nodo(auxL, true, false, false);
                        String t = "";
                        t += primUlt;
                        primUlt++;
                        n.setPrimeros(t);
                        n.setUltimos(t);
                        expresiones.Last().getLista().AddLast(n);
                        addtoken(token.Tipo.Terminal);
                        estado = 9;
                    }
                    break;

                case 11:
                    if (!(c == '}'))
                    {
                        auxL += entrada.ElementAt(i);
                    }
                    else
                    {
                        n = new nodo(auxL, true, false, false);
                        String t = "";
                        t += primUlt;
                        primUlt++;
                        n.setPrimeros(t);
                        n.setUltimos(t);
                        expresiones.Last().getLista().AddLast(n);
                        addtoken(token.Tipo.Terminal);
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.S_cerrarLlaves);
                        estado = 9;
                    }
                    break;

                case 12:
                    if (!(c == '!'))
                    {
                        auxL += entrada.ElementAt(i);
                    }
                    else if (i == entrada.Length)
                    {
                        break;
                    }
                    else
                    {
                        auxL += entrada.ElementAt(i);
                        auxL += entrada.ElementAt(i + 1);
                        addtoken(token.Tipo.Comentario);
                        i += 2;
                    }
                    break;

                case 13:
                    if (!(c == '"'))
                    {
                        auxL += entrada.ElementAt(i);
                    }
                    else
                    {
                        addtoken(token.Tipo.lexema);
                        estado = 0;
                    }
                    break;

                case 14:
                    if (c == 'n')
                    {
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.saltolinea);
                        estado = 0;
                    }
                    else
                    if (c == '\'')
                    {
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.comillasimple);
                        estado = 0;
                    }
                    else
                    if (c == '\"')
                    {
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.comilladoble);
                        estado = 0;
                    }
                    else
                    if (c == '\t')
                    {
                        auxL += entrada.ElementAt(i);
                        addtoken(token.Tipo.tabulacion);
                        estado = 0;
                    }
                    else
                    {
                        addtoken(token.Tipo.ERROR);
                        estado = 0;
                    }
                    break;

                case 15:
                    if (!(c == ':' && entrada.ElementAt(i + 1).Equals(']')))
                    {
                        auxL += entrada.ElementAt(i);
                    }
                    else if (c == ':')
                    {
                        auxL = "";
                    }

                    else
                    {
                        addtoken(token.Tipo.todo);
                        estado = 0;
                    }
                    break;

                default:
                    break;
                }

                /* public void imprimir() {
                 * System.out.print(entrada);
                 * }*/
            }

            return(Out);
        }