Esempio n. 1
0
        public WordsCollection Analiza()
        {
            WordsCollection currentSymbol = new WordsCollection(); //Simbolo Actual obtenido del
            int             x             = 0;                     //Fila
            int             y             = 0;                     //Columna
            int             r             = 0;                     //Resultado (regla, desplazamiento o aceptacion)
            Estado          fila          = new Estado(0);

            int  pops      = 0;     //Cantidad de elementos que produce la regla
            bool error     = false; //Bandera que detiene el ciclo
            bool newSymbol = true;  //Decide si se necesita un nuevo simbolo del Lexico o no

            //Inicializa cola
            ColaSintactica.Push(new Estado(0));
            Node Root = new Node();

            //Ciclo que ejecuta el analisis sintactico
            while (!error)
            {
                if (newSymbol)
                {
                    currentSymbol = ALexico.sigSimbolo();
                }
                //x = (int)pila.Peek();
                x = ((Estado)pila.Peek()).transicion;
                y = currentSymbol.TypeId;

                r = TablaLR[x, y];
                Node nodo = new Node();
                nodo = null;

                if (r > 0)
                {
                    //Desplazamiento
                    //pila.Push(currentSymbol);
                    pila.Push(new Terminal(currentSymbol.Word));
                    //pila.Push(r);
                    pila.Push(new Estado(r));
                    newSymbol = true;
                }
                else if (r < 0)
                {
                    //Regla
                    r = Math.Abs(r) - 1;
                    if (r == 0)
                    {
                        //Cadena Aceptada
                        break;
                    }
                    // Obtencion de la cantidad de POPs a realizar en la cola.

                    switch (r)
                    {
                    //case 1:  //<programa> ::= <Definiciones>
                    //nodo=new  programa(pila);
                    //			break;

                    case 3:                          //<Definiciones> ::= <Definicion> <Definiciones>
                    case 16:                         //<DefLocales> ::= <DefLocal> <DefLocales>
                    case 20:                         //<Sentencias> ::= <Sentencia> <Sentencias>
                    case 32:                         //<Argumentos> ::= <Expresion> <ListaArgumentos>
                        pila.Pop();                  //quita estado
                        Node aux = (Node)pila.Pop(); //quita <definiciones>
                        pila.Pop();                  //quita estado
                        nodo = (Node)pila.Pop();     //quita <definicion>
                        if (nodo != null)
                        {
                            nodo.Siguiente = aux;
                        }
                        break;

                    case 1:
                    case 4:                      //<Definicion> ::= <DefVar>
                    case 5:                      //<Definicion> ::= <DefFunc>
                    case 17:                     //<DefLocal> ::= <DefVar>
                    case 18:                     //<DefLocal> ::= <Sentencia>
                    case 35:                     //<Atomo> ::= <LlamadaFunc>
                    case 39:                     //<SentenciaBloque> ::= <Sentencia>
                    case 40:                     //<SentenciaBloque> ::= <Bloque>
                    case 50:                     //<Expresion> ::= <Atomo>
                        pila.Pop();              //quita estado
                        nodo = (Node)pila.Pop(); //quita defvar
                        break;

                    case 6:    // <DefVar> ::= tipo id <ListaVar> ;
                        nodo = new DefVar(ref pila);

                        break;

                    case 8:                                                                      //<ListaVar> ::= , id <ListaVar>
                        pila.Pop();                                                              //quita estado
                        Node lvar = ((Node)pila.Pop());
                        pila.Pop();                                                              //quita estado
                        nodo           = new Identificador(((Terminal)pila.Pop()).nodo.Simbolo); //quita id
                        nodo.Siguiente = lvar;
                        pila.Pop();                                                              //quita estado
                        pila.Pop();                                                              //quita la coma
                        break;

                    case 9:    //<DefFunc> ::= tipo id ( <Parametros> ) <BloqFunc>
                        nodo = new DefFunc(ref pila);
                        break;

                    case 11:    //<Parametros> ::= tipo id <ListaParam>
                        nodo = new Parametros(ref pila);
                        break;

                    case 13:        //<ListaParam> ::= , tipo id <ListaParam>
                        nodo = new Parametros(ref pila);
                        pila.Pop(); //quita estado;
                        pila.Pop(); //quita la coma
                        break;

                    case 14:                       //<BloqFunc> ::= { <DefLocales> }
                    case 30:                       //<Bloque> ::= { <Sentencias> }
                    case 41:                       //<Expresion> ::= ( <Expresion> )
                        pila.Pop();                //quita estado
                        pila.Pop();                //quita }
                        pila.Pop();                //quita estado
                        nodo = ((Node)pila.Pop()); //quita <deflocales> o <sentencias>
                        pila.Pop();
                        pila.Pop();                //quita la {
                        break;

                    case 21:     //<Sentencia> ::= id = <Expresion> ;
                        nodo = new Asignacion(ref pila);
                        break;

                    case 22:    //<Sentencia> ::= if ( <Expresion> ) <SentenciaBloque> <Otro>
                        nodo = new If(ref pila);
                        break;

                    case 23:    //<Sentencia> ::= while ( <Expresion> ) <Bloque>
                        nodo = new While(ref pila);
                        break;

                    case 24:    //<Sentencia> ::= do <Bloque> while ( <Expresion> ) ;
                        nodo = new DoWhile(ref pila);
                        break;

                    case 25:    //<Sentencia> ::= for id = <Expresion> : <Expresion> : <Expresion> <SentenciaBloque>
                        nodo = new For(ref pila);
                        break;

                    case 26:    //<Sentencia> ::= return <Expresion> ;
                        nodo = new Return(ref pila);
                        break;

                    case 27:                       //<Sentencia> ::= <LlamadaFunc> ;
                        pila.Pop();
                        pila.Pop();                //quita ;
                        pila.Pop();
                        nodo = ((Node)pila.Pop()); //quita llamadafunc
                        break;

                    case 29:                       //<Otro> ::= else <SentenciaBloque>
                        pila.Pop();
                        nodo = ((Node)pila.Pop()); //quita sentencia bloque
                        pila.Pop();
                        pila.Pop();                //quita el else
                        break;

                    case 34:    // <ListaArgumentos> ::= , <Expresion> <ListaArgumentos>

                        pila.Pop();
                        aux = ((Node)pila.Pop());  //quita la lsta de argumentos
                        pila.Pop();
                        nodo = ((Node)pila.Pop()); //quita expresion
                        pila.Pop();
                        pila.Pop();                //quita la ,
                        nodo.Siguiente = aux;
                        break;

                    case 36:
                        pila.Pop();
                        nodo = new Identificador(((Terminal)pila.Pop()).nodo.Simbolo);
                        break;

                    case 37:
                        pila.Pop();
                        nodo = new Constante(((Terminal)pila.Pop()).nodo.Simbolo);
                        break;

                    case 38:
                        nodo = new LlamadaFunc(ref pila);
                        break;

                    //R42 < Expresion > ::= opSuma < Expresion >
                    //R43 < Expresion > ::= opNot < Expresion >
                    case 42:
                    case 43:
                        nodo = new Operacion1(ref pila);
                        break;

                    //R44 < Expresion > ::= < Expresion > opMul < Expresion >
                    //R45 < Expresion > ::= < Expresion > opSuma < Expresion >
                    //R46 < Expresion > ::= < Expresion > opRelac < Expresion >
                    //R47 < Expresion > ::= < Expresion > opIgualdad < Expresion >
                    //R48 < Expresion > ::= < Expresion > opAnd < Expresion >
                    //R49 < Expresion > ::= < Expresion > opOr < Expresion >
                    case 44:
                    case 45:
                    case 46:
                    case 47:
                    case 48:
                    case 49:
                        nodo = new Operacion2(ref pila);
                        break;

                    //aqui cae R2,R7,R10,R12,R15,R19,R28,R31,R33,
                    default:
                        pops = Rules.ElementAt(r).TotalProductions;

                        if (pops > 0)
                        {
                            while (pops > 0)
                            {
                                pila.Pop();
                                pila.Pop();
                                pops--;
                            }
                        }
                        break;
                    }
                    //x = (int)pila.Peek();
                    x = ((Estado)pila.Peek()).transicion; //((Estado)pila.Peek()).numestado;

                    y = rules.ElementAt(r).Id;            //columna= idreglas[regla];
                    NoTerminal nt = new NoTerminal(y);    //NoTerminal NT =new NoTerminal(idreglas[regla]);
                    //nt.nodo = nodo;
                    //pila.Push(rules.ElementAt(r).Id);
                    pila.Push(nodo);

                    r = tablaLR[x, y]; //transicion = tabla[fila][columna];
                    //pila.Push(r);
                    pila.Push(new Estado(r));
                    newSymbol = false;
                    Root      = nodo;
                }
                else
                {
                    //Error
                    error = true;
                }
            }

            Root.validatipos(ASemantico.Simbolos, ASemantico.Errores);
            if (error)
            {
                currentSymbol.ErrorSintactico = true;
            }
            if (ASemantico.Errores.Count > 0)
            {
                currentSymbol.ErrorSemantico = true;
                currentSymbol.Errores        = ASemantico.Errores;
                error = true;
            }


            return(error ? currentSymbol : null);
        }
Esempio n. 2
0
 public void InitializeLexico(string t)
 {
     ALexico.ClearText();
     ALexico.setText(t);
 }