Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
3ff8943
Lexing and parsing, falta correr sendos tests
Yumenio Mar 10, 2021
4e5b176
pasados tests de lexer, falta ver lo del estado del string
Regnod Mar 14, 2021
f08d492
agregando estado del string en lexer.py
Yumenio Mar 14, 2021
ddf79a8
merge del estado string con los errores del lexer, falta arreglar el …
Yumenio Mar 14, 2021
bc7bff6
going to merge
Regnod Mar 15, 2021
077cb05
fixed wrong counting
Regnod Mar 15, 2021
3ace997
Pasados todos los tests del parser
Yumenio Apr 9, 2021
db30d2d
salva
Regnod Apr 9, 2021
e122e9a
salva
Regnod Apr 9, 2021
0ef3d53
pull exitoso
Regnod Apr 9, 2021
0bc825f
añadiendo una lista de tokens a los nodods del ast
Regnod Apr 13, 2021
05dafe9
finishing semantics
Regnod Aug 6, 2021
879d3b6
adding cil ast and visitor with class declaration node done
Regnod Aug 17, 2021
8266445
enganchando el visitor para traducir a CIL
Yumenio Aug 19, 2021
dd09029
merging
Regnod Aug 19, 2021
14ee851
trying to update
Regnod Aug 21, 2021
0eba71f
merge some advances
Regnod Sep 14, 2021
d03bf98
Merge parcial del codegen
Yumenio Sep 14, 2021
75bd9e5
finished merging some codegen nodes
Yumenio Sep 14, 2021
549aa20
Some more nodes of codegen
Yumenio Sep 17, 2021
b10f93e
getting some changes
Regnod Sep 18, 2021
8b8d8e9
getting back to work
Yumenio Feb 10, 2022
b6cac38
...
Regnod Feb 10, 2022
b63f318
...
Regnod Feb 10, 2022
62f98bd
after merge
Regnod Feb 10, 2022
423b079
implemented WhileNode, LesNode, LeqNode, EqualNode, StrinNode
Yumenio Feb 10, 2022
8ff4037
res
Yumenio Feb 10, 2022
91975fd
correcting some nodes at cil_ast
Yumenio Feb 21, 2022
bc2fac9
going to pull changes
Regnod Feb 22, 2022
021cace
push antes de los cambios de richard al cool_to_cil con el switch cas…
Yumenio Feb 22, 2022
c96c5a9
pushing
Regnod Feb 22, 2022
735a47b
added an index to the attrs of a type
Yumenio Feb 22, 2022
fa2da57
fixed a bug where object functions weren't being added to the user de…
Yumenio Feb 22, 2022
70bc283
added boolean operator nodes to cil ast and added the abort call in c…
Yumenio Feb 22, 2022
b54cfbe
some changes
Yumenio Feb 22, 2022
5195027
i've completed some of the missing ones and fixed some others with th…
Regnod Feb 22, 2022
11bf94b
cool2cil check
Regnod Feb 22, 2022
36db263
cool2cil check
Regnod Feb 22, 2022
0576346
created the built_in functions class nodes
Yumenio Feb 22, 2022
45210c4
merged
Yumenio Feb 22, 2022
727a8d6
merged
Yumenio Feb 22, 2022
156a99c
mips visitor
Regnod Feb 23, 2022
85d0f7f
mips visitor
Regnod Feb 23, 2022
69d7a08
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Regnod Feb 23, 2022
07c2885
before editing the cool2cil attrNode
Yumenio Feb 23, 2022
f9fc6d7
commenting mips_utils :)
Regnod Feb 23, 2022
c8f25c4
added the constructor and the initialization of the class attributes,…
Yumenio Feb 23, 2022
778d5b7
some ciltomips code
Regnod Feb 23, 2022
5c3d815
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Regnod Feb 23, 2022
5d319e2
merge
Regnod Feb 23, 2022
c831670
main test
Regnod Feb 23, 2022
73faaef
main test
Regnod Feb 23, 2022
fa9ed19
some more changes to how the constructor is generated, aligning the s…
Yumenio Feb 23, 2022
4456146
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Yumenio Feb 23, 2022
e642474
added some missing properties to cil2mips object and initialized them…
Yumenio Feb 23, 2022
2489ab2
ejasi
Regnod Feb 24, 2022
79c9437
...
Regnod Feb 24, 2022
8d2252a
///
Regnod Feb 24, 2022
bb7cafd
...
Regnod Feb 24, 2022
94dd462
puleando las cosas pa los test
Yumenio Feb 24, 2022
a1740a9
merge
Yumenio Feb 24, 2022
cbf1fdd
some tests passed
Yumenio Feb 24, 2022
e586b39
fixed the error concatenation in the pipeline
Yumenio Feb 24, 2022
6535d49
test passed succsesfuly
Regnod Feb 24, 2022
9367dfb
env
Regnod Feb 24, 2022
95b36aa
env
Regnod Feb 24, 2022
188f21d
env
Regnod Feb 24, 2022
00f39bb
before pulling the corrections to the tests
Yumenio Feb 24, 2022
54fb659
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Yumenio Feb 24, 2022
901fd88
fixed the covariance bugs
Yumenio Feb 24, 2022
01fbefd
adding some mip code
Regnod Feb 24, 2022
23838fe
merge
Regnod Feb 24, 2022
f2de556
all builtin and constructors done, now going to rollback the semantic…
Yumenio Feb 24, 2022
d17c67b
rolled back the semantic checker changes, now it should pass 3/4 of t…
Yumenio Feb 24, 2022
a4605d3
rolled back the semantic changes and merged with master, gotta run ag…
Yumenio Feb 24, 2022
f6b71ce
IO builtin functions done
Yumenio Feb 25, 2022
408ec0b
some mip coded
Regnod Feb 25, 2022
0c4b575
merged
Regnod Feb 25, 2022
42b1822
setattrb and getattrb
Regnod Feb 25, 2022
76fc150
added some more info to be retrieved from cil ast
Yumenio Feb 25, 2022
c1bbd63
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Yumenio Feb 25, 2022
fc9e463
added properties to cil to mips visitor with the program node
Yumenio Feb 25, 2022
a3bcd7e
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Regnod Feb 25, 2022
0121406
npi
Yumenio Feb 25, 2022
ff13acb
some more mips ...
Regnod Feb 25, 2022
2dd84c2
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Yumenio Feb 25, 2022
882e69c
generated simple code for out_int and out_string
Yumenio Feb 25, 2022
c3a2ad8
more of mips
Regnod Feb 25, 2022
988f580
merged
Regnod Feb 25, 2022
98e4eb6
last commit before failin the tests :D
Yumenio Feb 26, 2022
c772d97
removed all lines and columns, i think
Yumenio Feb 26, 2022
fa5aaa2
before adding cil2mips visitor
Yumenio Feb 26, 2022
518274a
cil being regenerated
Yumenio Feb 26, 2022
67a4f84
before merging the new cil2mips
Yumenio Feb 26, 2022
dac71dc
i think it works now
Yumenio Feb 27, 2022
e6e923a
before creating moar scopes
Yumenio Feb 27, 2022
6a648aa
before noting all types in semantics
Yumenio Feb 27, 2022
95bcf8e
preparing to add the cil2mips code
Yumenio Feb 28, 2022
fc04e4d
mips
Regnod Feb 28, 2022
f18de3b
changes
Regnod Feb 28, 2022
2b6cc6c
merge
Regnod Feb 28, 2022
fad6439
siuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
Regnod Feb 28, 2022
b8cb66c
cleansing
Regnod Feb 28, 2022
516921e
before last pull
Yumenio Feb 28, 2022
365202f
report.md and report.pdf added
Regnod Feb 28, 2022
d9eb2c1
report.md and report.pdf added
Regnod Feb 28, 2022
b8fb20f
npi
Yumenio Feb 28, 2022
a141bfe
Merge branch 'master' of https://github.com/Santa-Fe-S-A/cool-compile…
Yumenio Feb 28, 2022
b7c6933
wording 1
Yumenio Feb 28, 2022
d535eca
tweaking a bit cool to cil
Yumenio Feb 28, 2022
aaffb30
whoops }
Yumenio Feb 28, 2022
110702c
good again
Yumenio Feb 28, 2022
837d108
hmmmmm
Yumenio Feb 28, 2022
7ea94b0
final tweaking to cil ast structure and labels
Yumenio Mar 1, 2022
00fa508
fixing the commented scripts in the tests
Yumenio Mar 1, 2022
e146aa8
...
Regnod Mar 1, 2022
1702543
merge
Regnod Mar 1, 2022
3791e12
merge
Regnod Mar 1, 2022
63ee120
last commit before pull and subsequent pr
Yumenio Mar 1, 2022
dbdf3ac
final commit
Yumenio Mar 1, 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
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@

# Created by https://www.gitignore.io/api/visualstudiocode,linux,latex,python
# Edit at https://www.gitignore.io/?templates=visualstudiocode,linux,latex,python

CooltoCilM
imm.asm
asd.mips
src/mmips
src/visitors/Cil2MipsCurrent.py
#CooltoCilA
### LaTeX ###
## Core latex/pdflatex auxiliary files:
*.aux
Expand Down
93 changes: 93 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
{
"cSpell.words": [
"acker",
"addi",
"addiu",
"addu",
"ademas",
"adjuntos",
"adyacente",
"agregarlos",
"ahora",
"alloc",
"ancestros",
"argumentos",
"asciiz",
"atributo",
"atributos",
"basicos",
"beqz",
"bnez",
"bools",
"busca",
"casos",
"cattrs",
"ccur",
"cpar",
"ctrs",
"ctype",
"cualquier",
"cval",
"deberia",
"definir",
"deje",
"dfunc",
"digrafo",
"direccion",
"dividir",
"dparents",
"dtypes",
"dvars",
"ehhhhhhhhhhh",
"ehhhhhhhhhhhh",
"encapsulada",
"esac",
"esto",
"estos",
"excepcion",
"existe",
"funciones",
"hecho",
"heeerreeee",
"heerrrre",
"hice",
"hijo",
"idealmente",
"Infered",
"Inferencer",
"Inmediate",
"isntance",
"isvoid",
"jachtagsad",
"lanzar",
"límite",
"lneq",
"mano",
"menos",
"mismo",
"mult",
"multply",
"nval",
"ocur",
"opar",
"parentesis",
"pnode",
"proto",
"ptype",
"pusieron",
"recorrer",
"referencia",
"reservada",
"reservar",
"rqueue",
"sobrescribiendo",
"subu",
"tipe",
"tipo",
"toca",
"trozo",
"typex",
"visitar",
"vtype"
]
}
66 changes: 66 additions & 0 deletions doc/Report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Compilación

### Proyecto Cool Compiler 2021-2022:

##### Integrantes:

-Richard García De la Osa C-412. richard.garcia@estudiantes.matcom.uh.cu.

-Andy A. Castañeda Guerra C-412. andy.castaneda@estudiantes.matcom.uh.cu.



#### Uso del compilador:

Para usar nuestro compilador deberá ejecutar en la consola el siguiente comando:

```bash
bash coolc.sh $INPUT_FILE
```

El archivo __INPUT_FILE__ debe tener extension .cl, correspondiente a un programa del lenguaje Cool.

Este comando generará un fichero con igual nombre pero con extensión .mips, el cual estará listo para ser ejecutado. Para ejecutar el __INPUT_FILE__ (el cual debe tener extensión .mips) deberá usar el siguiente comando en la consola:

```bash
spim -file $INPUT_FILE
```

No hay otros parámetros adicionales para ejecutar nuestro compilador.

#### Arquitectura del compilador:

El proyecto tiene la siguiente estructura:

###### Módulos:

-lexer: Este módulo está compuesto por __lexer.py__. En este archivo se encuentran las reglas lexicográficas para tokenizar un programa (texto) escrito el __COOL__. Se utiliza la biblioteca __PLY__ de python.

-c_parser: Este módulo está compuesto por __parser.py__ y __parsetab.py__. En el archivo __parser.py__ están escritas las producciones de la gramática utilizada por nosotros para generar un __AST__ de __COOL__ estructurado a nuestra conveniencia. Por otra parte __parsetab.py__ es un archivo generado por la biblioteca __PLY__ al ejecutar el parser en conjunto con el __lexer.py__ antes mencionado. Este contiene especificaciones sobre el método de parsing utilizado así como los tokens asociados a sus producciones.

-cool_ast: En este módulo se encuentra el archivo __cool_ast.py__ el cual contiene los nodos del __AST__ de __COOL__ que consideramos necesarios para la implementación de nuestro compilador.

-cil_ast: En este módulo se encuentra el archivo __cil_ast.py__ el cual contiene los nodos del __AST__ del código intermedio generado (__CIL__) que utilizamos para traducir el código de __COOL__ a instrucciones sencillas de forma que sea más fácil transformarlo a código __mips__.

-utils: Compuesto por __errors.py__, este contiene el formato de los errores lexicográficos, sintácticos y semánticos que empleamos durante los recorridos al __AST__. Luego encontramos __mip_utils__ donde podemos encontrar 3 clases que son utilizadas durante la conversión de __CIL__ a __mips__ para acceder de manera más sencilla a los strings de los operadores, registros y tipos de datos en __mips__. El archivo __semantic.py__ es uno de los módulos obtenidos durante el desarrollo de las clases prácticas, con algunas modificaciones.

-visitors:

​ -__collector.py__: contiene el visitor utilzado solo para registrar los tipos del programa en un objeto context el cual es importado de __semantic.py__. Este visitor solo recorre los nodos que representan declaraciones de clases.

​ -__builder.py__: primeramente definimos los tipos básicos de __COOL__ así como sus funciones built_in. Además visitamos todos los tipos ya recogidos en el colector para registrar sus métodos y atributos (features). Finalmente nos construimos el grafo de herencia de los tipos para asegurarnos de que no existan ciclos en este.

​ -__checker.py__: revisamos que el programa esté semánticamente correcto. Es decir, una vez nuestro programa es sintácticamente válido corresponde asegurarnos que los tipos de las variables y funciones estén en correspondencia con el contexto en el que se usan. También anotamos a cada nodo su tipo estático para posterior uso durante la generación de código intermedio. Cada nodo existe en un ámbito específico en el cual son visibles variables locales y de ámbitos más externos; cada vez que se visita un nodo se crea un ámbito nuevo en el cual se registren sus variables locales para aquellos casos en los que unas variables solapan a otras con el mismo lexema pero en ámbitos padres.

​ -__CooltoCill.py__: aca realizamos otro recorrido sobre el __AST__ de __COOL__ con el cual traducimos las instrucciones de alto nivel a instrucciones que simplifiquen el proceso de generar código mips. Nuestro __CIL__ está compuesto por tres secciones: data, donde se registran todas aquellas cadenas de caracteres ya sea especificados por el usuario o por nosotros para lanzar errores en ejecución; type, compuesta por estructuras que agrupan todos los métodos y atributos de cada tipo (features), para luego en la traducción a mips poder organizar de manera más fluida el direccionamiento a estos; por último code, en este se encuentran agrupadas en estructuras el código intermedio generado para cada una de las funciones de los tipos del programa (contructores, built in y definidas por el usuario). Durante el recorrido por los nodos del __AST__ de __COOL__ se genera a la par un nuevo __AST__ esta vez de __CIL__ para luego traducir a __mips__.

​ -__CiltoMips.py__: se utiliza el __AST__ de __CIL__ generado por el recorrido anterior para traducir cada nodo a una secuencia de instrucciones en __mips__ correspondientes al mismo. Primero se visitan los nodos que se encuentran en la sección de data luego la sección de type y por último la sección de code y de esta forma queda organizado el programa en __mips__ añadiendole al final algunas funciones por defecto como 'alocate' para reservar memoria y otras.

#### Problemas técnicos:

El mayor desafío de implementación que encontramos fue la correcta generación a código intermedio para su posterior traducción a código __mips__ de los nodos __switchcase__ del __AST__ de __COOL__.

Para ello organizamos las ramas del nodo de mayor a menor, donde las mayores son aquellas cuyo tipo se encuentra a mayor profundidad en el árbol de herencia del programa. Por cada una de estas ramas recorremos el subárbol cuya raiz es el tipo actual de la rama, registrando un salto al label asociado a esta rama. Al recorrer cada uno de estos subárboles, si coincide en algún tipo de este, podemos asegurar que este es el menor tipo que lo conforma (dado que recorremos las ramas en orden decreciente en profundida).



Binary file added doc/Report.pdf
Binary file not shown.
1 change: 1 addition & 0 deletions doc/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

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: Andy Alejandro Castañeda Guerra
github: Yumenio
group: C412
- name: Richard García De la Osa
github: Regnod
group: C412
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pytest
pytest-ordering
ply
12 changes: 12 additions & 0 deletions src/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"cSpell.words": [
"addi",
"addiu",
"addu",
"asciiz",
"heeerreeee",
"heerrrre",
"proto",
"subu"
]
}
30 changes: 30 additions & 0 deletions src/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import sys
import lexer.lexer as lexer
import c_parser.parser as parser
from pipeline import Pipeline

def main():
if len(sys.argv) > 1:
input_file = sys.argv[1]
else:
# input_file = "./tests/codegen/basic.cl"
raise Exception("Incorrect number of arguments")

program_file = open(input_file)
program = program_file.read()
program_file.close()

pipe = Pipeline(program, lexer.CoolLexer(), parser.CoolParser())
if pipe.errors:
for error in pipe.errors:
print(error)
exit(1)
else:
out_file = input_file.split(".")
out_file[-1] = "mips"
out_file = ".".join(out_file)
with open(out_file, 'w') as f:
f.write(pipe.mipsCode)

if __name__ == "__main__":
main()
Loading