Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
314 commits
Select commit Hold shift + click to select a range
476bcba
some updates
dfiallo35 Nov 23, 2023
054049b
Merge pull request #17 from dfiallo35/fix-parser
dfiallo35 Nov 23, 2023
c252ff7
some updates
dfiallo35 Nov 23, 2023
3539643
Merge pull request #18 from dfiallo35/fix-parser
dfiallo35 Nov 23, 2023
64f3469
Update classdef.py
lauolivia Nov 23, 2023
966cae7
Update program.py
lauolivia Nov 23, 2023
15aa32a
adapt project
dfiallo35 Nov 23, 2023
d1b79d7
Merge pull request #19 from dfiallo35/fix-parser
dfiallo35 Nov 23, 2023
1d569f1
semantic_update
lauolivia Nov 23, 2023
f49714e
Create test_semantic_check.py
lauolivia Nov 23, 2023
17191b6
update
dfiallo35 Nov 23, 2023
1e79688
Merge remote-tracking branch 'origin/master' into semantic
dfiallo35 Nov 23, 2023
0e4bc99
update
dfiallo35 Nov 23, 2023
88f2e5e
fixing_semantic
lauolivia Nov 24, 2023
8b9bf24
Merge pull request #20 from dfiallo35/semantic
lauolivia Nov 24, 2023
6547ce1
errors update
dfiallo35 Nov 24, 2023
7b3a54a
Merge remote-tracking branch 'origin/master' into error
dfiallo35 Nov 24, 2023
f0e228b
make tokens for lexer and nodes for parser
dfiallo35 Nov 24, 2023
0632363
Merge remote-tracking branch 'origin/master' into error
dfiallo35 Nov 24, 2023
bc5879b
Merge pull request #21 from dfiallo35/error
dfiallo35 Nov 24, 2023
5ef9bed
class_semantic_fixed1
lauolivia Nov 24, 2023
6fd0be9
class_semantic_fixed_2.0
lauolivia Nov 24, 2023
2e5cb67
Merge pull request #22 from dfiallo35/semantic
lauolivia Nov 24, 2023
2a8a638
fix sly lexer
dfiallo35 Nov 24, 2023
6a81078
Merge remote-tracking branch 'origin/master' into error
dfiallo35 Nov 24, 2023
b4a58d0
Merge pull request #23 from dfiallo35/error
dfiallo35 Nov 24, 2023
0dd09fb
updates
lauolivia Nov 24, 2023
c1904d8
Merge branch 'master' into semantic
lauolivia Nov 24, 2023
e80a7c2
lexer ok
dfiallo35 Nov 24, 2023
db3949b
Merge pull request #24 from dfiallo35/error
dfiallo35 Nov 24, 2023
5a25517
lexer and parser ok
dfiallo35 Nov 24, 2023
cfb608c
Merge pull request #25 from dfiallo35/error
dfiallo35 Nov 24, 2023
22367d6
Update test_semantic_check.py
lauolivia Nov 25, 2023
cdafc45
Update tocheck.md
lauolivia Nov 25, 2023
1911257
Update visitor.py
lauolivia Nov 25, 2023
19889c8
Merge branch 'master' into semantic
lauolivia Nov 25, 2023
e9642cd
Merge pull request #26 from dfiallo35/semantic
lauolivia Nov 25, 2023
3d0ce1e
Update visitor.py
lauolivia Nov 25, 2023
bff00d2
column_nodes
lauolivia Nov 25, 2023
21efc00
Update parser.py
lauolivia Nov 25, 2023
c2ad103
Update test_semantic_check.py
lauolivia Nov 25, 2023
7ad8f48
Merge pull request #27 from dfiallo35/semantic
lauolivia Nov 25, 2023
ccbd524
update errors to list of errors
dfiallo35 Nov 25, 2023
8a92f21
Merge remote-tracking branch 'origin/master' into error
dfiallo35 Nov 25, 2023
b069332
Update visitor.py
lauolivia Nov 25, 2023
e5f560c
Merge branch 'master' into semantic
lauolivia Nov 25, 2023
c197666
updates
dfiallo35 Nov 25, 2023
75a6a31
Merge pull request #28 from dfiallo35/error
dfiallo35 Nov 25, 2023
3a8f347
Update visitor.py
lauolivia Nov 25, 2023
764c25d
Merge branch 'master' into semantic
lauolivia Nov 25, 2023
d703620
semantic_testing
lauolivia Nov 26, 2023
25097f0
Merge pull request #29 from dfiallo35/semantic
lauolivia Nov 26, 2023
9966430
Update visitor.py
lauolivia Nov 26, 2023
c6088b3
inheritance_working
lauolivia Nov 26, 2023
d08b472
Update program.py
lauolivia Nov 26, 2023
2da5cdb
Update visitor.py
lauolivia Nov 26, 2023
408767c
Update visitor.py
lauolivia Nov 27, 2023
a461a30
Merge pull request #30 from dfiallo35/semantic
lauolivia Nov 27, 2023
6a95642
initialize codegen
dfiallo35 Nov 27, 2023
8c916fe
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Nov 27, 2023
1c62010
update
dfiallo35 Nov 27, 2023
79d2266
Merge pull request #31 from dfiallo35/codegen
dfiallo35 Nov 27, 2023
9634e03
add formals class
dfiallo35 Nov 27, 2023
68803b0
update tocheck.md
lauolivia Nov 27, 2023
4f214d5
Update classdef.py
lauolivia Nov 27, 2023
c3dc516
Update visitor.py
lauolivia Nov 27, 2023
8e7f897
Merge pull request #32 from dfiallo35/semantic
lauolivia Nov 27, 2023
df031ad
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Nov 27, 2023
546f83e
inherits_instance
lauolivia Nov 27, 2023
0d49ec7
Update tocheck.md
lauolivia Nov 27, 2023
9c4350a
Update visitor.py
lauolivia Nov 27, 2023
79c24a5
Update tocheck.md
lauolivia Nov 27, 2023
75910e9
new_variables
lauolivia Nov 28, 2023
7715fcd
Update variable.py
lauolivia Nov 28, 2023
7782782
Merge pull request #33 from dfiallo35/semantic
lauolivia Nov 28, 2023
b0e5c27
update
dfiallo35 Nov 28, 2023
cc3aa6a
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Nov 28, 2023
b9a3757
set_variable_off
lauolivia Nov 29, 2023
264dac3
Create basic_classes.py
lauolivia Nov 29, 2023
24691bc
Update visitor.py
lauolivia Nov 29, 2023
e9daea7
Update visitor.py
lauolivia Nov 29, 2023
a7a8b5a
Update visitor.py
lauolivia Nov 29, 2023
eea043b
Merge pull request #34 from dfiallo35/semantic
lauolivia Nov 29, 2023
639cffe
Update visitor.py
lauolivia Nov 29, 2023
49cb55b
create_all_features_and_inherited_dict_
lauolivia Nov 29, 2023
0372d8c
stable_again
lauolivia Nov 29, 2023
d0c2de4
first_dispatch_test_passed
lauolivia Nov 30, 2023
1bfa39d
save_before_visitor_method
lauolivia Nov 30, 2023
8e8f1a0
update
dfiallo35 Nov 30, 2023
b231ab3
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Nov 30, 2023
b2024b1
create_IO_Object
lauolivia Nov 30, 2023
2eb43e0
Update parser.py
lauolivia Nov 30, 2023
41a060b
Merge branch 'master' into semantic
lauolivia Nov 30, 2023
a9a6a3f
update
dfiallo35 Nov 30, 2023
d433168
Merge pull request #35 from dfiallo35/semantic
lauolivia Nov 30, 2023
e8350c3
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Nov 30, 2023
6af68c4
Merge pull request #36 from dfiallo35/codegen
dfiallo35 Nov 30, 2023
07bec61
fix things
dfiallo35 Nov 30, 2023
4d48e31
Merge pull request #37 from dfiallo35/codegen
dfiallo35 Nov 30, 2023
9bd1325
Update test_error.py
lauolivia Nov 30, 2023
488acfa
Merge remote-tracking branch 'origin/master' into semantic
lauolivia Nov 30, 2023
567e41b
stable_again
lauolivia Nov 30, 2023
86fa59e
add self
lauolivia Nov 30, 2023
613ff44
updates in codegen
dfiallo35 Nov 30, 2023
363a181
Update visitor.py
lauolivia Nov 30, 2023
63c0103
dispatch_passed
lauolivia Nov 30, 2023
6767704
Update visitor.py
lauolivia Nov 30, 2023
d31063e
Merge pull request #38 from dfiallo35/semantic
lauolivia Nov 30, 2023
7fa361a
Update variable.py
lauolivia Dec 1, 2023
7b76978
Update expr.py
lauolivia Dec 1, 2023
c52b940
Update visitor.py
lauolivia Dec 1, 2023
1dc30f6
class_change
lauolivia Dec 1, 2023
53375f2
some_lets
lauolivia Dec 1, 2023
7a62897
more_test
lauolivia Dec 1, 2023
bf9a554
lets_ok
lauolivia Dec 1, 2023
81e5d02
Update visitor.py
lauolivia Dec 1, 2023
876baed
Update visitor.py
lauolivia Dec 1, 2023
38e3a8c
self_
lauolivia Dec 1, 2023
f3182e9
self
lauolivia Dec 1, 2023
6f4f26a
Merge branch 'master' into semantic
lauolivia Dec 1, 2023
720680d
Merge pull request #39 from dfiallo35/semantic
lauolivia Dec 1, 2023
e353d8d
loops
lauolivia Dec 1, 2023
684c7da
case_working
lauolivia Dec 1, 2023
8405e19
Update visitor.py
lauolivia Dec 1, 2023
b0a0dd0
many_test
lauolivia Dec 1, 2023
d5ea49b
Update visitor.py
lauolivia Dec 1, 2023
2f118e8
semantic_check_without_column
lauolivia Dec 1, 2023
1203db1
Merge pull request #40 from dfiallo35/semantic
lauolivia Dec 1, 2023
e51ada3
cols_start
lauolivia Dec 1, 2023
618ed27
Update parser.py
lauolivia Dec 1, 2023
88c091b
update str functions
dfiallo35 Dec 1, 2023
d35c551
cols_bad
lauolivia Dec 2, 2023
c58556d
Update lexer.py
lauolivia Dec 2, 2023
1bd216a
Merge branch 'semantic' into columns
lauolivia Dec 2, 2023
a03b593
working_but_not_line
lauolivia Dec 2, 2023
083ac45
update_dennis
lauolivia Dec 2, 2023
1171ad7
update
dfiallo35 Dec 5, 2023
1be39dd
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 5, 2023
6ef4e53
Merge pull request #41 from dfiallo35/codegen
dfiallo35 Dec 5, 2023
edf95b7
columns
lauolivia Dec 6, 2023
1fa0825
Merge remote-tracking branch 'origin/master' into columns
lauolivia Dec 6, 2023
7fe3d01
updates
dfiallo35 Dec 6, 2023
71401b6
raise exception
lauolivia Dec 6, 2023
1c81bdf
erase_comments
lauolivia Dec 6, 2023
a229e73
update
dfiallo35 Dec 7, 2023
f96c408
update
dfiallo35 Dec 7, 2023
bd11809
update
dfiallo35 Dec 7, 2023
e5623b0
update
dfiallo35 Dec 7, 2023
2992a54
update
dfiallo35 Dec 7, 2023
7211eb6
soso
lauolivia Dec 7, 2023
59f4c4e
column_working
lauolivia Dec 7, 2023
8fdd132
finally
lauolivia Dec 7, 2023
fd4f689
Merge pull request #42 from dfiallo35/columns
lauolivia Dec 7, 2023
ffc08e7
update
dfiallo35 Dec 7, 2023
597a9dd
update
dfiallo35 Dec 7, 2023
7286a50
first test working
dfiallo35 Dec 7, 2023
2171a75
update
dfiallo35 Dec 7, 2023
ae4b1a3
create_report
lauolivia Dec 8, 2023
792d928
try_mips
lauolivia Dec 8, 2023
5bc65ef
Merge branch 'master' into doc
lauolivia Dec 8, 2023
5b2f320
report
lauolivia Dec 8, 2023
b63ea4d
Merge pull request #43 from dfiallo35/doc
lauolivia Dec 8, 2023
d27ed57
update
dfiallo35 Dec 8, 2023
30ef89a
update
dfiallo35 Dec 8, 2023
3114a5d
update
dfiallo35 Dec 8, 2023
08c022d
update
dfiallo35 Dec 8, 2023
12ed939
update
dfiallo35 Dec 8, 2023
0ed4b91
dispatch ok
dfiallo35 Dec 8, 2023
7fda531
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 8, 2023
0f9f40d
Merge pull request #44 from dfiallo35/codegen
dfiallo35 Dec 8, 2023
eca9b38
fixed_error
lauolivia Dec 8, 2023
c9815ee
Merge pull request #45 from dfiallo35/columns
lauolivia Dec 8, 2023
6926d2b
fixes
lauolivia Dec 8, 2023
00167ce
Merge pull request #46 from dfiallo35/columns
lauolivia Dec 8, 2023
a341805
update
dfiallo35 Dec 8, 2023
071271d
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 8, 2023
8ec0758
update
dfiallo35 Dec 9, 2023
c1fbcc9
basic_types
lauolivia Dec 9, 2023
385eda1
Update basic_classes.py
lauolivia Dec 9, 2023
b3d097e
Merge pull request #47 from dfiallo35/columns
lauolivia Dec 9, 2023
9dd668c
test_error_lau
lauolivia Dec 9, 2023
95090c3
only_case
lauolivia Dec 9, 2023
18c1c3f
Merge pull request #48 from dfiallo35/columns
lauolivia Dec 9, 2023
d5f3b53
update
dfiallo35 Dec 9, 2023
d40ddd1
update
dfiallo35 Dec 9, 2023
dde3ecc
all_sem_cod
lauolivia Dec 10, 2023
603975c
Update visitor.py
lauolivia Dec 10, 2023
17fda46
Merge branch 'master' into columns
lauolivia Dec 10, 2023
cfaa72b
Merge pull request #49 from dfiallo35/columns
lauolivia Dec 10, 2023
62513d1
doc_update
lauolivia Dec 10, 2023
3324ab4
updates
dfiallo35 Dec 11, 2023
64cd2de
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 11, 2023
37ea400
Merge pull request #50 from dfiallo35/codegen
dfiallo35 Dec 11, 2023
ca357e2
update
dfiallo35 Dec 11, 2023
6743559
update
dfiallo35 Dec 11, 2023
ca68c4e
update
dfiallo35 Dec 11, 2023
e0803f5
create_branch
lauolivia Dec 11, 2023
ad3099a
update dispatch
dfiallo35 Dec 11, 2023
3292508
Merge pull request #51 from dfiallo35/codegen
dfiallo35 Dec 11, 2023
b0a889d
trying_in_str
lauolivia Dec 11, 2023
8679fdd
Merge branch 'master' into debug_codegen
lauolivia Dec 11, 2023
1550f9d
update
dfiallo35 Dec 11, 2023
ef0065e
in_str
lauolivia Dec 11, 2023
8c9fcfc
Merge pull request #52 from dfiallo35/codegen
dfiallo35 Dec 11, 2023
36de06a
Merge remote-tracking branch 'origin/master' into debug_codegen
lauolivia Dec 11, 2023
90ad686
some
lauolivia Dec 12, 2023
88ad9e6
more tests passed
dfiallo35 Dec 12, 2023
927231f
in_str
lauolivia Dec 12, 2023
701cf8c
in_str
lauolivia Dec 12, 2023
5ef2c0c
not_important
lauolivia Dec 12, 2023
0d06746
Merge pull request #53 from dfiallo35/debug_codegen
lauolivia Dec 12, 2023
2f4e42f
update
dfiallo35 Dec 12, 2023
7c3394a
Update .gitignore
lauolivia Dec 12, 2023
f875326
Merge pull request #54 from dfiallo35/codegen
dfiallo35 Dec 12, 2023
60335ee
more tests done
dfiallo35 Dec 12, 2023
5dfcf9f
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 12, 2023
249a4ff
update
dfiallo35 Dec 12, 2023
39a509a
Merge pull request #55 from dfiallo35/codegen
dfiallo35 Dec 12, 2023
939f579
updates
dfiallo35 Dec 12, 2023
458b081
Merge pull request #56 from dfiallo35/codegen
dfiallo35 Dec 12, 2023
5904a38
updates
dfiallo35 Dec 12, 2023
ddcee8f
Merge pull request #57 from dfiallo35/codegen
dfiallo35 Dec 12, 2023
767d705
Update test_error.py
lauolivia Dec 13, 2023
96186f6
add cases
dfiallo35 Dec 13, 2023
1706fa0
Merge branch 'master' into debug_codegen
lauolivia Dec 13, 2023
5b0f5b4
Merge branch 'master' into doc
lauolivia Dec 13, 2023
a14b698
Update visitor.py
lauolivia Dec 13, 2023
26de205
Merge pull request #58 from dfiallo35/debug_codegen
lauolivia Dec 13, 2023
76c34ef
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 13, 2023
010f563
update
dfiallo35 Dec 13, 2023
cb08329
update
dfiallo35 Dec 13, 2023
ec607ad
update
dfiallo35 Dec 13, 2023
4f4db4e
update
dfiallo35 Dec 14, 2023
29e8e8e
fix_dynamic_type
lauolivia Dec 14, 2023
1a219ce
Merge pull request #59 from dfiallo35/codegen
dfiallo35 Dec 14, 2023
96c3f76
Merge branch 'master' into debug_codegen
lauolivia Dec 14, 2023
4de0ec7
Merge pull request #60 from dfiallo35/debug_codegen
lauolivia Dec 14, 2023
41ec692
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 14, 2023
459518b
Merge pull request #61 from dfiallo35/codegen
dfiallo35 Dec 14, 2023
594843f
arith done
dfiallo35 Dec 14, 2023
52b173d
Merge pull request #62 from dfiallo35/codegen
dfiallo35 Dec 14, 2023
eb0d4f5
it worksssssssssssssssssssssssssssss, finally
dfiallo35 Dec 14, 2023
1db2c93
Merge pull request #63 from dfiallo35/codegen
dfiallo35 Dec 14, 2023
b211ddf
Update report.md
lauolivia Dec 14, 2023
7d6e8bd
Merge branch 'master' into doc
lauolivia Dec 14, 2023
795eb13
update
dfiallo35 Dec 14, 2023
00000f0
Merge pull request #64 from dfiallo35/doc
lauolivia Dec 14, 2023
1e2fb7d
update
dfiallo35 Dec 14, 2023
c5b27ad
Merge remote-tracking branch 'origin/master' into codegen
dfiallo35 Dec 14, 2023
28ec36a
Merge pull request #65 from dfiallo35/codegen
dfiallo35 Dec 14, 2023
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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -408,3 +408,8 @@ dmypy.json

# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)

ztest.py
z_visitors.py
lauren
.venv
t/
16 changes: 16 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "TEST",
"type": "python",
"request": "launch",
"module": "pytest",
"args": ["../tests", "-v", "--tb=short"],
"cwd": "${workspaceRoot}/src",
"python": "${workspaceRoot}/.venv/bin/python",
"justMyCode": false,
"console": "integratedTerminal"
}
]
}
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"editor.inlineSuggest.showToolbar": "onHover"
}
Binary file added doc/report.pdf
Binary file not shown.
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: Dennis Fiallo Muñoz
github: dfiallo35
group: C411
- name: Lauren Olivia Guerra Hernández
github: lauolivia
group: C412
226 changes: 226 additions & 0 deletions report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
# Documentación



#### Cómo ejecutar y compilar.




El compilador se utiliza desde la carpeta src llamando al archivo `coolc.sh` y a continuación la dirección del archivo de extensión cl que se desea compilar, ejemplo: `./cool.sh /path/file.cl`. Este procedimiento compila su `file.cl` y devuelve un archivo `file.mips` que se ejecuta utilizando el comando `spim -file file.mips`.`

#### Requisitos adicionales, dependencias, configuración, etc.






- Instalación de la biblioteca `SLY` de python. Se puede instalar mediante el comando `pip install sly`.
- Instalación del simulador de MIPS `SPIM`. Se puede instalar mediante el comando `sudo apt-get install spim`.


### Arquitectura del compilador


Todo el código del compilador se encuentra en la carpeta COOL dentro de src, este se divide en 4 módulos principales:


- coollexer: Se encarga de analizar el código fuente y dividirlo en tokens.
- coolparser: Se encarga de analizar la estructura del código fuente y devolver un árbol de sintaxis abstracta (AST) que recoja la estructura del programa.
- semantic: Se encarga de realizar el chequeo semántico del AST recibido del parser y hacer la verificación de la correctitud de tipos.
- codegen: Luego de realizarse el chequeo semántico a partir del AST se genera el código de bajo nivel mips para ser ejecutado.

Además se encuentran otros módulos auxiliares encargados de los errores en tiempo de compilación y de los diferentes nodos que puede tener el AST.



### Fases del compilador



El flujo de las fases de un compilador sigue un proceso secuencial que transforma el código fuente de un programa en un programa ejecutable. Nuestro compilador de COOL sigue el siguiente flujo de fases:



#### Análisis léxico



Esta fase se encarga de analizar el código fuente y dividirlo en unidades léxicas o tokens, como identificadores, palabras clave, operadores y símbolos. Se generan los tokens que representan las unidades léxicas del programa.

Para la lexemización, tokenización y parser se utilizó la biblioteca de python `SLY`. Esta es una biblioteca para escribir analizadores léxicos y gramaticales. Se basa libremente en las herramientas tradicionales de construcción de compiladores lex (tokenizar) y yacc (yet another compiler-compiler). Tomando su clase Lexer como base hemos creado nuestro lexer para el lenguaje COOL agregando todos los tokens necesarios para el lenguaje, así como literales,palabras claves y algunas funciones necesarias como los ignore para los comentarios.

Ejemplo de como se definen tokens, literales y otros objetos utilizando el lexer de `SLY`:


```python
tokens = {
# Symbols
"NUMBER", "STRING", "TYPE", "ID",
# Arithmetic Operators
"PLUS", "MINUS", "TIMES", "DIVIDE", "LESS", "LESSEQUAL", "EQUAL", "NOT", "BITWISE", "ASSIGN", "DARROW",
# Reserved words
'CLASS', "INHERITS", "IF", "THEN", "ELSE", "FI", "WHILE", "LOOP", "POOL", "LET", "IN", "CASE", "OF", "ESAC", "NEW", "ISVOID", "TRUE", "FALSE",
}
literals = {"(", ")", "{", "}", ";", ":", ",", ".", "@"}
```

Además de tokenizar la entrada el análisis léxico puede detectar tokens que no pertenecen al léxico del lenguaje de programación, como caracteres no válidos o secuencias que no tienen significado dentro del lenguaje, el uso incorrecto de operadores o símbolos, que podrían indicar algún problema en la escritura del código, puede identificar si se han escrito incorrectamente palabras clave o identificadores, también detecta errores relacionados con la delimitación de tokens, como la falta de cierre de comillas en cadenas de texto, paréntesis sin emparejar, corchetes o llaves mal balanceados, entre otros.


#### Análisis sintáctico



El analizador sintáctico verifica la estructura del código fuente según las reglas gramaticales del lenguaje de programación COOL. Se construye un AST que representa la estructura jerárquica del programa. Este árbol se utiliza para analizar la corrección sintáctica verificando si las expresiones y declaraciones del programa cumplen con las reglas de la gramática.

Para la obtención del AST se utilizaron las reglas gramaticales definidas en el manual de COOL, incluída la precedencia y asociatividad, junto al algoritmo de análisis sintáctico (parser) LALR(1) implementado en `SLY`. Un analizador LALR (Look-Ahead LR) es una versión simplificada de un analizador LR canónico, para analizar un texto de acuerdo con un conjunto de reglas de producción especificadas por una gramática formal para un lenguaje.

Al igual que con otros tipos de gramáticas LR, un analizador o gramática LALR es bastante eficiente para encontrar el único análisis de abajo hacia arriba correcto en un solo escaneo de izquierda a derecha sobre el flujo de entrada, porque no necesita usar el retroceso. El analizador siempre utiliza una búsqueda anticipada, representando LALR(1) una búsqueda anticipada de un token.

`SLY` brinda una interfaz sencilla y cómoda para definir la gramática del lenguaje, además de permitir definir la precedencia y asociatividad de los operadores.

Ejemplo de como se define la precedencia y asociatividad utilizando el parser de `SLY`:

```python
precedence = (
('right', 'ASSIGN'),
('nonassoc', 'NOT'),
('nonassoc', 'EQUAL', 'LESS', 'LESSEQUAL'),
('left', 'PLUS', 'MINUS'),
('left', 'TIMES', 'DIVIDE'),
('right', 'ISVOID'),
('left', 'BITWISE'),
('nonassoc', '@'),
('nonassoc', 'NUMBER'),
('nonassoc', '(',')'),
('left', '.'),
)
```

Ejemplo de como se define una regla de la gramática utilizando el parser de `SLY`:
```python
@_('ID "(" formals ")" ":" TYPE "{" expr "}"')
def feature(self, p: YaccProduction):
return Method(
line=p.lineno,
column=self._get_column_from_production(p),
id=p.ID,
type=p.TYPE,
formals=p.formals,
expr=p.expr
)
```
En este ejemplo de código la función feature utiliza la información del objeto YaccProduction para crear el objeto Method . El nombre del método se obtiene del token ID , el tipo de retorno se obtiene del token TYPE , los parámetros se obtienen del objeto formals y el cuerpo del método se obtiene del objeto expr .

El análisis sintáctico verifica si las construcciones del código cumplen con la gramática del lenguaje de programación. Puede identificar errores como uso incorrecto de operadores, expresiones mal formadas, estructuras de control incompletas, entre otros.



#### Análisis semántico


Durante esta fase, se realiza un análisis más profundo del programa para verificar la coherencia y consistencia semántica. Se comprueba si las variables están correctamente declaradas, si los tipos de datos son compatibles y si se cumplen las reglas semánticas del lenguaje.


En el análisis semántico del lenguaje Cool, se realizan diversas tareas para verificar la coherencia y corrección del programa en términos de su significado y contexto. Está implementado utilizando el patrón visitor en dos momentos, donde cada uno de los nodos del AST es una clase que realiza su chequeo semántico llamando a su visitor correspondiente dentro de la clase visitor.

Los dos momentos del chequeo son:


- Primeramente a la hora de la declaración de las clases y herencias, donde verifica que no existan errores de herencia, conflictos de nombres, que no se creen herencias cíclicas, que no se redefinan atributos y que los métodos se redefinan de forma correcta.

- En segundo lugar, se realiza el chequeo de tipos de las expresiones, donde se verifica que los tipos de las expresiones sean correctos, la consistencia de los tipos utilizados en las diferentes expresiones, que los tipos de los argumentos en los llamados a métodos sean correctos, que las variables estén declaradas y siempre se utilicen en su ámbito correspondiente, que no se realicen operaciones entre tipos incompatibles, que los retornos de las funciones sean consecuentes con su tipo, además de la correcta utilización de cada uno de los recursos del lenguaje (condicionales, ciclos, let, case, etc...) cumpliendo las indicaciones del manual de COOL.


Todo el análisis semántico se maneja desde la clase Program en específico su método check:

```python
def check(self):
try:
self.visitor.visit_program(self)

for class_ in self.classes:
if class_:
if class_.inherits and class_.inherits in self.visitor.types.keys() and not class_.inherits in self.visitor.basic_types.keys():
class_.inherits_instance = self.visitor.types[class_.inherits]

for _class in self.classes:
if _class:
_class.check(self.visitor)

for _class in self.classes:
class_visitor = Visitor_Class( scope= {
'type': _class.type,
'inherits': _class.inherits,
'features': _class.features_dict,
'methods': _class.methods_dict,
'attributes': _class.attributes_dict,
'inherits_instance': _class.inherits_instance,
'line': _class.line,
'column': _class.column,
'lineage': _class.lineage,
'all_types':self.visitor.types,
'inheritance_tree':self.visitor.tree,
'basic_types':self.visitor.basic_types,
'type': _class.type
})
for feature in _class.features:
feature.check(class_visitor)

except Exception as e:
return [e]
```

Este es el encargado de almacenar los diferentes visitor que se utilizan a lo largo del proceso y brindarles la información de toda la estructura de las clases presentes. Además que envia a las clases y a las diferentes expresiones a realizar sus respectivos chequeos.

Luego cada expresión se encarga de su propio chequeo haciendo uso de la función del visitor que le ha sido asignada desde su método check.
Ej:

```python
def check(self, visitor:Visitor_Class):
return visitor.visit_dispatch(self)
```

Todas estas funciones retornan el tipo estático de la expresión correspondiente, lo que ayuda en gran manera la realización del chequeo de las expresiones que las engloban.

Esta fase es crucial para garantizar que el programa cumpla con las reglas y restricciones del lenguaje, verificando la corrección de tipos, la coherencia en la herencia, entre otros aspectos fundamentales para el funcionamiento adecuado del programa.



### Generación de código

En esta última fase, se genera código MIPS a partir del AST generado en la fase anterior. Para esto se utilizó el patrón similar visitor, donde se recorre el AST y se genera el código MIPS correspondiente a cada nodo, dadas las implementaciones especificas que se facilitan en los nodos. Las clases que implementan el patrón visitor son las siguientes:

- `Codegen`: Clase principal que se encarga de recibir el AST y generar el código MIPS correspondiente a cada nodo.
- `MipsVisitor`: Clase que define los métodos que se utilizan para generar el código MIPS de cada nodo.
- `Node`: Clase abstracta que define los métodos que se utilizan para generar el código MIPS de cada nodo en la función abstracta `codegen`.

Se recorre el AST a partir del llamado de `Codegen` iniciando por el `Node` llamado `Program` y se recorre el AST de forma recursiva, generando líneas de código MIPS almacenadas como los tipos:

- `Instruction`: Clase que define las instrucciones MIPS.
- `Label`: Clase que define las etiquetas MIPS.
- `Comment`: Clase que define los comentarios MIPS.
- `Data`: Clase que define los datos a almacenar en el segmento de datos MIPS.

Al finalizar el recorrido del AST se genera el archivo `.mips` con el código MIPS generado, el cual se puede ejecutar con el simulador `spim`.

#### Stack

Para el manejo del Stack se tienen varios métodos que se encargan de almacenar y recuperar los valores de las variables en el Stack. Entre estos está `get_variable` el cual dado el id de la variable y sabiendo el estado actual de la ejecución del programa, se encarga de indicar la posición de la variable en el Stack. Al igual que al entrar en un scope se mueve el offset del Stack y al salir se recupera el offset anterior.

En el caso de los métodos, al entrar en estos siempre se almacena como primer valor en el Stack el valor del self, para luego poder acceder a los atributos de la clase. Y una vez dentro del método se almacena el valor del registro de retorno `$ra` para luego poder retornar al lugar donde se llamó el método.

#### Heap

Todos los objetos creados en el programa se almacenan en el Heap, teniendo en su primera posición un puntero al tipo del objeto, mientras que este lo que almacena en su pocision 0 es el string con el nombre del tipo del objeto y en la posición 1 un puntero a su padre en el árbol de herencia.

Para instanciar un objeto se crea un espacio en el Heap con el tamaño del objeto y se llama al label con nombre `{object}_class` pasandole como self el puntero al objeto creado. Este label se encarga de inicializar los atributos del objeto y retornar el puntero al objeto creado.

Para acceder a los atributos de un objeto se utiliza el método `get_variable` el cual vimos anteriormente, el cual dado el id del atributo y el estado actual de la ejecución del programa, se encarga de indicar la posición del atributo en el objeto.

Para acceder a los métodos de un objeto se utiliza el método `get_method` el cual dado el id del método y el estado actual de la ejecución del programa, se encarga de indicar la posición del método en el objeto.



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
sly==0.5
5 changes: 5 additions & 0 deletions src/COOL/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .nodes import Node
from .coollexer import CoolLexer
from .coolparser import CoolParser
from .semantic import Semantic
from .codegen import Codegen
1 change: 1 addition & 0 deletions src/COOL/codegen/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .codegen import Codegen
8 changes: 8 additions & 0 deletions src/COOL/codegen/codegen.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from COOL.codegen.mips_visitor import MipsVisitor

class Codegen:
@classmethod
def codegen(cls, program) -> str:
mips_visitor = MipsVisitor()
program.codegen(mips_visitor)
return mips_visitor.generate_mips()
Loading