Construyendo el compilador Parte X: !PROYECTO DE CODIGO INTERMEDIO FINALIZADO! YASSSSSSSSS

 Hola Lectores de las 3C de mi vida, es emocionante contarles que finalicé el proyecto. En posts anteriores les coloqué ejemplos de cómo iba quedando la funcionalidad, asi que no tengan miedo y vayan a ver todo lo que se puede lograr y todo lo que se puede hacer amigos.


Acá, les dejaré un resumen, ya a nivel más de README.md que lógico, nos vemos en la siguiente y ultima fase: EL COMPILADOR!

Acerca de...

Este proyecto es el segundo de tres de construccion de un compilador. Esta fase es la generación de código intermedio. El código intermedio es una fase intermedia entre el analisis semántico y el codigo a nivel de assembler, de esta forma, logramos hacer esta transición mas suave al tener algo más sencillo de traducir a lenguaje de máquina. Algunos puntos vistos en este proyecto

  • Traducción a código intermedio de expresiones
  • Traducción a código intermedio de IF y While
  • Traducción a código intermedio de Arrays, llamadas a métodos, parámetros, y operaciones.

Descripción de herramientas y archivos archivos

Listado de herramientas usadas para el proyecto

  • Python 3.8.0 64bits
  • Compiladores principios, técnicas y herramientas, 2da Edición - Alfred V. Aho
  • VS Code
  • Windows Terminal
  • A lot of Coffe (more Coffe than last time, A LOT) (enought coffe for a life V4, version Intermediate Code)

Liberías NECESARIAS para correr el programa

  • Python 3.8.0
    • Una versión de Python de la versión Python 3.6.0 64bits o mayor
  • Pprint
  • Terminal
    • Una terminal o programa para correr los programas de python. Puede ser VS Code también.

Archivos y carpetas

No.ArchivoPropósito/Descripción
1Python3Folder donde esta la gramática, los lexer, parser, etc. Acá dentro también se encuentran los archivos de prueba y lo que se prueba
2decafAlejandro.tokensTokens generados por ANTLR
3decafAlejandroLexer.pyEs un python generado por ANTLR que contiene el lexer del proyecto
4decafAlejandroListener.pyContiene un listener, es decir, una forma de recorrer el arbol sintáctico generado
5decafAlejandroParser.pyel parser generador por ANTLR para el proyecto
6ErrorClass.pyUna clase de errores para arrays o errores generales
7funciones.pyUn python con funciones generales y útiles
8mainSemantic.pyprograma más importante. Acá se genera la logica, los valores, y se revisan TODAS las reglas semánticas
9Gramática V2Tenemos una nueva coleccion de una segunda gramática, esta se usó para eta fase, por ende veremos los mismos listener, tokens, y lexer soloq ue en V2
10symbolTable.pyClase que contiene TODAS las declaraciones para las tres tablas de simbolos principales: metodos, variables y estructuras
11NodoBoolean.pyUn nodo para guardar las expresiones de algo complejo como un nodo IF
12NodoCodigo.pyUna clase nodo para guardar expresiones y address de las cosas
13GUI.pyLa interfaz gráfica
14Readme.mdEl readme
15Python3/Programas/multiple_tests.decafEl programa donde probamos por defecto



Cómo correr el proyecto

  • Primero se debe editar en el file de Python3/Programas/simple.decaf con lo que deseemos poner a prueba. Por ejemplo:
      ```python
            class Program
            {

            int A[10];


            int Minimo(int i)
            {
              int Min;
              int index;
              Min = A[i];
              index = i;
              while(i<10)
              {
                if (A[i]<Min)
                {
                  Min = A[i];
                  index = i;
                }
                i = i + 1;
              }
              return index;
            }

            void Ordenar(void)
            {
              int i;
              int j;
              int temp;
              i = 0;
              while(i<10)
              {
                int Index;
                Index = Minimo(i);
                temp = A[Index];
                A[Index] = A[i];
                A[i]=temp;
                i = i+1;
              }
            }



            void OutputInt(int n)
            {
            }

            int InputInt(void)
            {return 0;}


            void main(void)
            {

              int i;
              i = 0;
              while(i<10)
              {
                A[i]=InputInt();
                i = i+1;    
              }
              Ordenar();
              i = 0;
              while(i<10)
              {
                OutputInt(A[i]);
                i = i+1;
              }

            }


            }
      ```
  • Luego, se debe correr el programa GUI.py y ejecutarlo en una consola.
  • Luego se debe de buscar el file con ABRIR file, luego, editar en el espacio lo que necesitemos.
  • Finalmente, presionar COMPILAR INTERMEDIO. Y el código intermedio aparecerá en la parte del texto donde debería.

Creditos y Agradecimientos

Course teacher: Bidkar Pojoy

Licence

Bajo la propia del desarrollador.

Comentarios

Entradas populares de este blog

Construyendo el compilador Parte I: ANTLR V4 (ya van 4 versiones, increible), café y una miradita a los parser y lexer generados con Java

Construyendo el compilador Parte V: Finalizando el analizar Semántico

Construyendo el compilador Parte III: ANTLR V4, Listener vs Visitor y la tabla de Símbolos