Skip to content
This repository has been archived by the owner on Feb 14, 2021. It is now read-only.

Listos los test #68

Open
wants to merge 99 commits into
base: entrega-final
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
7c41e20
First step in development. Go to other branch
DiazRock Feb 26, 2020
5775246
Added a main.py file. The coolc.sh is a wrapper for it.
DiazRock Feb 27, 2020
d87bae5
Added the base for the compiler structure
DiazRock Feb 28, 2020
664f89d
Added lexer definitions
DiazRock Feb 28, 2020
fb038db
All the cool lexer analyzer declarations
DiazRock Feb 29, 2020
6d7a1b4
More changes
DiazRock Feb 29, 2020
888a63b
Added functionality for lexer analyzer
DiazRock Feb 29, 2020
c6663a7
I think that the lexer analyzer is ready for test
DiazRock Mar 1, 2020
a5b8569
The moment for test is near. I can feel it.
DiazRock Mar 1, 2020
facd09d
10 of 13 test passed
DiazRock May 20, 2020
ab5d06e
100% of test case passed
DiazRock May 21, 2020
5fdaea5
A bug in the error column tracker
DiazRock May 27, 2020
4fb1f7d
Passed more tests
DiazRock Jun 5, 2020
156089b
three errors and 9 shit/reduce conflicts
DiazRock Jun 6, 2020
a1e2abb
The insensitive case in keywords
DiazRock Jun 6, 2020
9e23612
Passed all test :)
DiazRock Jun 6, 2020
467240d
Passed all test for 'entrega-parser'
DiazRock Jun 8, 2020
a48d4c9
Some definitions for a better code. Useless right now
DiazRock Jun 8, 2020
e12d646
Classes an attr for the COOL class context
DiazRock Jun 15, 2020
c1b0ab2
The errors definitions
DiazRock Jun 16, 2020
72ce4b4
visitor definitions
DiazRock Jun 16, 2020
847cf2c
Context and visitor for types
DiazRock Jun 17, 2020
2837dc9
More Code
DiazRock Jun 17, 2020
86e1f53
The errors definitions
DiazRock Jun 17, 2020
affca5c
Added an error message
DiazRock Jul 21, 2020
3a4c3cf
Added the opertations for the methodClass node
DiazRock Jul 21, 2020
d04dab8
Added the opertations for the AttrNode
DiazRock Jul 21, 2020
6c17eed
The semantic analyzer
DiazRock Jul 28, 2020
3e8b4a2
The context as a class with a dictionary
DiazRock Jul 28, 2020
7205eaa
Commented the attachFeaturesToType method
DiazRock Jul 28, 2020
268cf93
Identifying the class attrs and mehtods in the AST. Not tested yet
DiazRock Jul 28, 2020
1dadfac
Added the intercept error function
DiazRock Aug 2, 2020
dab08b7
The context is now a class with a dictionary with all the subcontext …
DiazRock Aug 2, 2020
7e69980
Some testing
DiazRock Aug 2, 2020
a3d414c
Definitions for the program context and the class context of each type
DiazRock Aug 2, 2020
40c49d3
Changed the Let In parser part. Is more intuitive in this way
DiazRock Nov 26, 2020
4a80af4
More changed the let part, and also added more constructions to the a…
DiazRock Nov 26, 2020
7b49c57
Completed all node and operations for build the AST. Not tested yet
DiazRock Nov 26, 2020
2e6a6af
All test of the parse phase works with the AST instructions
DiazRock Nov 26, 2020
6c9bb23
All ok with the AST instructions in the parse phase
DiazRock Nov 26, 2020
5ef862d
Changed word instance by idName
DiazRock Dec 1, 2020
3da3ba1
More Semantics
DiazRock Dec 7, 2020
95c25fd
Just tiny changes for semantic
DiazRock Dec 16, 2020
6d30fde
Some changes for semantic
DiazRock Dec 16, 2020
9d92137
Error definitions for arithmetics and let expr
DiazRock Dec 16, 2020
c6b6a39
For arithmetic attr works fine
DiazRock Dec 16, 2020
4c9b7bb
Changed idName in Dispatch's to expr
DiazRock Dec 16, 2020
ef50e65
Some primary features declarations. Needs the column and row
DiazRock Dec 16, 2020
cb05fe9
Changed the way in what we store the linepos and the lexpos
DiazRock Dec 17, 2020
236ef6d
Added some thing for a better semantic analysis
DiazRock Dec 17, 2020
69ec095
Environment bug, when popped
DiazRock Dec 17, 2020
798f7aa
Deleted the self as a token
DiazRock Dec 18, 2020
ad10340
Deleted the SELF production
DiazRock Dec 18, 2020
b743952
Using formal params of methods as node objects
DiazRock Dec 18, 2020
b8eb0d5
In NodeClassMethod the formal params are a list of NodeFormalParam
DiazRock Dec 18, 2020
aecd4a0
The self test works now
DiazRock Dec 18, 2020
0f7cf4d
Changed the order of visits. Now Build goes first than Inheritance
DiazRock Dec 20, 2020
f77808c
Changed the order of visits. Now Build goes first than Inheritance
DiazRock Dec 20, 2020
b947841
Attributes and arithemtic works
DiazRock Dec 20, 2020
a721dae
The let tests works
DiazRock Dec 20, 2020
e65432c
For switch tabas by spaces and things like that
DiazRock Dec 20, 2020
288679b
We passed almost 31 test!
DiazRock Dec 20, 2020
129b104
39 test. Most of the basic test
DiazRock Dec 20, 2020
209909d
Added semantic for Case expressions. Tests fine
DiazRock Dec 20, 2020
a266f33
Semantic for static dispatch
DiazRock Dec 22, 2020
d6461fa
Dispatch tests in semantic works
DiazRock Dec 22, 2020
e69a2b3
All self tests works. All of them. Not just one.
DiazRock Dec 23, 2020
acadff6
Loops tests works
DiazRock Dec 23, 2020
1de9e65
10 tests remain to be solved
DiazRock Dec 23, 2020
e8e1527
Feature tests works
DiazRock Dec 23, 2020
95ecc5c
It remains 5 test to pass. Only 5clear
DiazRock Dec 23, 2020
c6bbe86
It remains only the inheritance tests
DiazRock Dec 23, 2020
c7bb9bb
Finished semantic phase
DiazRock Dec 23, 2020
39a0a0e
Changed the structure folder. Added some of generation
DiazRock Dec 24, 2020
e67dee6
Changed to a folder the lexer
DiazRock Jan 2, 2021
c2aed1c
Another structure for the compiler
DiazRock Jan 2, 2021
ebc5165
More things
DiazRock Jan 2, 2021
b6d2aee
CIL visitor. It looks fine
DiazRock Jan 2, 2021
77d6985
Added the built in classes writted in COOL
DiazRock Jan 2, 2021
339e780
Fixed the static dispatch
DiazRock Jan 2, 2021
288eb9b
Fixed the checkGoodInheritance method
DiazRock Jan 2, 2021
bf5728b
Added a config folder
DiazRock Jan 3, 2021
2511ff2
Ok, a safe copy
DiazRock Jan 10, 2021
3d43cdc
Those are mips files for generation. Are a s**t. So, I'm gonna change…
DiazRock Jan 10, 2021
e36b632
Rebooted the writing of MIPS generator. Right now it prints hello world
DiazRock Jan 12, 2021
fd4488b
Pass 9 of 17 test of code generation
DiazRock Jan 16, 2021
793518a
It remains only 3 test!
DiazRock Jan 18, 2021
073ad93
It remains only 1 test
DiazRock Jan 19, 2021
1a7c7a8
In CIL_generator, the child class only use the parent initializer.
DiazRock Jan 21, 2021
d7820be
Deleted all the logic for the initializers.
DiazRock Jan 21, 2021
2193c7c
The semantic and codegen test
DiazRock Jan 25, 2021
8bc2896
Added ply requirement
DiazRock Jan 25, 2021
8e490d0
Merge branch 'entrega-final' into Semantic_Develop
DiazRock Jan 25, 2021
89a08d4
Changes in test code
DiazRock Jan 25, 2021
ee695e4
Added basic classes in .py
DiazRock Jan 25, 2021
fffb64a
Splitted the visitors_definitions
DiazRock Jan 26, 2021
da0534d
Merge branch 'Semantic_Develop' of https://github.com/DiazRock/cool-c…
DiazRock Jan 26, 2021
9fb7bac
First version of the report
DiazRock Jan 26, 2021
1b767ef
Update paper
DiazRock Jan 26, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 127 additions & 0 deletions doc/paper.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
---
title: "Informe sobre el trabajo de Compilación de cuarto año de Ciencias de la Computación"
author: [Alejandro Díaz Roque]
date: "2021-01-25"
subject: "Compilación"
keywords: [análisis sintáctico, análisis semántico, generación de código]
subtitle: "Implementación en python3 de un compilador del lenguaje de programación COOL"
lang: "es-419"

toc: yes
numbersections: yes
titlepage: true
---

# Introducción

El presente informe trata sobre la implementación en `python` de un compilador
del lenguaje `COOL` (Class Room Object Oriented Language), un software que se encarga de tomar ficheros escritos en `COOL`, y trasladarlos a código máquina ejecutable por un sistema operativo. El código máquina en este caso es `MIPS32`.
Se especificarán las componentes en que se encuentra dividido dicho software, los detalles relevantes en la implementación de cada una, y además se dará una breve explicación de cómo instalar y ejecutar el programa.

# División en Componentes

El compilador se encuentra dividido en 4 componentes principales:

- **Lexer**: Que se encarga del análisis lexicográfico. Aquí se definen los tokens del lenguaje COOL.
- **Parser**: Donde se define la gramática especificada en el estándar de COOL, y donde además se construye el árbol de derivación correspondiente a la cadena asociada a un fichero para dicha gramática.
- **Semantic**: Donde se definen las clases que están dentro del fichero `.cl`, se crea la jerarquía entre ellas, y además se hace chequeo de tipos para las operaciones que se ejecuten dentro del `.cl`.
- **Generation**: Donde se traslada un `.cl` a un fichero `.mips` equivalente. Para ello, se define una representación intermedia, denominada `CIL` (Class Intermediate Language), se traduce el contenido del archivo `.cl` a esa representación, y lo resultante se traslada a un archivo `.mips`, ejecutable por una arquitectura `MIPS32`.

## Análisis lexicográfico

Dentro de la carpeta `/src/compiler/components/lexer`, se encuentra el fichero `lexer_analyzer.py`. En este se define todo lo necesario para construir la lista de tokens de `COOL`. Se usa el módulo `ply.lex` de `python` como framework, para hacer esta tarea de modo ágil.

Luego de ser construidp el lexer, al archivo de entrada se le aplica la operación de *tokenización*, que consiste en dividir el texto escrito en `COOL` en diferentes tokens, según la definición del lexer.

```python
# Este es el código para tokenizar un .cl
def tokenizer(stream_input):
global readjust_col
readjust_col = 0
lexer.input(stream_input)
token_list = []
lexer.lineno= 1
#lexer.lexpos= 1
real_col = {}
for tok in lexer:
real_col.update({ str(tok): find_column(stream_input, tok) })
token_list.append(tok)


return errors, token_list, real_col

```

Un detalle a resaltar es cómo se guarda la columna real de cada token. Por un lado se usa el diccionario `real_col`, que tiene como llave la representación en `string` de cada token y como valor el método `find_column`, que retorna la posición del token en la entrada. Y por el otro, se usa el sistema de seguimiento `ply.lex`, que pone en el atributo `lexpos` de cada token su número de ocurrencia, y la variable global `readjust_col`, para reajustar el valor de `lexpos` cuando hay un salto de línea. Esto es para reportar un error con la posición conveniente.

## Análisis sintáctico

Tomando como punto de partida lo hecho previamente en el análisis lexicográfico, usando el módulo `ply.yacc`, se define la gramática de `COOL` y generar, y a partir de ella el árbol de derivación correspondiente para el archivo `.cl` de entrada.
De igual manera, en este paso se obtiene el *Abstract Syntax Tree* o `AST`, que es el que sirve de entrada a las componentes **Semantic** y **Generation**.
Para la definición del `AST`, usamos las clases que están definidas en el módulo `/src/components/semantic/AST_definitions.py`.

## Análisis semántico

En esta fase, nos encargamos de tres aspectos esenciales, dado un `AST` de `COOL`:

- Chequear que todos los tipos que se usan en el `AST` existen.
- Chequear que las definiciones de dichos tipos, y de sus *features* tienen sentido bajo los estándares de `COOL`.
- Chequear que la relación de jerarquía es correcta.
- Chequear que las operaciones definidas correctamente, tengan un uso consistente.

Para ello, se recorre el `AST` usando el patrón *visitor*, que consiste en realizar sucesivas visitas al `AST` recopilando información en cada una que se usa en la próxima.

```python
class NodeVisitor:
def __init__(self, programContext):
self.programContext= programContext

def visit(self, node: Node, **args):
if isinstance(self, TypeCheckerVisitor):
if issubclass(type(node), NodeBinaryOperation):
return self.visit_NodeBinaryOperation(node, **args)

visitor_method_name = 'visit_' + node.clsname
visitor = getattr(self, visitor_method_name, self.not_implemented)
return visitor(node, **args) # Return the new context result from the visit

def not_implemented(self, node: Node, **args):
raise Exception('Not implemented visit_{} method'.format(node.clsname))
```

Cada recorrido del `AST`, es una clase que hereda de `NodeVisitor`.
Para esta componente, se usan 4 clases, o sea, 4 recorridos, en el siguiente orden:

1. **TypeCollectorVisitor**
2. **TypeBuilderVisitor**
3. **TypeInheritanceVisitor**
4. **TypeCheckerVisitor**

### Estructuras adicionales para los recorridos

#### ProgramContext

En cada recorrido, se va actualizando un objeto de tipo `globalContext` y de nombre `programContext`, que se encarga de ir actualizando toda la información necesaria para que el contexto del `AST`, tenga sentido. De esta forma, cada vez que `programContext` cambia, lo hace a través de alguno de los métodos definido en su clase asociada, y en cada método chequea, antes de la actualización, si la operación es válida. O sea, que no haya tipos redefinidos, que una operación aritmética tenga sentido, etc.

#### Clase error

La clase `error` se usa para definir los errores que se pueden cometer en el proceso de compilación de una entrada en `COOL`, debido a errores de escritura. Se encuentra en el archivo `/src/compiler/utils/errors.py`. Para el caso del `programContext` antes mencionado, se usa un diccionario con los posibles errores en el análisis semántico, llamado `error_selector`.

#### Environment

La variable `environment` es un diccionario que sirve para guardar cada nombre de objeto en el `AST` con su tipo correspondiente, para el scope de una expresión.

## Generation Code

Luego de que se chequea que el `AST` es consistente, se vuelve a recorrer el mismo para obtener la representación equivalente en `MIPS32`. Para esto se crean dos clases, usando la misma lógica que en la componente **Semantic**:

1. **CILVisitor**: Para crear la representación en `CIL` del `AST`. Esta representación es un árbol. Los nodos del árbol están definidos en el archivo `/src/compiler/components/generation/CIL_definitions.py`
2. **MipsVisitor**: Para a partir del árbol `CIL`, obtener el archivo `.mips` correspondiente. Para traducir de uno a otro, se usan convenciones, teniendo en cuenta la función de cada registro y cómo se comportan las llamadas al sistema que hace `MIPS32`.

## Cómo correr el código

Para ejecutar el código, debe tener la versión `3.8` de `python` o superior, instalar los requerimientos que aparecen en el archivo `requirement.txt`, correr el archivo `coolc.sh` con la dirección del archivo `.cl` a compilar.

# Conclusión

La implementación posee detalles corregibles. No obstante, su correctitud y robustez se corresponden con lo exigido en los test de prueba que se evalúan en el *pull request*.
Binary file added doc/paper.pdf
Binary file not shown.
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
ply
pytest
pytest-ordering
Empty file added src/compiler/__init__.py
Empty file.
Empty file.
Loading