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

Entrega Final #55

Open
wants to merge 371 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
371 commits
Select commit Hold shift + click to select a range
2d919de
Remove unnecessary check for self declaration
cbermudez97 Oct 29, 2020
f2ddf83
Relocate process for checking cyclic inheritance in classes
cbermudez97 Oct 29, 2020
ba0e2dc
Add condition to check if it is possible to continue with semantic
cbermudez97 Oct 30, 2020
c27c21f
Fix errors in the type of error detected during the semantic checking
cbermudez97 Oct 30, 2020
73f7db2
Merge remote-tracking branch 'origin/semantic_tests' into semantic_tests
cbermudez97 Oct 30, 2020
080f1a6
Merge remote-tracking branch 'origin/tests' into semantic_tests
cbermudez97 Oct 30, 2020
14c4580
Add cbermudez branch to GitHub action configuration
cbermudez97 Oct 30, 2020
1d2c04e
Merge remote-tracking branch 'base/testsDaniel' into tests
leynier Oct 31, 2020
ececfe5
Merge remote-tracking branch 'base/testsDaniel' into tests
leynier Nov 2, 2020
2114b69
Fix error type when inheriting from basic types
cbermudez97 Nov 2, 2020
c17cea2
Fix error type when incorrectly declaring an attribute
cbermudez97 Nov 2, 2020
6684292
Add check for unique type branch in case statements
cbermudez97 Nov 2, 2020
b7417e1
Fix errors when checking functions declarations
cbermudez97 Nov 2, 2020
083bc88
Add poetry files
leynier Nov 3, 2020
286cd3a
Add requirements.txt
leynier Nov 3, 2020
a64d1f2
Add label support for base transformer
cbermudez97 Nov 5, 2020
f12e6e1
Relocate cil submodule into a separated module
cbermudez97 Nov 5, 2020
515fbcb
Create cool to cil transformer visitor class
cbermudez97 Nov 5, 2020
d2b0e29
Import cool to cil transformer visitor class
cbermudez97 Nov 5, 2020
f8ec26c
Refactor project structure
cbermudez97 Nov 5, 2020
a481cab
Refactor cil module imports
cbermudez97 Nov 5, 2020
2746b01
Link cool to cil transformer visitor class with coolc.py
cbermudez97 Nov 5, 2020
d8a569d
Fix error in import
cbermudez97 Nov 5, 2020
1f1c573
Merge remote-tracking branch 'origin/cbermudez'
cbermudez97 Nov 5, 2020
d11b28e
Create new CIL ast nodes
cbermudez97 Nov 6, 2020
952d6ab
Create cil scope helper class
cbermudez97 Nov 6, 2020
78dae80
Fix error during class attributes semantic check
cbermudez97 Nov 6, 2020
d77c23d
Refactor label naming methods
cbermudez97 Nov 6, 2020
9a1866b
Add new nodes to CIL ast formatter
cbermudez97 Nov 6, 2020
78be2b1
Add methods to get all attributes from a class and his ancestors
cbermudez97 Nov 6, 2020
fbcd779
Implement some basic visitor methods
cbermudez97 Nov 6, 2020
9d2b6ed
Add helper method for objects attributes initialization
cbermudez97 Nov 6, 2020
c756bf5
Create CIL nodes to handle arguments cleaning process
cbermudez97 Nov 7, 2020
6b434af
Implement Cool to Cil transformer visitor class methods for
cbermudez97 Nov 7, 2020
d8b08b8
Implement visitor transformer methods for Case nodes
cbermudez97 Nov 7, 2020
450d94c
Fix error during attribute initialization helper
cbermudez97 Nov 7, 2020
e885fe5
Add code to make compiler capable of generating cil files
cbermudez97 Nov 7, 2020
8917d82
Add code and cil ast nodes to build specif builtin types
cbermudez97 Nov 7, 2020
69bdf37
Implement sort of cases if CaseNode
leynier Nov 8, 2020
1158fc4
Fix error in Type get_all_methods method
cbermudez97 Nov 11, 2020
50a67fe
Implement String basic type cil code
cbermudez97 Nov 11, 2020
bdfa661
Implement IO basic type cil code
cbermudez97 Nov 11, 2020
da97b28
Fix error in basic type cil code
cbermudez97 Nov 11, 2020
5f5b66c
Fix errors when transforming FunctionCallNode and MemberCallNode
cbermudez97 Nov 11, 2020
9db7678
Add code to correctly compare strings when transforming a EqualNode
cbermudez97 Nov 11, 2020
4db1a16
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 12, 2020
72a5fc9
Include all sub types in case of node
leynier Nov 12, 2020
d4857e3
Merge branch 'feature/github-action-tests' into leynier
leynier Nov 23, 2020
c7f4fae
Revert "Merge branch 'feature/github-action-tests' into leynier"
leynier Nov 23, 2020
e752de6
Merge remote-tracking branch 'base/entrega-final' into leynier
leynier Nov 24, 2020
aedf12a
Change Cil Type Node attributes and methods order
cbermudez97 Nov 24, 2020
02223ac
Fix error in Case Node transform visitor method
cbermudez97 Nov 24, 2020
77987f0
Implement ReadIntNode, ReadStrNode, PrintIntNode, PrintStrNode
leynier Nov 24, 2020
2b51aab
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 25, 2020
c1c1aed
Add property to know the data identifier where the
cbermudez97 Nov 25, 2020
8b915b3
Add helper class to handle instances offsets to
cbermudez97 Nov 25, 2020
fb38d74
Add .mips files to .gitignore
cbermudez97 Nov 25, 2020
d463147
Implement base class for mips generation
cbermudez97 Nov 25, 2020
f287264
Implement method to initialize types data
cbermudez97 Nov 25, 2020
32ec461
Merge branch 'leynier'
leynier Nov 25, 2020
7692e85
Add structures to handle arguments offsets
cbermudez97 Nov 25, 2020
7b32de6
Add empty methods to help adding push and pop
cbermudez97 Nov 25, 2020
0b940ce
Fix errors during Cool to Cil transform
cbermudez97 Nov 25, 2020
ccd4bba
Implement basic generators methods
cbermudez97 Nov 25, 2020
e068d0a
Implement push, pop,load and store MIPS generation
tonyrbf96 Nov 25, 2020
b6d2c6a
Add MIPS syntax helper
tonyrbf96 Nov 25, 2020
2666146
Move code to .utils/mips_syntax.py
tonyrbf96 Nov 25, 2020
c411888
Fix errors in utils
tonyrbf96 Nov 25, 2020
fba849b
Use new format in Visitor
tonyrbf96 Nov 25, 2020
13d4005
Fix formatting of tests
leynier Nov 25, 2020
89253c4
Merge remote-tracking branch 'origin/tony' into leynier
leynier Nov 25, 2020
3b2238a
Fix formatting
leynier Nov 25, 2020
db4f74a
Fix CIL formatter
leynier Nov 25, 2020
b96e06c
Format CIL utils
leynier Nov 25, 2020
0c8c9a5
Add MIPS generation to binary nodes
tonyrbf96 Nov 25, 2020
47b5fad
Merge remote-tracking branch 'origin/tony' into leynier
leynier Nov 26, 2020
61318eb
Format code and exit2 syscall
tonyrbf96 Nov 27, 2020
be87f1d
Fix missing functions
tonyrbf96 Nov 27, 2020
0b0a591
Fix mips generation of basic nodes
tonyrbf96 Nov 27, 2020
c04f7bb
Add Load memory function and format MIPS instruction
tonyrbf96 Nov 27, 2020
b4de508
Re-implement the basic types in CIL
cbermudez97 Nov 27, 2020
4beb0ab
Delete Conform and add generation for TypeName and Assign Nodes
tonyrbf96 Nov 27, 2020
8f2b322
Change basic types int, bool and string to references
cbermudez97 Nov 27, 2020
8b6afa9
A lot of random stuff
tonyrbf96 Nov 27, 2020
14e4627
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
da3d0b5
Fix error in attr initialization
cbermudez97 Nov 27, 2020
3a26297
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
ed85977
Fix execution error
tonyrbf96 Nov 27, 2020
095c34e
Fix errors in built-in methods
cbermudez97 Nov 27, 2020
c064edb
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 27, 2020
4b746b2
Fix tests
leynier Nov 27, 2020
47a65b0
Fix more errors in built-in methods
cbermudez97 Nov 27, 2020
2b7919f
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
fc9e726
Fix error during Int class initialization
cbermudez97 Nov 27, 2020
f647770
Add instance addr to Dynamic Calls
cbermudez97 Nov 27, 2020
8f4a7a2
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
6db05a4
Implement methods of CIL to MIPS visitor
tonyrbf96 Nov 27, 2020
49303b6
Implement allocate
tonyrbf96 Nov 27, 2020
a02a944
Fix incorrect calls of syscall
tonyrbf96 Nov 27, 2020
f88ad93
Fix error during attr initialization
cbermudez97 Nov 27, 2020
6d20192
Merge remote-tracking branch 'origin/tony' into cbermudez
cbermudez97 Nov 27, 2020
5985a62
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
077fa55
Fix errors in basic types initializations
cbermudez97 Nov 27, 2020
63aa43d
Fix error
cbermudez97 Nov 27, 2020
af20c3b
Add long functions name to type data class
cbermudez97 Nov 27, 2020
d6da41e
Fix error in offset construction
tonyrbf96 Nov 27, 2020
ec450b5
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
7df524c
Fix dynamic call
tonyrbf96 Nov 27, 2020
32d65e4
Fix errors
cbermudez97 Nov 27, 2020
fd8f210
Fix error in SetAttr
tonyrbf96 Nov 27, 2020
eca065e
Fix store_memory
tonyrbf96 Nov 27, 2020
ea78dba
Remove tests incorrect
tonyrbf96 Nov 27, 2020
6855cf7
Print comment in mips
tonyrbf96 Nov 27, 2020
e5f7c52
Add firsts string visitors
leynier Nov 27, 2020
665982a
Fix jal
tonyrbf96 Nov 27, 2020
bea02e5
Add comments to SetAttr Node
cbermudez97 Nov 27, 2020
46b6cf1
Merge remote-tracking branch 'origin/tony' into cbermudez
cbermudez97 Nov 27, 2020
532f2e3
Fix offsets errors
cbermudez97 Nov 27, 2020
5535da9
Fix bug
leynier Nov 27, 2020
3fd9699
Merge remote-tracking branch 'origin/leynier' into tony
tonyrbf96 Nov 27, 2020
a3ad7fd
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
5e4eb4f
Fix more offsets errors
cbermudez97 Nov 27, 2020
0c9b56c
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
0cfcfe3
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 27, 2020
2ad4f14
Fix errors when calling functions
cbermudez97 Nov 27, 2020
f361da4
Use always pop
leynier Nov 27, 2020
4003813
Merge remote-tracking branch 'origin/leynier' into cbermudez
cbermudez97 Nov 27, 2020
42d22bf
StringEqual Node
tonyrbf96 Nov 27, 2020
2d256c9
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 27, 2020
cfbc0db
Fix few things
leynier Nov 27, 2020
9cd2d61
Merge remote-tracking branch 'origin/tony' into leynier
leynier Nov 27, 2020
dec1fcd
SubstringNode
tonyrbf96 Nov 27, 2020
64f887a
Add comments to auxiliar methods
tonyrbf96 Nov 27, 2020
4280e11
Temp
leynier Nov 28, 2020
73b645e
Merge remote-tracking branch 'origin/tony' into temp
leynier Nov 28, 2020
a832cbe
Fix reference treatment of attributes in string node generation
tonyrbf96 Nov 28, 2020
6a5fb88
Check int values
leynier Nov 28, 2020
a0ca5ee
Merge remote-tracking branch 'origin/tony' into temp
leynier Nov 28, 2020
e7aee69
Merge branch 'leynier' into temp
leynier Nov 28, 2020
834c015
Add indented format for MIPS
tonyrbf96 Nov 28, 2020
8b96eb7
Fix BUG!!!
leynier Nov 28, 2020
aa0fb52
Merge remote-tracking branch 'origin/tony' into leynier
leynier Nov 28, 2020
5b01946
Fix BUG!!!
leynier Nov 28, 2020
99e5277
Fix
leynier Nov 28, 2020
f08358a
Fix problem
leynier Nov 28, 2020
10d3983
Fix bugs
leynier Nov 28, 2020
2458ea6
Factorize offset calculation
cbermudez97 Nov 28, 2020
9f825de
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 28, 2020
56effba
Fix error when calculating offsets
leynier Nov 28, 2020
c5900a7
Fix errors when reading user input
leynier Nov 28, 2020
98ad0cf
Allow instantiation of basic types as Objects
leynier Nov 28, 2020
d141411
Comment prints
leynier Nov 28, 2020
afd3f9d
Fix Attribution
leynier Nov 28, 2020
04ec87a
MIPS level print for debug
tonyrbf96 Nov 28, 2020
fd0cd6f
Checking of CIL visitor
leynier Nov 28, 2020
fe2ce7c
Merge remote-tracking branch 'origin/leynier' into tony
tonyrbf96 Nov 28, 2020
49b1a24
Fix errors in Cool to Cil visitor
cbermudez97 Nov 29, 2020
f800397
Change return pack and unpack convention
cbermudez97 Nov 29, 2020
6f39cc0
Re-factor build cil implementation
cbermudez97 Nov 29, 2020
8df9bba
Fix unpack error when creating an attribute
cbermudez97 Nov 29, 2020
42ae702
Fix minor error
cbermudez97 Nov 29, 2020
319ed7e
Fix GETATTR in MIPS
leynier Nov 29, 2020
5cad937
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 29, 2020
47fad54
Remove unused imports
leynier Nov 29, 2020
09cfc65
Fix error in binary CIL nodes
leynier Nov 29, 2020
315fa3c
Fix error in NotNode
leynier Nov 29, 2020
c8394d2
Fix double unpack in assign node
cbermudez97 Nov 29, 2020
a7c1be9
Remove unnecessary unpack and pack operations
cbermudez97 Nov 29, 2020
0e09e21
Use registers T for auxiliary functions and registers S for visitors
leynier Nov 29, 2020
c9dcddd
Fix error in AssignNode
leynier Nov 29, 2020
d39cf1b
Add comment for ignore type error warning
leynier Nov 29, 2020
09515a9
Create functions to initialize instances
cbermudez97 Nov 29, 2020
52956d2
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 29, 2020
1522f56
Add Format decorator for comments and space
tonyrbf96 Nov 29, 2020
dee72a6
Implement mips code for new CIL node Abort
cbermudez97 Nov 29, 2020
f09b8c2
Merge remote-tracking branch 'origin/tony' into cbermudez
cbermudez97 Nov 29, 2020
bf1aa45
Merge remote-tracking branch 'origin/leynier' into cbermudez
cbermudez97 Nov 29, 2020
5220de8
Fix invalid annotation
cbermudez97 Nov 29, 2020
33540cc
Add checking of labels
leynier Nov 29, 2020
e0ce649
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 29, 2020
c6369d1
Add dst usage in CopyNode
tonyrbf96 Nov 29, 2020
9b35b0c
Merge remote-tracking branch 'origin/tony' into leynier
leynier Nov 29, 2020
1a890c1
Fix errors in comments
cbermudez97 Nov 30, 2020
58169cc
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 30, 2020
794cc6c
Fix comment decorator order
tonyrbf96 Nov 30, 2020
8776114
Improve and Fix naming and comments to StoreMemory method
tonyrbf96 Nov 30, 2020
3efd6ed
Fix error when allocating a string in concat node
cbermudez97 Nov 30, 2020
48c0655
Move AbortNode comment to decorator
tonyrbf96 Nov 30, 2020
fc715c2
Fix error when loading a data label
cbermudez97 Nov 30, 2020
01cc24a
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 30, 2020
8b2bd84
Factorize get features in basic_transform
tonyrbf96 Nov 30, 2020
7fc3dfd
Implement boolean not in for CIL ast
cbermudez97 Nov 30, 2020
97b565d
Merge remote-tracking branch 'origin/cbermudez' into tony
tonyrbf96 Nov 30, 2020
89befb4
Add NotNode generation
tonyrbf96 Nov 30, 2020
bc8e866
Fix check type
leynier Nov 30, 2020
74bfaca
Merge remote-tracking branch 'origin/tony' into leynier
leynier Nov 30, 2020
41fd14a
Fix error in the string equal node
cbermudez97 Nov 30, 2020
fac4144
Fix error
leynier Nov 30, 2020
75cde0a
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 30, 2020
e4941d0
Fix error
leynier Nov 30, 2020
69f7b45
Update tests folder
leynier Nov 30, 2020
db33c91
Fix error in substring methods
cbermudez97 Nov 30, 2020
d084144
Implement CopyNode, steel with error
leynier Nov 30, 2020
b9e1154
Print messages when a substring runtime error occurs
cbermudez97 Nov 30, 2020
042cdf6
Merge remote-tracking branch 'origin/leynier' into cbermudez
cbermudez97 Nov 30, 2020
92433c4
Try fix for CopyNode
leynier Nov 30, 2020
b857bae
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Nov 30, 2020
892fd56
Fix CopyNode
leynier Nov 30, 2020
a8e4e7a
Minor changes in coolc.py
cbermudez97 Nov 30, 2020
fd5e43e
Implement base project report
cbermudez97 Dec 1, 2020
a7af98c
Merge remote-tracking branch 'origin/cbermudez'
cbermudez97 Dec 1, 2020
fdd0a56
Merge remote-tracking branch 'origin/master'
cbermudez97 Dec 1, 2020
f92e8f5
Fix errors in if expressions
cbermudez97 Dec 1, 2020
4d1e32b
Add pdf
leynier Dec 1, 2020
0e1d937
Change name
leynier Dec 1, 2020
c29e4d5
Fix error when reading a string from input
cbermudez97 Dec 1, 2020
5827805
Merge branch 'master' into leynier
leynier Dec 2, 2020
10cf0f6
Fix typing
leynier Dec 2, 2020
09ffdc1
Fix read string
leynier Dec 2, 2020
95481b3
Reduce code generation by add ones the offsets of local vars in funct…
tonyrbf96 Dec 2, 2020
d9b3cdf
Reduce code in pop operation
leynier Dec 2, 2020
3a94f00
Fix addi error
tonyrbf96 Dec 2, 2020
d86a292
Merge remote-tracking branch 'origin/tony' into leynier
leynier Dec 2, 2020
3e604ec
Add zip mode generation to omit comments and spaces
tonyrbf96 Dec 2, 2020
58242c3
Fix complement node
leynier Dec 2, 2020
7552c7b
Fix wrongs uses of allocation nodes
cbermudez97 Dec 2, 2020
8121cb8
Merge remote-tracking branch 'origin/leynier' into cbermudez
cbermudez97 Dec 2, 2020
2c26025
Merge remote-tracking branch 'origin/tony' into cbermudez
cbermudez97 Dec 2, 2020
9716f04
Fix error when initializing Main instance
cbermudez97 Dec 2, 2020
388dcf8
Fix error when initializing empty strings
cbermudez97 Dec 2, 2020
503c159
Fix error when initializing empty string attributes
cbermudez97 Dec 2, 2020
ba8cf4c
Implement SetNode
leynier Dec 2, 2020
e71afbb
Implement visitor en mips
leynier Dec 2, 2020
2957886
Minor fixes in memory allocation
cbermudez97 Dec 2, 2020
136c312
Remove unnecessary comments
cbermudez97 Dec 2, 2020
715c139
Fix typing
leynier Dec 2, 2020
c5181ea
Fix use of pack and unpack in types
cbermudez97 Dec 3, 2020
dc23714
Fix wrong unpack
cbermudez97 Dec 3, 2020
9fa03ba
Fix invalid pack in type name object function
cbermudez97 Dec 3, 2020
ca96bb4
Merge branch 'master' into cbermudez
cbermudez97 Dec 3, 2020
4fe54c4
Fix project report
cbermudez97 Dec 3, 2020
d48fce5
Merge remote-tracking branch 'origin/cbermudez' into leynier
leynier Dec 3, 2020
56a53b6
Add typer
leynier Dec 3, 2020
605a1d3
Fix report
leynier Dec 3, 2020
b5d26c0
Fix report.md
leynier Dec 3, 2020
9cef975
Add report.pdf
leynier Dec 3, 2020
c2dadf1
Replace content of doc Readme.md
leynier Dec 3, 2020
8d0eb18
Update requirements.txt
leynier Dec 3, 2020
167eebe
Add to requirements.txt dev dependencies
leynier Dec 3, 2020
3050896
Merge branch 'leynier'
leynier Dec 3, 2020
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
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,9 @@ celerybeat-schedule
# mkdocs documentation
/site

# virtual env
venv/*

# mypy
.mypy_cache/
.dmypy.json
Expand All @@ -394,6 +397,7 @@ dmypy.json
.pyre/

### VisualStudioCode ###
.vscode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
Expand All @@ -407,4 +411,10 @@ dmypy.json
# End of https://www.gitignore.io/api/visualstudiocode,linux,latex,python

# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
# Cool file for test purposes
src/test.cl
# Generated CIL files
*.cil

# Generated Mips files
*.mips
2 changes: 1 addition & 1 deletion Readme.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# COOL: Proyecto de Compilación

<!-- Update the repository URL to your own -->
[![Build Status](https://travis-ci.org/matcom/cool-compiler-2020.svg?branch=master)](https://travis-ci.org/matcom/cool-compiler-2020)
[![Build Status](https://travis-ci.com/codestrange/cool-compiler-2020.svg?branch=master)](https://travis-ci.com/codestrange/cool-compiler-2020)

> Proyecto base para el compilador de 4to año en Ciencia de la Computación.

Expand Down
44 changes: 16 additions & 28 deletions doc/Readme.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,27 @@
# Documentación

> Introduzca sus datos (de todo el equipo) en la siguiente tabla:

**Nombre** | **Grupo** | **Github**
--|--|--
Nombre1 Apellido1 Apellido2 | C4xx | [@github_user](https://github.com/<user>)
Nombre2 Apellido1 Apellido2 | C4xx | [@github_user](https://github.com/<user>)
Nombre3 Apellido1 Apellido2 | C4xx | [@github_user](https://github.com/<user>)

## Readme

Modifique el contenido de este documento para documentar de forma clara y concisa los siguientes aspectos:

- Cómo ejecutar (y compilar si es necesario) su compilador.
- Requisitos adicionales, dependencias, configuración, etc.
- Opciones adicionales que tenga su compilador.

### Sobre los Equipos de Desarrollo

Para desarrollar el compilador del lenguaje COOL se trabajará en equipos de 2 o 3 integrantes. El proyecto de Compilación será recogido y evaluado únicamente a través de Github. Es imprescindible tener una cuenta de Github para cada participante, y que su proyecto esté correctamente hosteado en esta plataforma. Próximamente les daremos las instrucciones mínimas necesarias para ello.
Carlos Bermudez Porto | C412 | [@cbermudez97](https://github.com/cbermudez97)
Leynier Gutiérrez González | C412 | [@leynier](https://github.com/leynier)
Tony Raúl Blanco Fernández | C411 | [@70nybl4nc0](https://github.com/70nybl4nc0)

### Sobre los Materiales a Entregar
## Uso

Para la evaluación del proyecto Ud. debe entregar un informe en formato PDF (`report.pdf`) que resuma de manera organizada y comprensible la arquitectura e implementación de su compilador.
El documento **NO** debe exceder las 5 cuartillas.
En él explicará en más detalle su solución a los problemas que, durante la implementación de cada una de las fases del proceso de compilación, hayan requerido de Ud. especial atención.
Para instalar las dependencias deberá correr en la terminal el comando:

### Estructura del reporte
```bash
pip install -r requirements.txt
```

Usted es libre de estructurar su reporte escrito como más conveniente le parezca. A continuación le sugerimos algunas secciones que no deberían faltar, aunque puede mezclar, renombrar y organizarlas de la manera que mejor le parezca:
Para ejecutar el compilador se deberá correr en la terminal el comando:

- **Uso del compilador**: detalles sobre las opciones de líneas de comando, si tiene opciones adicionales (e.j., `--ast` genera un AST en JSON, etc.). Básicamente lo mismo que pondrá en este Readme.
- **Arquitectura del compilador**: una explicación general de la arquitectura, en cuántos módulos se divide el proyecto, cuantas fases tiene, qué tipo de gramática se utiliza, y en general, como se organiza el proyecto. Una buena imagen siempre ayuda.
- **Problemas técnicos**: detalles sobre cualquier problema teórico o técnico interesante que haya necesitado resolver de forma particular.
```bash
python coolc.py <INPUT_FILE.cl> <OUTPUT_FILE.mips>
```

## Sobre la Fecha de Entrega
Adicionalmente se le pueden adicionar al compilador diferentes argumentos opcionales. Estos argumentos son los siguientes:

Se realizarán recogidas parciales del proyecto a lo largo del curso. En el Canal de Telegram [@matcom_cmp](https://t.me/matcom_cmp) se anunciará la fecha y requisitos de cada primera entrega.
* --cil: Este argumento indica al compilador que se desea generar un archivo con el código CIL generado en las etapas intermedias del proceso de compilación.
* --verbose: Estos argumentos opcionales indican al compilador que se desea ejecutar el mismo en modo verboso. El modo verboso agrega a la salida estándar del compilador información adicional. La estructura del ast de COOL generado y datos sobre los tipos definidos en el código son parte de esta información adicional.
* --help: Estos argumentos mostrarán una ayuda mínima referente al uso del comando, así como de los demás argumentos opcionales del mismo.
89 changes: 89 additions & 0 deletions doc/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# Reporte del Proyecto de Complementos de Compilación

## Uso del Compilador

Para instalar las dependencias deberá correr en la terminal el comando:

```bash
pip install -r requirements.txt
```

Para ejecutar el compilador se deberá correr en la terminal el comando:

```bash
python coolc.py <INPUT_FILE.cl> <OUTPUT_FILE.mips>
```

Adicionalmente se le pueden adicionar al compilador diferentes argumentos opcionales. Estos argumentos son los siguientes:

* --cil: Este argumento indica al compilador que se desea generar un archivo con el código CIL generado en las etapas intermedias del proceso de compilación.
* --verbose: Estos argumentos opcionales indican al compilador que se desea ejecutar el mismo en modo verboso. El modo verboso agrega a la salida estándar del compilador información adicional. La estructura del ast de COOL generado y datos sobre los tipos definidos en el código son parte de esta información adicional.
* --help: Estos argumentos mostrarán una ayuda mínima referente al uso del comando, así como de los demás argumentos opcionales del mismo.

## Arquitectura del Compilador

El compilador cuenta con un módulo principal llamado cmp en el cual se encuentra todo el código para usar el mismo. A su vez el módulo principal está dividido en dos submódulos cool_lang y cil.

### COOL

El submódulo cool_lang contiene las herramientas para la realización de las fases de análisis lexicográfico, análisis sintáctico y análisis semántico del código escrito en COOL. Como resultado de la utilización de las herramientas de este módulo se puede obtener del código un AST válido.

Las principales clases para realizar estos procesos son:

* COOL_LEXER: Esta clase es la encargada de la tokenización del código escrito en el archivo de entrada y notificar los posibles errores léxicos en los mismos.
* COOL_PARSER: Esta clase permite a partir del código tokenizado construir el AST de COOL y notificar los posibles errores sintácticos.
* COOL_CHECKER: Esta clase es la encargada de realizar los diferentes recorridos al AST de para verificar que este correcto y de notificar de los errores encontrados. En adición a la verificación de errores sintácticos, se producirá también una clase Context con todos los datos necesarios acerca de los tipos definidos en el código.

### CIL

El submódulo cil contiene las herramientas necesarias para obtener un código de MIPS a partir de un AST correctamente verificado. Como pasos intermedios se genera un AST de CIL, siendo posible obtener también un código en este lenguaje.

Para esta tarea las principales clases usadas son:

* COOL_TO_CIL_VISITOR: Esta clase es la encargada de transformar el AST de COOL en un AST de CIL. Ya en esta fase se asume que los errores en la entrada no existen y que el AST de COOL es uno correcto.
* CIL_TO_MIPS: Esta clase permite generar de un AST de CIL el código MIPS equivalente al mismo.

## Problemas técnicos

Como se puede observar por lo anteriormente descrito el proceso de compilación ocurrió en cinco fases, tres de ellas enfocadas en la validación y corrección de errores en la entrada y dos de ellas en la generación de código MIPS.

A continuación se enumeran algunas de las decisiones tomadas durante las distintas fases del proceso.
Las fases de análisis léxico y sintáctico se completaron de manera normal, haciendo uso de las definiciones de tokens dadas por el Manual de COOL. Sin embargo, la gramática de COOL definida en el Manual es ambigua, y por tanto, requirió que su transformación a una gramática que no lo fuera. Para estas tareas se utilizó el módulo de Python ply. Esta herramienta se utilizó para definir las expresiones regulares para los tokens y para la definición de la gramática LR equivalente a la de COOL.

De igual forma durante la fase de análisis semántico se utilizaron tres recorridos para realizar la validación del AST construido.

El primero de los recorridos fue el encargado de recolectar todos los tipos definidos. Al finalizar la recolección se verificó que no existiera herencia cíclica en la jerarquía de tipos. Una vez que se verificó esto se tomó la decisión de ordenar los nodos del AST que representan a las definiciones de clases de forma que en los siguientes recorridos si se visita una definición de un tipo su tipo padre ya habrá sido visitado. Esto se puede lograr ya que la jerarquía de CIL está unificada en la clase Object.

El segundo de los recorridos fue el encargado de construir los tipos recolectados en el primero. En este segundo recorrido fue donde se agregó la información referentes a los tipos básicos que trae el lenguaje y que el programador puede usar sin haberlos definido. Esta información, si bien carecía de estructuras en el AST, garantiza la correcta evaluación futura de las reglas de tipos.

El tercer recorrido fue el encargado propiamente de realizar el análisis semántico del AST. Esto fue posible de hacer gracias a la información obtenida en los recorridos anteriores. Este análisis se realizó siguiendo las reglas definidas en el Manual.

Una vez realizado el análisis semántico se pasa a la generación de código. Como primer paso para esto se definió el lenguaje intermedio CIL siendo usado como base para el mismo algunas de las ideas dadas en el curso anterior. Si bien muchas definiciones son compartidas si se agregaron muchos nuevos nodos para expresar diferentes acciones y otros fueron transformados. Es objetivo de CIL alcanzar un equilibrio entre la abstracción que brinda COOL y una cierta cercanía en estructura a MIPS que permitiera luego una mejor y más sencilla transformación hacia MIPS.

Del AST obtenido en las fases anteriores se realizó una transformación hacia un AST de CIL que expresara el mismo comportamiento que el construido en COOL.

En esta fase surgió la necesidad de resolver el problema de los tipos por valor Int y Bool, y de los Strings como casos especiales, al ser usados como un objeto por referencia. Para esto se definió una representación en memorias para los casos en que esto ocurriera. Todos estos tipos cuando fuera necesario tratarlos como objetos por referencias, para por ejemplo acceder a las funciones heredadas de la clase Object o las propiamente definidas por el tipo String, serían encapsulados en instancias similares a los otros tipos, la cual contaría con un atributo value en el cual se almacenaría el valor real de los mismos.

Es también en esta fase donde se da por fin una implementación real a los tipos y funciones básicas definidas por el lenguaje. Estas hacen uso de nodos especiales del AST que solo son instanciadas para su uso desde COOL a través de las funciones básicas. Ejemplo son los métodos para la entrada y salida de datos brindada por la clase IO. Con estas estructuras definidas en el AST de CIL, durante la traducción a MIPS, ellas serán generadas automáticamente.

Un caso notable en esta transformación es el de las expresiones del tipo case. La naturaleza de esta expresión implica que sea posible conocer cuando el tipo dinámico de una expresión es subtipo de otro. Debido a la complejidad de realizar esta operación tanto en CIL como en MIPS se decidió realizar una transformación al AST de las expresiones case durante la traducción. Para esto se agregaron nuevos nodos de forma que la evaluación del case cambiará. La idea para esto fue agregar todos los subtipos de todas las clases usadas en el case al mismo y que tuvieran como cuerpo la misma expresión que tiene el padre más cercano definido en el case original. Luego estos fueron reordenados desde el más específico hasta el más general. Esta reordenación permitió que solo hiciera falta verificar que el tipo dinámico de la expresión case fuera el mismo que el del caso analizado, y que fuera el primero que cumpliera esto el caso correcto a aplicar.

En la última fase de generación se hizo importante definir lo que sería la estructura de la instancia un tipo en memoria. Según las principales necesidades de los nodos más abstractos de CIL, se trató de que la información necesaria para el correcto funcionamiento de los mismos estuviera presente en cada instancia de un tipo cualquiera. Esto para eliminar la necesidad de crear cualquier estructura de un tipo y evitar realizar operaciones complejas en MIPS. También se buscó lograr una forma en que se pudiera cumplir con el comportamiento polimórfico de los tipos.

Según estas necesidades la representación de las instancias de los tipos en memoria puede verse de la siguiente forma:

| Representación en Memoria |
|:------------------------------------------:|
| Tipo |
| Nombre del Tipo |
| Tamaño en Memoria |
| Atributos y funciones de las clases padres |
| Atributos propios |
| Funciones propias |

En esta estructura los tipos tendrán siempre alcanzable y a posiciones fijas los siguientes datos:

* Un entero que identifica únicamente a las instancias de un mismo tipo. Dos instancias serán del mismo tipo si sus enteros de tipo son iguales.
* Un entero que será la referencia al inicio de un string, previamente almacenado en memoria, que contiene el nombre del tipo.
* Un entero que es el valor el tamaño de la instancia en memoria.
* Luego enteros que referencian a los atributos y funciones del tipo instanciado. Estos, para permitir el polimorfismo, se ordenarán siguiendo el orden en que fueron declarados a lo largo de la jerarquía del tipo instanciado, desde el más general hasta el más específico. Por ejemplo si tenemos los tipos A, B y C. Primero se encontrarán los atributos de A, luego las funciones de A, los atributos de B, las funciones de B, los atributos de C y por último las funciones de C. Cada grupo de atributos o funciones estarán ordenados según el orden en que fueron declarados en ese tipo. Si alguna función de un tipo más general es sobre escrita por algún tipo más específico esta seguirá apareciendo en el conjunto del tipo más general y no en la del específico, pero con la referencia cambiada hacia la dirección de la nueva implementación. Esto permite que si un C es tratado como un A llamadas a funciones de A ejecutarán las funciones sobre escritas de C.
Binary file added doc/report.pdf
Binary file not shown.
Loading