-
Notifications
You must be signed in to change notification settings - Fork 0
/
compilador.pd
161 lines (124 loc) · 5.06 KB
/
compilador.pd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
utilizar bepd/builtins
utilizar bepd/x/puerto como Puerto
utilizar parser como Parser
utilizar resoluciónDeNombres como RN
utilizar módulos como Módulos
[DOCUMENTA
@brief{El resultado de compilar un AST.}
@pd{compilado} es un texto, el compilado del módulo.
@pd{compiladoAbstracto} es el compilado no textual del módulo. Su tipo depende
sel backend.
@pd{informaciónDeDepuración} es otro texto: la información de depuración de
@code{rt.debug}.
DOCUMENTA]
clase ResultadoDeCompilación
atributos compilado, compiladoAbstracto, informaciónDeDepuración
finclase
[DOCUMENTA
@brief{Clase base para los compiladores.}
Los compiladores manejan todo el proceso desde tokenizar un puerto hasta
compilarlo y guardarlo en la base de datos. Esta clase base sirve como interfáz
principal de los compiladores.
La interfáz no incluye una forma de construir el compilador. Esto dependerá de
cada backend.
DOCUMENTA]
clase CompiladorBase
[DOCUMENTA
@brief{La base de datos que el compilador debe usar.}
DOCUMENTA]
atributo baseDeDatos
[DOCUMENTA
@brief{Compila un puerto.}
El módulo que el puerto contiene está identificado por la llave
@pd{llaveDeMódulo}. Devuelve la instancia de @pd{Módulos#Módulo}. Llama a
@pd{compilarAST} con el AST ya parseado, todo el trabajo de leer, tokenizar
y parsear es hecho automáticamente.
Este método compila el módulo incluso si ya estába compilado en la base de
datos. Para importar un módulo sin realizar trabajo adicional de ya existír
en la base de datos, ve @pd{importarMódulo}.
@pd{puerto} debe ser un puerto (ya sea normal o con posición).
Este método también invoca automaticamente a @pd{RN#ResolverNombres}, así
la resolución de nombres también es realizada automaticamente.
DOCUMENTA]
metodo compilarPuerto: llaveDeMódulo, puerto
[DOCUMENTA
@brief{Compila un texto.}
Equivalente a convertir el texto a un puerto y luego llamar
@pd{compilarPuerto}.
DOCUMENTA]
metodo compilarTexto: llaveDeMódulo, texto
[DOCUMENTA
@brief{Compila un AST.}
@pd{ast} es el AST del programa, cuyos nombres ya han sido
resueltos. @pd{ámbito} es el ámbito global del programa tal como es
devuelto por @pd{RN#ResolverNombres}.
Devuelve un @pd{ResultadoDeCompilación}.
Es un método abstracto.
DOCUMENTA]
metodo compilarAST: llaveDeMódulo, ast, ámbito
[DOCUMENTA
@brief{Importa un módulo.}
@pd{nombreDelMódulo} es el nombre del módulo a importar.
El trabajo de este método es básicamente buscar @pd{nombreDelMódulo} en la
base de datos de módulos, devolver el valor de la base de datos si ya
exíste o abrir el archivo y llamar a @pd{compilarPuerto} si no.
Este método es llamado por @pd{compilarPuerto} como parámetro
@pd{resolverMódulo} de @pd{RN#ResolverNombres}. También puede ser utilizado
por @pd{compilarAST}.
Es un método abstracto.
@devuelve{La instancia de @pd{Módulos#Módulo} del módulo importado.}
DOCUMENTA]
metodo importarMódulo: nombreDelMódulo
[DOCUMENTA
@brief{Inyecta builtins en un ámbito.}
Utilizado por @pd{RN#ResolverNombres}. @pd{ámbito} es el ámbito global de
cada módulo.
Es un método abstracto.
DOCUMENTA]
metodo inyectarNombresEnÁmbito: ámbito
[DOCUMENTA
@brief{Elimina builtins de un ámbito.}
Utilizado por @pd{RN#ResolverNombres}. @pd{ámbito} es el ámbito global de
cada módulo.
Es un método abstracto.
DOCUMENTA]
metodo removerNombresDeÁmbito: ámbito
finclase
metodo CompiladorBase#compilarAST: llaveDeMódulo, ast, ámbito
MétodoAbstracto
finmetodo
metodo CompiladorBase#importarMódulo: nombreDelMódulo
MétodoAbstracto
finmetodo
metodo CompiladorBase#inyectarNombresEnÁmbito: ámbito
MétodoAbstracto
finmetodo
metodo CompiladorBase#removerNombresDeÁmbito: ámbito
MétodoAbstracto
finmetodo
metodo CompiladorBase#compilarPuerto: llaveDeMódulo, puerto
variables ast, ámbito, res
Escribir: ({---- Parsear: ~t}#formatear: llaveDeMódulo)
fijar ast a Parser#CrearAST: puerto
Escribir: ({---- RN: ~t}#formatear: llaveDeMódulo)
fijar ámbito a RN#ResolverNombres: ast, procedimiento: nombreDelMódulo
devolver yo#importarMódulo: nombreDelMódulo
finprocedimiento, procedimiento: ámbito
yo#inyectarNombresEnÁmbito: ámbito
finprocedimiento, procedimiento: ámbito
yo#removerNombresDeÁmbito: ámbito
finprocedimiento
Escribir: ({---- Compilar: ~t}#formatear: llaveDeMódulo)
fijar res a yo#compilarAST: llaveDeMódulo, ast, ámbito
Escribir: ({---- Mod: ~t}#formatear: llaveDeMódulo)
devolver clonar Módulos#Módulo#_crear con
llave: llaveDeMódulo
exporta: ámbito
compilado: res#compilado
compiladoAbstracto: res#compiladoAbstracto
informaciónDeDepuración: res#informaciónDeDepuración
finclonar
finmetodo
metodo CompiladorBase#compilarTexto: llaveDeMódulo, texto
devolver yo#compilarPuerto: llaveDeMódulo, (Puerto#TextoComoPuerto: texto)
finmetodo