Página personal Juan Carlos Galán Vótame!! << >>
Tema de escritorio:


     
 
Indice
 
     
     
 
Prácticas de la universidad (UIB)

Profesor: Miquel Mascaro Portells

 

Práctica de procesadores del Lenguaje:
El Compilador
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Codigo fuente completo con ejemplos

Codigo fuente del archivo para JavaCup(web)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Profesor:  Miquel Mascaro Portells

 

Alumno: Juan Carlos

Juanki@
Índice:

 

Jerarquía de clases: 3

Información de la tabla de símbolos. 4

Problemas que he encontrado. 5

Arrays multidimensionales. 5

Rellenar los sigs de la ultima instrucción. 5

Problema de información de la línea de un error: 5

Características del lenguaje: 6

Programas de ejemplo: 8

Cálculo del factorial recursivo: 8

Descompone un número en sus números primos. 9

Ejemplo de uso de arrays multidimensionales. 10

La tabla de multiplicar 10

Dice si un numero divide a otro. 11

Fibonacci Recursivo. 12

Fibonacci iterativo. 13

 

 


Jerarquía de clases:

 

  • class java.lang.Object

 

 

 


Información de la tabla de símbolos

 

private int tipo, //tipo es el indice en TS del tipo de variable en

caso de que sea una variable

nivel=-1; 

private String nombre;    //Nombre si es una variable

 

private int pos=-1, tam=-1;  //direccion, tamaño si es un procedimiento

 

private char clase='0';  //clase de la información: puede ser un procedimiento,

una variable, o un tipo de variable

 

private TipoVar tvar; //tvar contiene los datos del tipo en caso de que sea

un tipo de variable

 

private LinkedList lista; //lista de parametros si es un procedimiento

 

private LinkedList listai;       //lista instrucciones a poner el tamanyo en 'call' si es un procedimiento

 

private char temporal='u'; //Indica si la variable es temporal o de usuario


Problemas que he encontrado

 

 

Arrays multidimensionales

 

            Pensé en hacer arrays multidimensionales usando declaración de tipos de arrays, y tipos que podían ser arrays de otros tipos que a su vez son arrays. Así lo hice pero me olvidé de el caso en el que se asigna un valor a una posición de cualquier dimensión de un array multidimensional (solo tenia para unidimensionales), es decir podía leer el valor de cualquier dimensión pero solo escribir en la primera. Al intentar arreglar eso me aparecieron errores de reducción / reducción hacia referencia o expresión, así que cambié la gramática creando un nuevo token no terminal “refi” (referencia indexada) y sus expresiones:

 

      refi:refi IGUAL expr:e  graba_nlinea SEMI

 

refi         ::=   ref:r L_CORCH expr:i R_CORCH

 

| refi:r L_CORCH expr:i R_CORCH

 

      expr  ::= refi:r

 

 

Rellenar los sigs de la ultima instrucción

 

            Con la gramática para rellenar las direcciones de ‘sig’: s <- ls marcador s

había un problema, que el último salto no se rellenaba, la solución fue poner la dirección después de cada LS en un nivel superior de la gramática.

 

 

Problema de información de la línea de un error:

 

            Me di cuenta de que el compilador informaba erróneamente del número de línea donde se producía un error, a veces daba alguna/s lineas mas adelante. Lo que pasaba es que daba el error después de reducir la sentencia entera y encontrar el siguiente token (normalmente en otra líena ya), lo cual sucedía después del punto y coma (en mi gramática), porque en mi gramática el punto y coma está incluido dentro de la sentencia.

            Probé de cambiar la gramática para sacar el punto y coma fuera pero tenia muchos errores. Así que introduje un nuevo token que deriva en lamda y graba el número de línea en la que se encuentra en una variable del compilador. Este token lo introduje al inicio y al final (antes del punto y coma) de cada sentencia, para que grabe la línea en la variable de la que luego tomo el numero de línea para dar el error.

 

 


 

Características del lenguaje:

 

Se trata de un lenguaje con una sintaxis bastante parecida a la de JAVA. Para ver la sintaxis concreta del lenguaje ver los ejemplos adjuntos.

Lista de sus características:

 

  • Variables, tipos de variables.
    • Dispone de los 4 tipos de variables básicos y además permite definir los propios.
    • Permite definir tipos que sean arrays de otros tipos.
    • Permite declarar un tipo o una variable en cualquier parte del procedimiento.
    • Realiza casting de tipos implícitamente.
    • Avisa al convertír real a entero por perdida de precisión.
    • Permite realizar castings explicitos, siempre que sean tipos convertibles. Ejemplo: boleano=[boolean]entero;

 

  • Arrays Multidimensionales
    • Permite crear tipos de arrays N-dimensionales.
    • Un array puede ser de cualquier tipo de elementos, incluso de los propios definidos (como otro array)
    • Los arrays pueden ser indexados por números, variables, o incluso una posición de otro array.

 

  • Expresiones
    • Calcula expresiones de números y booleanas, con paréntesis.
    • Calcula expresiones booleanas según la lógica.
    • Permite convertir variables numéricas a booleanas sin necesidad de casting.
    • Para convertir una variable a una expresión booleana, hay que poner el dollar $ antes de la variable o numero. Pe: while ($seguir) { ... }

 

  • Control de flujo
    • Permite la sentencia “if (...) { .. } [else {...}]”
    • Permite el los bucles while y for (nota: el bucle for ejecuta la instrucción parentizada antes de entrar al bucle, a diferencia que el de JAVA)

 

  • Procedimientos
    • Permite declaración de procedimientos en cualquier parte del programa o dentro de otros procedimientos.
    • Los parámetros pueden ser de entrada, de salida o de ambas a la vez.
    • Permite recursividad con el número de llamadas recursivas solo limitado por la RAM.
    • Permite salir de un procedimiento en cualquier parte de éste mediante la instrucción return.

 

  • Entrada / Salida
    • Permite la entrada / salida con el usuario mediante el uso del teclado y monitor.
    • Permite imprimir strings en una instrucción de código.

  • Otras
    • Asignación de strings como:  var=”hola mundo”;
  • Optimización local
  • Informe de errores
    • Al encontrar un error informa del error y da la linea y columna donde se encuentra.
    • Informa varios errores en una compilación.
    • Tambien da algunos warnings (conversión de real a entero).

 

 

 

 

 

 


Programas de ejemplo:

 

Cálculo del factorial recursivo:

 

programa {

      

       procedimiento factorial (int inout x) {

             int c;

             c=x-1;

             while (c>0) {

                    x=x*c;

                    c=c-1+1.2;

             }

       }

      

       procedimiento factorialR (int in n, int inout o) {

             if(n==1) {

                    o=1;  

                    return;

             }

             else {

                    int r;

                    factorialR(n-1,r);

                    r=n*r;  // n! = n * (n-1)!

                    o=r;

                    }

       }

       int fact,resultado;

       real r;

       put("Factorial del numero: ");

       get(fact);

       factorialR(fact,resultado);

       put("Resultado: "); put(resultado);

}

 


Descompone un número en sus números primos.

 

programa {

       int a,b,r,i;

       real f;

       int bol;

 

       procedimiento dividen(int in a, int in b,int out r) {

             real f;

             f=a/b;

             f=f-[int]f;

             if(f==0.0) {

                    r=1;

             }

             else { r=0; }

       }

 

       procedimiento descompone(int in n,int inout it) {

       //put(" D="); put(n);

       int x,r,p;

       x=2;

       it=it+1;

       if(n==1) { return; }

             while(1>0) {

                    dividen(n,x,r);

                    if($r) {

                          put(" * "); //put([int] (n/x)); 

                          put(x);

                          p=n/x;

                          descompone(p,it);

                          return;

                    }

                    x=x+1;

             }     

       }

 

       put("Numero a descomponer: ");

       get(a);

       i=-1;

       descompone(a,i);

       put(+);

       put("ITS: ");put(i);

 

}


Ejemplo de uso de arrays multidimensionales

 

programa {

       type d1 real[10];

       type d2 d1[10];

       d2 var[10];

       int x,y,z;

       x=0;

       while(x<10) {

             y=0;

             while(y<10) {

                    z=0;

                    while(z<10) {

                          var[z][y][x]=0.01*z+0.1*y+x;

                          z=z+1;

                          //put("-X-");

                    }

             y=y+1;

             //put("-Y-");

             }

       x=x+1;

       }

       x=0;

       while(x<10) {

             y=0;

             while(y<10) {

                    z=0;

                    while(z<10) {

                   

                          put(var[z][y][x]);

                   

                          z=z+1;

                          put("  ");

                    }

             put("-Y-");

             y=y+1;

             }

       put("-X-");

       x=x+1;

       }

 

 

}

La tabla de multiplicar

programa {

 

       int n,x,y;

       //put("La tabla del numero: ");

       //get(n);

      

       for(y=-1;y<9;y=y+1;) {

             for(x=-1;x<9;x=x+1;) {

                    put(x);put("x");put(y);put("=");

                    put(x*y);

                    put(", ");

             }

       put(+);

       }     

 

}

 

Dice si un numero divide a otro

 

programa {

       int a,b,r;

       real f;

       int bol;

 

       procedimiento dividen(int in a, int in b,int out r) {

             real f;

             f=a/b;

             f=f-[int]f;

             if(f==0.0) {

                    r=1;

             }

 

             else { r=0; }

 

       }

 

       put("numero a: ");

       get(a);

       put("numero b: ");

       get(b);     

 

       dividen(a,b,bol);

      

       if($bol) {put("SI dividen.");    }     

       else {put("NO dividen."); }     

 

 

}

 


Fibonacci Recursivo

 

programa {

       procedimiento fibonacci(int in num, int out r) {

            

             if(num==0) {

                    r=1;

                    return;

             }

             else {

                     if(num==1) {

                          r=1;

                          return;

                          } else {

                         

                                 int x1,x2;

                                 fibonacci(num-1,x1);

                                 fibonacci(num-2,x2);

                                 r=x1+x2;

                            }

           }

       }

      

 

       int fib,times,x,y;

      

 

       put("Numeros de la serie Fibonacci: ");

       get(times);

       put(+);

       put("Serie Fibonacci: ");

       for(x=-1;x<times;x=x+1;) {

             fibonacci(x,fib);

             put(fib); put(", ");

       }

 

}

 


Fibonacci iterativo

 

 

       //fibonacci iterativo

programa {

 

       real tope,n1,n2,na,r;

      

       put("Numeros de la serie Fibonacci: ");

       get(tope);

       put(+);

       na=0;

       n1=1; n2=1;

       while(na<tope) {

             r=n1+n2;

             put(r);put(+);     

             n1=n2;

             n2=r;       

             na=na+1;

 

       }

       put(+);

       put("el nro magico es: ");

       put(n2/n1);

 

}