Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Entrega final #73

Open
wants to merge 91 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
2ed2bb1
adding llast project, lexer almost done
Feb 17, 2022
de5c80e
update
Feb 18, 2022
94cc224
lexer done
Feb 18, 2022
b7a6d56
working on parser
Feb 18, 2022
1261f2c
working on parser
Feb 22, 2022
8f6cd5f
-
Feb 23, 2022
d7be5b1
working on semantic errors
Feb 24, 2022
a794daf
cleaning
JessyGigato Feb 23, 2022
6357abe
starting cil :-O
JessyGigato Feb 24, 2022
811f369
working on semantic
Feb 24, 2022
6c71296
Merge branch 'master' of https://github.com/ycimadevila/cool-compiler…
Feb 24, 2022
ece974d
still workin on cil
JessyGigato Feb 25, 2022
e84d7dd
Merge branch 'master' of https://github.com/ycimadevila/cool-compiler…
JessyGigato Feb 25, 2022
f7aa846
working on type checker
Feb 25, 2022
5580762
still working on cil v2 :-(
JessyGigato Feb 26, 2022
d8c222f
working on semantic, typer checker, report
Feb 26, 2022
69bf6e7
Merge branch 'master' of https://github.com/ycimadevila/cool-compiler…
Feb 26, 2022
e06cc83
half semantic tests done :')
Mar 2, 2022
360a095
cool-to-cil-yet
JessyGigato Mar 11, 2022
32c3566
merging
JessyGigato Mar 11, 2022
f0c4aec
testing semantic
Mar 11, 2022
b7146b3
Merge branch 'master' of https://github.com/ycimadevila/cool-compiler…
JessyGigato Mar 11, 2022
6317abd
visit-cil
JessyGigato Mar 11, 2022
1ab6967
fixing
JessyGigato Mar 11, 2022
2d45c28
cyclic dependency fixed
Mar 11, 2022
5adce7c
Merge branch 'master' of https://github.com/ycimadevila/cool-compiler…
JessyGigato Mar 11, 2022
61fd2fb
--
JessyGigato Mar 11, 2022
43d5304
fixing errors
JessyGigato Mar 11, 2022
27064a6
semantic donde, hope it works X')
Mar 11, 2022
3426470
fixing entry
Mar 11, 2022
787aa4a
-
Mar 11, 2022
80ef284
Merge branch 'master' of https://github.com/ycimadevila/cool-compiler…
JessyGigato Mar 11, 2022
c1632b3
-
Mar 12, 2022
84066cf
cil almost complete
JessyGigato Mar 13, 2022
8bc5d33
fixing errors
JessyGigato Mar 13, 2022
44dd6fe
declaration collector
ycimadevila Mar 13, 2022
056c979
--
JessyGigato Mar 13, 2022
25333cd
fixing errors
Mar 13, 2022
e057784
-
Mar 13, 2022
1db2187
-
Mar 13, 2022
565cba3
updating ast and fixing pos
Mar 31, 2022
137e91f
fixing inference errors
JessyGigato Apr 3, 2022
7f131f8
semantic_test case done!
ycimadevila Sep 21, 2022
8d74bf3
-
ycimadevila Sep 21, 2022
e49ef63
fixing errors
ycimadevila Sep 22, 2022
e75ad07
-
ycimadevila Sep 29, 2022
4500113
coge generation ast-null
ycimadevila Oct 9, 2022
4f3bd56
new ast with types, skeleton
ycimadevila Oct 10, 2022
9ce53ed
binary and unary almost done
ycimadevila Oct 10, 2022
9aa128a
while and block almost done
ycimadevila Oct 12, 2022
948a638
var, new almost done, fixing errors, working on methCallNode
ycimadevila Oct 13, 2022
f040d94
fixing errors, casenode done
ycimadevila Oct 13, 2022
e14a3c4
updating cil nodes
ycimadevila Oct 21, 2022
1c30be0
working on ast cil, adding new features, working on cool-cil
JessyGigato Oct 25, 2022
1b42e14
starting arithmetic expression,starting main
JessyGigato Oct 25, 2022
82ad55c
fixing errors, functions almost done
ycimadevila Nov 2, 2022
c73c2a6
adding functins, error at cil.PN, cleaning function bugs
ycimadevila Nov 2, 2022
6a80b1d
cool.arithm almost done
ycimadevila Nov 2, 2022
6bcf9be
--
ycimadevila Nov 4, 2022
2d1b9eb
-, cil to mips
ycimadevila Nov 5, 2022
96406a6
fixing bugs, working on CaseNode
ycimadevila Nov 5, 2022
651307a
fixing locals, casenode
JessyGigato Nov 7, 2022
2bc88df
case almost done
JessyGigato Nov 8, 2022
0ffb0d3
mips-ast, cil-to-mips skeleton
ycimadevila Nov 8, 2022
4dc1c3a
--
ycimadevila Nov 9, 2022
1de2b15
mips arithmetics almost done
JessyGigato Nov 9, 2022
5215048
working on allocate
ycimadevila Nov 10, 2022
6f771b9
--
ycimadevila Nov 10, 2022
a4cd4c5
goto-if, dycall, stcall, comm fixed, error at alloc
ycimadevila Nov 10, 2022
c3dee1c
equal almost done(int, string) and copy
JessyGigato Nov 10, 2022
08267bc
read and print (str, int)
JessyGigato Nov 11, 2022
ac2445d
-, errors fixed, concatnode
JessyGigato Nov 11, 2022
c9838ac
typename, set/get (index, indexvalue)
ycimadevila Nov 12, 2022
ed10260
fixing formater, -
ycimadevila Nov 13, 2022
3ac2bcc
mips with error at functions, allocate fixed
ycimadevila Nov 13, 2022
9b87084
cg - hello word ok
ycimadevila Nov 13, 2022
42f6126
atoi, fib, print-cool ok
ycimadevila Nov 14, 2022
26c53da
fixing errors
ycimadevila Nov 14, 2022
75de922
formatter testing
ycimadevila Nov 15, 2022
8be7af7
--
ycimadevila Nov 16, 2022
05fc459
fixing typing
ycimadevila Nov 18, 2022
26156b6
--
ycimadevila Nov 19, 2022
e99f1b2
register fixing
ycimadevila Nov 20, 2022
d75fbe2
cg almost done
ycimadevila Nov 20, 2022
5670cbd
cleaning code
ycimadevila Nov 20, 2022
f9ecb05
--
ycimadevila Nov 20, 2022
3e7fc52
report
ycimadevila Nov 21, 2022
8fb1326
report update
ycimadevila Nov 21, 2022
d52d56d
adding pdf report
ycimadevila Nov 21, 2022
999b2b2
--
ycimadevila Nov 21, 2022
6ad2137
--
ycimadevila Nov 21, 2022
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
8 changes: 8 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"python.testing.pytestArgs": [
"tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
"python.testing.nosetestsEnabled": false
}
Binary file added doc/MIPS_Instruction_Set.pdf
Binary file not shown.
Binary file added doc/Reporte.pdf
Binary file not shown.
Binary file added doc/mips_manual.pdf
Binary file not shown.
104 changes: 104 additions & 0 deletions doc/reporte.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# Reporte

### Integrantes

#### Yasmin Cisneros Cimadevila ---- C511
#### Jessy Gigato Izquierdo ---- C511
--------------------

# Arquitectura del Compilador

La estructura del compilador la modelamos de la siguiente manera:
- Tokenizador
- Parser (en este se genera el AST)
- Proceso de Semántica:
- Colector de tipos
- Constructor de tipos
- Analisis de dependencia cíclica
- Chequeo de tipos
- Generación de Código:
- Transformación del AST
- AST COOL-CIL
- AST CIL-MIPS
- Generación del archivo .mips


## Tokenización y Parser
Para la construcción del lexer y el parser se utiliza la biblioteca `ply` de python, que provee herramientas para la generación del AST a partir de una gramática. El método de parseo utilizado fue `LALR`.

## Semántica
Del proceso de análisis de la semántica se obtiene un nuevo AST en el que cada una de sus ramas ha adquirido el significado semántico que debe tener, es decir, se asegura de que se cumplan las reglas definidas que asignan un significado lógico a las expresiones dadas por la sintaxis del lenguaje.
La evaluación de las reglas semánticas define los valores de los atributos de los nodos del AST para la cadena de entrada. Para el caso de los operadores, cada nodo de este tipo, al terminar el análisis sabe si la operación asociada es aplicable o no.
En el colector y constructor de tipos se recopilan los mismos, tanto los existentes en el lenguaje como los creados por las clases definidas en el código de entrada, y por último en el chequeo de tipos se comprueba si en el contexto dado puede ser utilizado.



## Generación de Código

En este punto ya tenemos un AST sintáctica y semánticamente correcto, y que quiere generar un programan en MIPS equivalente al código de entrada que COOL.

### Transformación del AST:
Primeramente se hacen modificaciones en el AST actual agregando una nueva funcionalidad en la que los atributos declarados pero no asignados que no perteneden a un tipo build-in (Int, Str, Bool) se les asigna una expresión nula, también en esta transformación se le asigna un constructor a las clases con el cual posteriormente se realizará la inicialización de la instancia de clase requerida.

Como pasar de COOL a MIPS directamente resulta complicado, se pasa primero del AST de COOL a un AST de CIL y luego a partir de este último se construye un AST de MIPS a partir del cual se obtiene un archivo `.mips` listo para ser ejecutado.

### AST COOL-CIL:
La necesidad principal de tener un lenguaje intermedio es facilitar la trasformacion del código al lenguaje final (MIPS) ya que este no presenta definiciones para tipos y atributos sino solamente muestra una serie de instrucciones que deben de ser ejecutadas en búsqueda de un resultado final por tanto CIL nos sirve de puente entre nuestro lenguaje de entrada (COOL) y el lenguaje de salida (MIPS). Este esta diseñado para hacer menos engorrosa la búsqueda de errores intermedios y la agrupación de código que va a ser reutilizado.
Un ejemplo donde se evidencia la utilidad de este puente es en caso del `CaseNode` ya que el lenguaje MIPS no presenta nada parecido a esta clausula por tanto este debe de pasar por un algoritmo que realice una búsqueda de tipos y semejanzas entre ellos para obtener el resultado final, en caso de que no existiera CIL sería complicadísimo lograr una compatibilidad.

### AST CIL-MIPS:
Luego de lograr una reducción intermedia del lenguaje hacia CIL se convierten cada uno de los nuevos nodos de este AST en un conjunto de intrucciones que seran llevadas directamente a lenguaje MIPS

### Puntos a destacar a nivel de implementación:
Manejo de la memoria:

El manejo de la memoria se realiza mediante el convenio de C, este hace creer a cada uno de los métodos que es dueño del stack

La sección de .data se encuentran contenidos los diferentes tipos con la siguiente estructura:
- tipo del objeto
- padre
- nombre de la dirección
- contructor
- métodos ...

El contructor es de gran ayuda ya que ayuda a aligerar código llamando a su etiqueta correspondiente cuando necesite crear una instancia de la clase en cuestión.

Con respecto a los métodos que son sobreescritos mediante herencia estos referencian a la dirección de memoria del método (la etiqueta) al cual le hacen override.

Un ejemplo visual sería el siguiente:

> ...\
> type_A: .word 56\
> type_A_inherits_from: .word type_Object\
> type_A_name_address: .word type_A_name_size\
> type_A___init__: .word function___init___at_A\
> type_A_abort: .word function_abort_at_Object\
> type_A_type_name: .word function_type_name_at_Object\
> type_A_copy: .word function_copy_at_Object\
> type_A_value: .word function_value_at_A\
> type_A_set_var: .word function_set_var_at_A\
> type_A_method1: .word function_method1_at_A\
> type_A_method2: .word function_method2_at_A\
> type_A_method3: .word function_method3_at_A\
> type_A_method4: .word function_method4_at_A\
> type_A_method5: .word function_method5_at_A
>
> type_B: .word 56\
> type_B_inherits_from: .word type_A\
> type_B_name_address: .word type_B_name_size\
> type_B___init__: .word function___init___at_B\
> type_B_abort: `.word function_abort_at_Object ` # heredado del tipo Object\
> type_B_type_name: `.word function_type_name_at_Object` # heredado del tipo Object\
> type_B_copy: `.word function_copy_at_Object` # heredado del tipo Object\
> type_B_value: `.word function_value_at_A` # heredado del tipo A\
> type_B_set_var: `.word function_set_var_at_A` # heredado del tipo A\
> type_B_method1: `.word function_method1_at_A` # heredado del tipo A\
> type_B_method2: `.word function_method2_at_A` # heredado del tipo A\
> type_B_method3: `.word function_method3_at_A` # heredado del tipo A\
> type_B_method4: `.word function_method4_at_A` # heredado del tipo A\
> type_B_method5: .word function_method5_at_B\
> ...

↑ Fragmento de código generado en el test `arith.cl` ↑

[Link del proyecto](https://github.com/ycimadevila/cool-compiler-2021)
15 changes: 6 additions & 9 deletions doc/team.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
members:
- name: Nombre Apellido1 Apellido2
github: github_id
group: CXXX
- name: Nombre Apellido1 Apellido2
github: github_id
group: CXXX
- name: Nombre Apellido1 Apellido2
github: github_id
group: CXXX
- name: Yasmin Cisneros Cimadevila
github: ycimadevila
group: C511
- name: Jessy Gigato Izquierdo
github: JessyGigato
group: C511
Loading