@designliquido/delegua 0.73.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analisador-semantico/analisador-semantico.js +1 -1
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +4 -4
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts +39 -34
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-base.js +55 -34
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +88 -74
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +302 -249
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/comum.d.ts.map +1 -1
- package/avaliador-sintatico/comum.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts +14 -14
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js +29 -28
- package/avaliador-sintatico/dialetos/avaliador-sintatico-calango.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +2 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +5 -5
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +13 -13
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +17 -17
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +41 -40
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +208 -140
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts +13 -13
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +25 -25
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts +37 -38
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +105 -110
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts +35 -35
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +98 -101
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts +1 -48
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts.map +1 -1
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js +3 -138
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js.map +1 -1
- package/bibliotecas/biblioteca-global.d.ts +3 -2
- package/bibliotecas/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/biblioteca-global.js +92 -151
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +3 -2
- package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js +20 -25
- package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js +5 -5
- package/bibliotecas/dialetos/pitugues/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-numero.js +4 -4
- package/bibliotecas/dialetos/pitugues/primitivas-numero.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-texto.js +18 -18
- package/bibliotecas/dialetos/pitugues/primitivas-texto.js.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts +6 -0
- package/bibliotecas/dialetos/pitugues/primitivas-tupla.d.ts.map +1 -0
- package/bibliotecas/dialetos/pitugues/primitivas-tupla.js +23 -0
- package/bibliotecas/dialetos/pitugues/primitivas-tupla.js.map +1 -0
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.js +33 -37
- package/bibliotecas/dialetos/pitugues/primitivas-vetor.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +5 -5
- package/bibliotecas/primitivas-dicionario.js.map +1 -1
- package/bibliotecas/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/primitivas-numero.js +4 -4
- package/bibliotecas/primitivas-numero.js.map +1 -1
- package/bibliotecas/primitivas-texto.d.ts +1 -1
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +21 -21
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-tupla.d.ts +6 -0
- package/bibliotecas/primitivas-tupla.d.ts.map +1 -0
- package/bibliotecas/primitivas-tupla.js +45 -0
- package/bibliotecas/primitivas-tupla.js.map +1 -0
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +56 -38
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +1 -1
- package/construtos/dicionario.d.ts +2 -1
- package/construtos/dicionario.d.ts.map +1 -1
- package/construtos/dicionario.js +2 -1
- package/construtos/dicionario.js.map +1 -1
- package/construtos/literal.d.ts +1 -1
- package/construtos/literal.d.ts.map +1 -1
- package/construtos/literal.js +4 -0
- package/construtos/literal.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js +10 -3
- package/formatadores/formatador-delegua.js.map +1 -1
- package/interfaces/avaliador-sintatico-interface.d.ts +1 -1
- package/interfaces/avaliador-sintatico-interface.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/comum.js +19 -0
- package/interpretador/dialetos/pitugues/comum.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +3 -4
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/estruturas/metodo-primitiva.d.ts +2 -2
- package/interpretador/estruturas/metodo-primitiva.js +4 -4
- package/interpretador/estruturas/metodo-primitiva.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +15 -0
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +249 -21
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +2 -1
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +77 -33
- package/interpretador/interpretador.js.map +1 -1
- package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
- package/lexador/dialetos/lexador-pitugues.js +44 -1
- package/lexador/dialetos/lexador-pitugues.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +4 -0
- package/lexador/lexador.js.map +1 -1
- package/package.json +1 -1
- package/tipos-de-simbolos/delegua.d.ts +1 -0
- package/tipos-de-simbolos/delegua.d.ts.map +1 -1
- package/tipos-de-simbolos/delegua.js +1 -0
- package/tipos-de-simbolos/delegua.js.map +1 -1
- package/tipos-de-simbolos/pitugues.d.ts +2 -0
- package/tipos-de-simbolos/pitugues.d.ts.map +1 -1
- package/tipos-de-simbolos/pitugues.js +2 -0
- package/tipos-de-simbolos/pitugues.js.map +1 -1
- package/tradutores/tradutor-assembly-x64.js +122 -122
- package/tradutores/tradutor-assemblyscript.js +1 -1
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-calango.d.ts +4 -3
- package/tradutores/tradutor-calango.d.ts.map +1 -1
- package/tradutores/tradutor-calango.js +7 -14
- package/tradutores/tradutor-calango.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts.map +1 -1
- package/tradutores/tradutor-javascript.js +12 -5
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-mermaidjs.js +1 -1
- package/tradutores/tradutor-mermaidjs.js.map +1 -1
- package/tradutores/tradutor-portugol-ipt.d.ts +1 -1
- package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
- package/tradutores/tradutor-portugol-ipt.js +3 -3
- package/tradutores/tradutor-portugol-ipt.js.map +1 -1
- package/tradutores/tradutor-python.d.ts.map +1 -1
- package/tradutores/tradutor-python.js +12 -5
- package/tradutores/tradutor-python.js.map +1 -1
- package/tradutores/tradutor-reverso-tenda.js +1 -1
- package/tradutores/tradutor-reverso-tenda.js.map +1 -1
- package/umd/delegua.js +1582 -1350
|
@@ -91,9 +91,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
91
91
|
}
|
|
92
92
|
return tipoElementarResolvido;
|
|
93
93
|
}
|
|
94
|
-
construtoAjuda() {
|
|
94
|
+
async construtoAjuda() {
|
|
95
95
|
const simboloAjuda = this.avancarEDevolverAnterior();
|
|
96
|
-
if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
|
|
96
|
+
if (this.estaNoFinal() || this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
|
|
97
97
|
return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
|
|
98
98
|
}
|
|
99
99
|
this.avancarEDevolverAnterior(); // parêntese esquerdo
|
|
@@ -102,18 +102,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
102
102
|
return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, true);
|
|
103
103
|
}
|
|
104
104
|
this.emAjuda = true;
|
|
105
|
-
const expressaoAjuda = this.expressao();
|
|
105
|
+
const expressaoAjuda = await this.expressao();
|
|
106
106
|
this.emAjuda = false;
|
|
107
107
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, `Esperado parêntese direito após expressão usada como argumento em ajuda(). Atual: ${this.simbolos[this.atual].lexema}.`);
|
|
108
108
|
return new construtos_1.AjudaComoConstruto(simboloAjuda.hashArquivo, simboloAjuda.linha, expressaoAjuda);
|
|
109
109
|
}
|
|
110
|
-
obterChaveDicionario() {
|
|
110
|
+
async obterChaveDicionario() {
|
|
111
111
|
switch (this.simbolos[this.atual].tipo) {
|
|
112
112
|
case delegua_2.default.NUMERO:
|
|
113
113
|
case delegua_2.default.TEXTO:
|
|
114
114
|
case delegua_2.default.FALSO:
|
|
115
115
|
case delegua_2.default.VERDADEIRO:
|
|
116
|
-
return this.primario();
|
|
116
|
+
return await this.primario();
|
|
117
117
|
case delegua_2.default.IDENTIFICADOR:
|
|
118
118
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
119
119
|
let tipoOperando;
|
|
@@ -130,14 +130,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
130
130
|
case delegua_2.default.COLCHETE_ESQUERDO:
|
|
131
131
|
this.avancarEDevolverAnterior();
|
|
132
132
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
133
|
-
return this.construtoTupla();
|
|
133
|
+
return await this.construtoTupla();
|
|
134
134
|
}
|
|
135
135
|
throw this.erro(this.simbolos[this.atual], `Esperado parêntese esquerdo após colchete esquerdo para definição de chave de dicionário. Atual: ${this.simbolos[this.atual].tipo}.`);
|
|
136
136
|
default:
|
|
137
137
|
throw this.erro(this.simbolos[this.atual], `Símbolo ${this.simbolos[this.atual].tipo} inesperado ou inválido como chave de dicionário.`);
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
|
-
construtoDicionario(simboloChaveEsquerda) {
|
|
140
|
+
async construtoDicionario(simboloChaveEsquerda) {
|
|
141
141
|
this.avancarEDevolverAnterior();
|
|
142
142
|
const chaves = [];
|
|
143
143
|
const valores = [];
|
|
@@ -145,9 +145,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
145
145
|
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), [], []);
|
|
146
146
|
}
|
|
147
147
|
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA)) {
|
|
148
|
-
const chave = this.obterChaveDicionario();
|
|
148
|
+
const chave = await this.obterChaveDicionario();
|
|
149
149
|
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' entre chave e valor.");
|
|
150
|
-
const valor = this.atribuir();
|
|
150
|
+
const valor = await this.atribuir();
|
|
151
151
|
chaves.push(chave);
|
|
152
152
|
valores.push(valor);
|
|
153
153
|
if (this.simbolos[this.atual].tipo !== delegua_2.default.CHAVE_DIREITA) {
|
|
@@ -156,68 +156,72 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
156
156
|
}
|
|
157
157
|
return new construtos_1.Dicionario(this.hashArquivo, Number(simboloChaveEsquerda.linha), chaves, valores);
|
|
158
158
|
}
|
|
159
|
-
|
|
159
|
+
/**
|
|
160
|
+
* `delegua-node` e a extensão para VSCode precisam que este método seja assíncrono.
|
|
161
|
+
* @returns
|
|
162
|
+
*/
|
|
163
|
+
async construtoImportar() {
|
|
160
164
|
this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
|
|
161
|
-
const caminho = this.expressao();
|
|
165
|
+
const caminho = await this.expressao();
|
|
162
166
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
|
|
163
|
-
return new construtos_1.ImportarComoConstruto(caminho);
|
|
167
|
+
return Promise.resolve(new construtos_1.ImportarComoConstruto(caminho));
|
|
164
168
|
}
|
|
165
|
-
construtoTupla() {
|
|
166
|
-
const expressao = this.expressao();
|
|
169
|
+
async construtoTupla() {
|
|
170
|
+
const expressao = await this.expressao();
|
|
167
171
|
const argumentos = [expressao];
|
|
168
172
|
while (this.simbolos[this.atual].tipo === delegua_2.default.VIRGULA) {
|
|
169
173
|
this.avancarEDevolverAnterior();
|
|
170
|
-
argumentos.push(this.expressao());
|
|
174
|
+
argumentos.push(await this.expressao());
|
|
171
175
|
}
|
|
172
176
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
173
177
|
this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após a expressão.");
|
|
174
178
|
return new tuplas_1.SeletorTuplas(...argumentos);
|
|
175
179
|
}
|
|
176
|
-
enquantoComoConstruto() {
|
|
177
|
-
const { condicao, corpo } = this.logicaComumEnquanto();
|
|
180
|
+
async enquantoComoConstruto() {
|
|
181
|
+
const { condicao, corpo } = await this.logicaComumEnquanto();
|
|
178
182
|
return new construtos_1.EnquantoComoConstruto(condicao, corpo);
|
|
179
183
|
}
|
|
180
|
-
fazerComoConstruto(simboloFazer) {
|
|
184
|
+
async fazerComoConstruto(simboloFazer) {
|
|
181
185
|
try {
|
|
182
186
|
this.blocos += 1;
|
|
183
|
-
const { caminhoFazer, condicaoEnquanto } = this.logicaComumFazer();
|
|
187
|
+
const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
|
|
184
188
|
return new construtos_1.FazerComoConstruto(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, condicaoEnquanto);
|
|
185
189
|
}
|
|
186
190
|
finally {
|
|
187
191
|
this.blocos -= 1;
|
|
188
192
|
}
|
|
189
193
|
}
|
|
190
|
-
paraCadaComoConstrutoVetor(simboloPara) {
|
|
191
|
-
const { variavelIteracao, vetor, corpo } = this.logicaComumParaCadaVetor(simboloPara);
|
|
194
|
+
async paraCadaComoConstrutoVetor(simboloPara) {
|
|
195
|
+
const { variavelIteracao, vetor, corpo } = await this.logicaComumParaCadaVetor(simboloPara);
|
|
192
196
|
return new construtos_1.ParaCadaComoConstruto(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, vetor, corpo);
|
|
193
197
|
}
|
|
194
|
-
paraCadaComoConstrutoDicionario(simboloPara) {
|
|
195
|
-
const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = this.logicaParaCadaDicionario(simboloPara);
|
|
198
|
+
async paraCadaComoConstrutoDicionario(simboloPara) {
|
|
199
|
+
const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = await this.logicaParaCadaDicionario(simboloPara);
|
|
196
200
|
return new construtos_1.ParaCadaComoConstruto(this.hashArquivo, Number(simboloPara.linha), new tuplas_1.Dupla(new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelChave.lexema), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelValor.lexema)), dicionario, corpo);
|
|
197
201
|
}
|
|
198
|
-
paraCadaComoConstruto(simboloPara) {
|
|
202
|
+
async paraCadaComoConstruto(simboloPara) {
|
|
199
203
|
if (this.verificarTipoSimboloAtual(delegua_2.default.IDENTIFICADOR)) {
|
|
200
|
-
return this.paraCadaComoConstrutoVetor(simboloPara);
|
|
204
|
+
return await this.paraCadaComoConstrutoVetor(simboloPara);
|
|
201
205
|
}
|
|
202
206
|
if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
203
|
-
return this.paraCadaComoConstrutoDicionario(simboloPara);
|
|
207
|
+
return await this.paraCadaComoConstrutoDicionario(simboloPara);
|
|
204
208
|
}
|
|
205
209
|
throw this.erro(simboloPara, 'Identificador de iteração deve ser ou um par chave-valor, ou um nome de variável.');
|
|
206
210
|
}
|
|
207
|
-
paraTradicionalComoConstruto(simboloPara) {
|
|
208
|
-
const { inicializador, condicao, incrementar, corpo } = this.logicaComumPara();
|
|
211
|
+
async paraTradicionalComoConstruto(simboloPara) {
|
|
212
|
+
const { inicializador, condicao, incrementar, corpo } = await this.logicaComumPara();
|
|
209
213
|
return new construtos_1.ParaComoConstruto(simboloPara.hashArquivo, simboloPara.linha, inicializador, condicao, incrementar, corpo);
|
|
210
214
|
}
|
|
211
215
|
/**
|
|
212
216
|
* Método que resolve `para` ou `para cada` como construto.
|
|
213
217
|
*/
|
|
214
|
-
paraComoConstruto(simboloPara) {
|
|
218
|
+
async paraComoConstruto(simboloPara) {
|
|
215
219
|
try {
|
|
216
220
|
this.blocos += 1;
|
|
217
221
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
|
|
218
|
-
return this.paraCadaComoConstruto(simboloPara);
|
|
222
|
+
return await this.paraCadaComoConstruto(simboloPara);
|
|
219
223
|
}
|
|
220
|
-
return this.paraTradicionalComoConstruto(simboloPara);
|
|
224
|
+
return await this.paraTradicionalComoConstruto(simboloPara);
|
|
221
225
|
}
|
|
222
226
|
finally {
|
|
223
227
|
this.blocos -= 1;
|
|
@@ -227,7 +231,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
227
231
|
* Resolve uma lista de compreensão.
|
|
228
232
|
* @returns {ListaCompreensao} A lista de compreensão resolvida.
|
|
229
233
|
*/
|
|
230
|
-
resolverCompreensaoDeLista(retornoExpressao) {
|
|
234
|
+
async resolverCompreensaoDeLista(retornoExpressao) {
|
|
231
235
|
this.consumir(delegua_2.default.PARA, "Esperado instrução 'para' após identificado.");
|
|
232
236
|
this.consumir(delegua_2.default.CADA, "Esperado instrução 'cada' após 'para'.");
|
|
233
237
|
const simboloVariavelIteracao = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
|
|
@@ -235,10 +239,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
235
239
|
throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução em lista de compreensão.");
|
|
236
240
|
}
|
|
237
241
|
const localizacaoVetor = this.simboloAnterior();
|
|
238
|
-
const vetor = this.ou();
|
|
242
|
+
const vetor = await this.ou();
|
|
239
243
|
let condicao = null;
|
|
240
244
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SE)) {
|
|
241
|
-
condicao = this.expressao();
|
|
245
|
+
condicao = await this.expressao();
|
|
242
246
|
}
|
|
243
247
|
else {
|
|
244
248
|
condicao = new construtos_1.Literal(this.hashArquivo, Number(localizacaoVetor.linha), true);
|
|
@@ -256,14 +260,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
256
260
|
])), 'qualquer[]' // TODO: Talvez um dia inferir o tipo aqui.
|
|
257
261
|
);
|
|
258
262
|
}
|
|
259
|
-
primario() {
|
|
263
|
+
async primario() {
|
|
260
264
|
const simboloAtual = this.simbolos[this.atual];
|
|
261
265
|
let valores = [];
|
|
262
266
|
switch (simboloAtual.tipo) {
|
|
263
267
|
case delegua_2.default.AJUDA:
|
|
264
|
-
return this.construtoAjuda();
|
|
268
|
+
return await this.construtoAjuda();
|
|
265
269
|
case delegua_2.default.CHAVE_ESQUERDA:
|
|
266
|
-
return this.construtoDicionario(simboloAtual);
|
|
270
|
+
return await this.construtoDicionario(simboloAtual);
|
|
267
271
|
case delegua_2.default.COLCHETE_ESQUERDO:
|
|
268
272
|
this.avancarEDevolverAnterior();
|
|
269
273
|
valores = [];
|
|
@@ -273,13 +277,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
273
277
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
274
278
|
return this.construtoTupla();
|
|
275
279
|
}
|
|
276
|
-
// Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
|
|
280
|
+
// Ao resolver a expressão aqui, identificadores dentro da expressão de compreensão
|
|
277
281
|
// de lista serão tratados como 'qualquer', para evitar erros de tipo.
|
|
278
282
|
this.intuirTipoQualquerParaIdentificadores = true;
|
|
279
|
-
const retornoExpressaoOuPrimeiroValor = this.seTernario();
|
|
283
|
+
const retornoExpressaoOuPrimeiroValor = await this.seTernario();
|
|
280
284
|
this.intuirTipoQualquerParaIdentificadores = false;
|
|
281
285
|
if (this.simbolos[this.atual].tipo === delegua_2.default.PARA) {
|
|
282
|
-
return this.resolverCompreensaoDeLista(retornoExpressaoOuPrimeiroValor);
|
|
286
|
+
return await this.resolverCompreensaoDeLista(retornoExpressaoOuPrimeiroValor);
|
|
283
287
|
}
|
|
284
288
|
// Aqui já sabemos que não é uma compreensão de lista.
|
|
285
289
|
valores.push(retornoExpressaoOuPrimeiroValor);
|
|
@@ -294,7 +298,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
294
298
|
valores.push(new construtos_1.ComentarioComoConstruto(simboloComentario));
|
|
295
299
|
break;
|
|
296
300
|
default:
|
|
297
|
-
const valor = this.seTernario();
|
|
301
|
+
const valor = await this.seTernario();
|
|
298
302
|
valores.push(valor);
|
|
299
303
|
break;
|
|
300
304
|
}
|
|
@@ -321,7 +325,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
321
325
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores, valores.length, tipoVetor);
|
|
322
326
|
case delegua_2.default.ENQUANTO:
|
|
323
327
|
this.avancarEDevolverAnterior();
|
|
324
|
-
return this.enquantoComoConstruto();
|
|
328
|
+
return await this.enquantoComoConstruto();
|
|
325
329
|
case delegua_2.default.EXPRESSAO_REGULAR:
|
|
326
330
|
let valor = '';
|
|
327
331
|
let linhaAtual = this.simbolos[this.atual].linha;
|
|
@@ -342,18 +346,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
342
346
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false, 'lógico');
|
|
343
347
|
case delegua_2.default.FAZER:
|
|
344
348
|
const simboloFazer = this.avancarEDevolverAnterior();
|
|
345
|
-
return this.fazerComoConstruto(simboloFazer);
|
|
349
|
+
return await this.fazerComoConstruto(simboloFazer);
|
|
346
350
|
case delegua_2.default.FUNCAO:
|
|
347
351
|
case delegua_2.default.FUNÇÃO:
|
|
348
352
|
const simboloFuncao = this.avancarEDevolverAnterior();
|
|
349
|
-
const corpoDaFuncao = this.corpoDaFuncao(simboloFuncao.lexema);
|
|
353
|
+
const corpoDaFuncao = await this.corpoDaFuncao(simboloFuncao.lexema);
|
|
350
354
|
this.pilhaEscopos.definirInformacoesVariavel(simboloFuncao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloFuncao.lexema, 'função'));
|
|
351
355
|
return corpoDaFuncao;
|
|
352
356
|
case delegua_2.default.IDENTIFICADOR:
|
|
353
357
|
const simboloIdentificador = this.avancarEDevolverAnterior();
|
|
354
358
|
let tipoOperando;
|
|
355
359
|
if (this.intuirTipoQualquerParaIdentificadores) {
|
|
356
|
-
// Esta indicação é utilizada para compreensões de lista, onde o
|
|
360
|
+
// Esta indicação é utilizada para compreensões de lista, onde o
|
|
357
361
|
// tipo do identificador de iteração é 'qualquer' por definição.
|
|
358
362
|
tipoOperando = 'qualquer';
|
|
359
363
|
this.pilhaEscopos.definirInformacoesVariavel(simboloIdentificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloIdentificador.lexema, 'qualquer') // TODO: Talvez um dia inferir o tipo aqui.
|
|
@@ -381,12 +385,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
381
385
|
return new construtos_1.Variavel(this.hashArquivo, simboloIdentificador, tipoOperando || 'qualquer');
|
|
382
386
|
case delegua_2.default.IMPORTAR:
|
|
383
387
|
this.avancarEDevolverAnterior();
|
|
384
|
-
return this.construtoImportar();
|
|
388
|
+
return await this.construtoImportar();
|
|
385
389
|
case delegua_2.default.ISTO:
|
|
386
390
|
this.avancarEDevolverAnterior();
|
|
387
391
|
return new construtos_1.Isto(this.hashArquivo, Number(simboloAtual.linha), simboloAtual);
|
|
388
392
|
case delegua_2.default.LEIA:
|
|
389
|
-
return this.expressaoLeia();
|
|
393
|
+
return await this.expressaoLeia();
|
|
390
394
|
case delegua_2.default.NULO:
|
|
391
395
|
this.avancarEDevolverAnterior();
|
|
392
396
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), null, 'nulo');
|
|
@@ -399,10 +403,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
399
403
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal, tipoDadosElementar);
|
|
400
404
|
case delegua_2.default.PARA:
|
|
401
405
|
const simboloPara = this.avancarEDevolverAnterior();
|
|
402
|
-
return this.paraComoConstruto(simboloPara);
|
|
406
|
+
return await this.paraComoConstruto(simboloPara);
|
|
403
407
|
case delegua_2.default.PARENTESE_ESQUERDO:
|
|
404
408
|
this.avancarEDevolverAnterior();
|
|
405
|
-
|
|
409
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_DIREITO)) {
|
|
410
|
+
return new construtos_1.TuplaN(this.hashArquivo, Number(simboloAtual.linha), []);
|
|
411
|
+
}
|
|
412
|
+
const expressao = await this.tupla();
|
|
413
|
+
if (expressao instanceof construtos_1.TuplaN) {
|
|
414
|
+
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após itens da tupla.");
|
|
415
|
+
return expressao;
|
|
416
|
+
}
|
|
406
417
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
407
418
|
return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
|
|
408
419
|
case delegua_2.default.SUPER:
|
|
@@ -422,7 +433,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
422
433
|
construto = new construtos_1.ComponenteLinguagem(this.hashArquivo, this.simboloAnterior());
|
|
423
434
|
}
|
|
424
435
|
else {
|
|
425
|
-
construto = this.expressao();
|
|
436
|
+
construto = await this.expressao();
|
|
426
437
|
}
|
|
427
438
|
if (construto.constructor === construtos_1.AcessoMetodoOuPropriedade) {
|
|
428
439
|
const construtoTipado = construto;
|
|
@@ -479,6 +490,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
479
490
|
}
|
|
480
491
|
return new construtos_1.TipoDe(this.hashArquivo, simboloAtual, construto);
|
|
481
492
|
}
|
|
493
|
+
// TODO: O correto seria emitir algum aviso aqui que este avaliador sintático não consegue
|
|
494
|
+
// lidar com tópicos de ajuda neste ponto.
|
|
482
495
|
if (this.emAjuda) {
|
|
483
496
|
console.log(this.simbolos[this.atual]);
|
|
484
497
|
}
|
|
@@ -515,15 +528,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
515
528
|
}
|
|
516
529
|
return tipoAcesso;
|
|
517
530
|
}
|
|
518
|
-
resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
|
|
531
|
+
async resolverCadeiaChamadas(expressaoAnterior, tipoAnterior = 'qualquer') {
|
|
519
532
|
if (!this.simbolos[this.atual]) {
|
|
520
533
|
return expressaoAnterior;
|
|
521
534
|
}
|
|
522
535
|
switch (this.simbolos[this.atual].tipo) {
|
|
523
536
|
case delegua_2.default.PARENTESE_ESQUERDO:
|
|
524
537
|
this.avancarEDevolverAnterior();
|
|
525
|
-
const chamada = this.finalizarChamada(expressaoAnterior, tipoAnterior);
|
|
526
|
-
return this.resolverCadeiaChamadas(chamada);
|
|
538
|
+
const chamada = await this.finalizarChamada(expressaoAnterior, tipoAnterior);
|
|
539
|
+
return await this.resolverCadeiaChamadas(chamada);
|
|
527
540
|
case delegua_2.default.PONTO:
|
|
528
541
|
this.avancarEDevolverAnterior();
|
|
529
542
|
this.verificarSeSimboloAtualEIgualA();
|
|
@@ -541,21 +554,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
541
554
|
}
|
|
542
555
|
}
|
|
543
556
|
const acesso = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, expressaoAnterior, nome, tipoInferido);
|
|
544
|
-
return this.resolverCadeiaChamadas(acesso, tipoInferido);
|
|
557
|
+
return await this.resolverCadeiaChamadas(acesso, tipoInferido);
|
|
545
558
|
case delegua_2.default.COLCHETE_ESQUERDO:
|
|
546
559
|
const tipoAcesso = this.resolverTipoAcessoIndiceVariavel(expressaoAnterior);
|
|
547
560
|
this.avancarEDevolverAnterior();
|
|
548
|
-
const indice = this.expressao();
|
|
561
|
+
const indice = await this.expressao();
|
|
549
562
|
const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
550
563
|
const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento, tipoAcesso);
|
|
551
|
-
return this.resolverCadeiaChamadas(acessoVariavel);
|
|
564
|
+
return await this.resolverCadeiaChamadas(acessoVariavel);
|
|
552
565
|
default:
|
|
553
566
|
return expressaoAnterior;
|
|
554
567
|
}
|
|
555
568
|
}
|
|
556
|
-
chamar() {
|
|
557
|
-
let expressao = this.primario();
|
|
558
|
-
return this.resolverCadeiaChamadas(expressao);
|
|
569
|
+
async chamar() {
|
|
570
|
+
let expressao = await this.primario();
|
|
571
|
+
return await this.resolverCadeiaChamadas(expressao);
|
|
559
572
|
}
|
|
560
573
|
/**
|
|
561
574
|
* `AcessoMetodoOuPropriedade` é um construto intermediário em Delégua, e deve ser resolvido como outro
|
|
@@ -699,7 +712,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
699
712
|
}
|
|
700
713
|
return entidadeChamada;
|
|
701
714
|
}
|
|
702
|
-
finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
|
|
715
|
+
async finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
|
|
703
716
|
const argumentos = [];
|
|
704
717
|
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
705
718
|
do {
|
|
@@ -707,7 +720,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
707
720
|
if (argumentos.length >= 255) {
|
|
708
721
|
throw this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 argumentos.');
|
|
709
722
|
}
|
|
710
|
-
argumentos.push(this.expressao());
|
|
723
|
+
argumentos.push(await this.expressao());
|
|
711
724
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
712
725
|
}
|
|
713
726
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos.");
|
|
@@ -720,24 +733,24 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
720
733
|
construtoChamada.tipo = 'qualquer';
|
|
721
734
|
return construtoChamada;
|
|
722
735
|
}
|
|
723
|
-
unario() {
|
|
736
|
+
async unario() {
|
|
724
737
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.NAO, delegua_2.default.NEGACAO, delegua_2.default.ADICAO, delegua_2.default.SUBTRACAO, delegua_2.default.BIT_NOT, delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR)) {
|
|
725
738
|
const operador = this.simbolos[this.atual - 1];
|
|
726
|
-
const direito = this.unario();
|
|
739
|
+
const direito = await this.unario();
|
|
727
740
|
return new construtos_1.Unario(this.hashArquivo, operador, direito, 'ANTES');
|
|
728
741
|
}
|
|
729
|
-
return this.chamar();
|
|
742
|
+
return await this.chamar();
|
|
730
743
|
}
|
|
731
744
|
/**
|
|
732
745
|
* A exponenciacão é uma exceção na ordem de avaliação (resolve primeiro à direita).
|
|
733
746
|
* Por isso `direito` chama `exponenciacao()`, e não `unario()`.
|
|
734
747
|
* @returns {Binario} A expressão binária na forma do construto `Binario`.
|
|
735
748
|
*/
|
|
736
|
-
exponenciacao() {
|
|
737
|
-
let expressao = this.unario();
|
|
749
|
+
async exponenciacao() {
|
|
750
|
+
let expressao = await this.unario();
|
|
738
751
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EXPONENCIACAO)) {
|
|
739
752
|
const operador = this.simbolos[this.atual - 1];
|
|
740
|
-
const direito = this.exponenciacao();
|
|
753
|
+
const direito = await this.exponenciacao();
|
|
741
754
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
742
755
|
}
|
|
743
756
|
return expressao;
|
|
@@ -789,11 +802,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
789
802
|
}
|
|
790
803
|
}
|
|
791
804
|
}
|
|
792
|
-
multiplicar() {
|
|
793
|
-
let expressao = this.exponenciacao();
|
|
805
|
+
async multiplicar() {
|
|
806
|
+
let expressao = await this.exponenciacao();
|
|
794
807
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIVISAO, delegua_2.default.DIVISAO_IGUAL, delegua_2.default.DIVISAO_INTEIRA, delegua_2.default.DIVISAO_INTEIRA_IGUAL, delegua_2.default.MODULO, delegua_2.default.MODULO_IGUAL, delegua_2.default.MULTIPLICACAO, delegua_2.default.MULTIPLICACAO_IGUAL)) {
|
|
795
808
|
const operador = this.simbolos[this.atual - 1];
|
|
796
|
-
const direito = this.exponenciacao();
|
|
809
|
+
const direito = await this.exponenciacao();
|
|
797
810
|
this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
|
|
798
811
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
799
812
|
}
|
|
@@ -804,68 +817,68 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
804
817
|
* ser avaliado pelo Interpretador.
|
|
805
818
|
* @returns Um Construto, normalmente um `Binario`, ou `Unario` se houver alguma operação unária para ser avaliada.
|
|
806
819
|
*/
|
|
807
|
-
adicaoOuSubtracao() {
|
|
808
|
-
let expressao = this.multiplicar();
|
|
820
|
+
async adicaoOuSubtracao() {
|
|
821
|
+
let expressao = await this.multiplicar();
|
|
809
822
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SUBTRACAO, delegua_2.default.ADICAO, delegua_2.default.MENOS_IGUAL)) {
|
|
810
823
|
const operador = this.simbolos[this.atual - 1];
|
|
811
|
-
const direito = this.multiplicar();
|
|
824
|
+
const direito = await this.multiplicar();
|
|
812
825
|
this.verificacaoOperacoesBinariasIlegais(expressao, direito, operador);
|
|
813
826
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
814
827
|
}
|
|
815
828
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIS_IGUAL)) {
|
|
816
829
|
const operador = this.simbolos[this.atual - 1];
|
|
817
|
-
const direito = this.
|
|
830
|
+
const direito = await this.ou();
|
|
818
831
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
819
832
|
}
|
|
820
833
|
return expressao;
|
|
821
834
|
}
|
|
822
|
-
bitShift() {
|
|
823
|
-
let expressao = this.adicaoOuSubtracao();
|
|
835
|
+
async bitShift() {
|
|
836
|
+
let expressao = await this.adicaoOuSubtracao();
|
|
824
837
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MENOR_MENOR, delegua_2.default.MAIOR_MAIOR)) {
|
|
825
838
|
const operador = this.simbolos[this.atual - 1];
|
|
826
|
-
const direito = this.adicaoOuSubtracao();
|
|
839
|
+
const direito = await this.adicaoOuSubtracao();
|
|
827
840
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
828
841
|
}
|
|
829
842
|
return expressao;
|
|
830
843
|
}
|
|
831
|
-
bitE() {
|
|
832
|
-
let expressao = this.bitShift();
|
|
844
|
+
async bitE() {
|
|
845
|
+
let expressao = await this.bitShift();
|
|
833
846
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_AND)) {
|
|
834
847
|
const operador = this.simbolos[this.atual - 1];
|
|
835
|
-
const direito = this.bitShift();
|
|
848
|
+
const direito = await this.bitShift();
|
|
836
849
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
837
850
|
}
|
|
838
851
|
return expressao;
|
|
839
852
|
}
|
|
840
|
-
bitOu() {
|
|
841
|
-
let expressao = this.bitE();
|
|
853
|
+
async bitOu() {
|
|
854
|
+
let expressao = await this.bitE();
|
|
842
855
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.BIT_OR, delegua_2.default.BIT_XOR)) {
|
|
843
856
|
const operador = this.simbolos[this.atual - 1];
|
|
844
|
-
const direito = this.bitE();
|
|
857
|
+
const direito = await this.bitE();
|
|
845
858
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
846
859
|
}
|
|
847
860
|
return expressao;
|
|
848
861
|
}
|
|
849
|
-
comparar() {
|
|
850
|
-
let expressao = this.bitOu();
|
|
862
|
+
async comparar() {
|
|
863
|
+
let expressao = await this.bitOu();
|
|
851
864
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MAIOR, delegua_2.default.MAIOR_IGUAL, delegua_2.default.MENOR, delegua_2.default.MENOR_IGUAL)) {
|
|
852
865
|
const operador = this.simbolos[this.atual - 1];
|
|
853
|
-
const direito = this.bitOu();
|
|
866
|
+
const direito = await this.bitOu();
|
|
854
867
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
855
868
|
}
|
|
856
869
|
return expressao;
|
|
857
870
|
}
|
|
858
|
-
comparacaoIgualdade() {
|
|
859
|
-
let expressao = this.comparar();
|
|
871
|
+
async comparacaoIgualdade() {
|
|
872
|
+
let expressao = await this.comparar();
|
|
860
873
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DIFERENTE, delegua_2.default.IGUAL_IGUAL)) {
|
|
861
874
|
const operador = this.simbolos[this.atual - 1];
|
|
862
|
-
const direito = this.comparar();
|
|
875
|
+
const direito = await this.comparar();
|
|
863
876
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
864
877
|
}
|
|
865
878
|
return expressao;
|
|
866
879
|
}
|
|
867
|
-
em() {
|
|
868
|
-
let expressao = this.comparacaoIgualdade();
|
|
880
|
+
async em() {
|
|
881
|
+
let expressao = await this.comparacaoIgualdade();
|
|
869
882
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.EM, delegua_2.default.CONTEM, delegua_2.default.NAO)) {
|
|
870
883
|
let operador = this.simbolos[this.atual - 1];
|
|
871
884
|
let negado = false;
|
|
@@ -873,36 +886,36 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
873
886
|
operador = this.consumir(delegua_2.default.CONTEM, `Esperado palavra reservada 'contém' ou 'contem' após palavra reservada ${operador.lexema}.`);
|
|
874
887
|
negado = true;
|
|
875
888
|
}
|
|
876
|
-
const direito = this.comparacaoIgualdade();
|
|
889
|
+
const direito = await this.comparacaoIgualdade();
|
|
877
890
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
878
891
|
expressao.negado = negado;
|
|
879
892
|
}
|
|
880
893
|
return expressao;
|
|
881
894
|
}
|
|
882
|
-
e() {
|
|
883
|
-
let expressao = this.em();
|
|
895
|
+
async e() {
|
|
896
|
+
let expressao = await this.em();
|
|
884
897
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.E)) {
|
|
885
898
|
const operador = this.simbolos[this.atual - 1];
|
|
886
|
-
const direito = this.em();
|
|
899
|
+
const direito = await this.em();
|
|
887
900
|
expressao = new construtos_1.Logico(this.hashArquivo, expressao, operador, direito);
|
|
888
901
|
}
|
|
889
902
|
return expressao;
|
|
890
903
|
}
|
|
891
|
-
elvis() {
|
|
892
|
-
let expressao = this.ou();
|
|
904
|
+
async elvis() {
|
|
905
|
+
let expressao = await this.ou();
|
|
893
906
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ELVIS)) {
|
|
894
|
-
const direito = this.ou();
|
|
907
|
+
const direito = await this.ou();
|
|
895
908
|
return new construtos_1.Elvis(this.hashArquivo, expressao, direito);
|
|
896
909
|
}
|
|
897
910
|
return expressao;
|
|
898
911
|
}
|
|
899
|
-
seTernario() {
|
|
900
|
-
let expressaoOuCondicao = this.elvis();
|
|
912
|
+
async seTernario() {
|
|
913
|
+
let expressaoOuCondicao = await this.elvis();
|
|
901
914
|
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.INTERROGACAO)) {
|
|
902
915
|
const operador = this.simbolos[this.atual - 1];
|
|
903
|
-
const expressaoEntao = this.seTernario();
|
|
916
|
+
const expressaoEntao = await this.seTernario();
|
|
904
917
|
this.consumir(delegua_2.default.DOIS_PONTOS, `Esperado dois-pontos após caminho positivo em se ternário. Atual: ${this.simbolos[this.atual].lexema}.`);
|
|
905
|
-
const expressaoSenao = this.seTernario();
|
|
918
|
+
const expressaoSenao = await this.seTernario();
|
|
906
919
|
expressaoOuCondicao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
|
|
907
920
|
}
|
|
908
921
|
return expressaoOuCondicao;
|
|
@@ -911,8 +924,33 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
911
924
|
* Método que resolve atribuições.
|
|
912
925
|
* @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
|
|
913
926
|
*/
|
|
914
|
-
|
|
915
|
-
|
|
927
|
+
/**
|
|
928
|
+
* Processa tuplas, que são expressões separadas por vírgula entre parênteses.
|
|
929
|
+
* Se não houver vírgula, retorna apenas a expressão simples.
|
|
930
|
+
* Sobrescreve o método da base para usar seTernario() em vez de ou().
|
|
931
|
+
*/
|
|
932
|
+
async tupla() {
|
|
933
|
+
let expressao = await this.seTernario();
|
|
934
|
+
// Se não há vírgula, retorna a expressão simples
|
|
935
|
+
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA)) {
|
|
936
|
+
return expressao;
|
|
937
|
+
}
|
|
938
|
+
// Se há vírgula, então é uma tupla
|
|
939
|
+
const elementos = [expressao];
|
|
940
|
+
do {
|
|
941
|
+
if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
942
|
+
break;
|
|
943
|
+
}
|
|
944
|
+
elementos.push(await this.seTernario());
|
|
945
|
+
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
946
|
+
return new construtos_1.TuplaN(this.hashArquivo, expressao.linha, elementos);
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Método que resolve atribuições.
|
|
950
|
+
* @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoPorIndice`.
|
|
951
|
+
*/
|
|
952
|
+
async atribuir() {
|
|
953
|
+
const expressao = await this.seTernario();
|
|
916
954
|
if (expressao instanceof construtos_1.Binario &&
|
|
917
955
|
[
|
|
918
956
|
delegua_2.default.MAIS_IGUAL,
|
|
@@ -928,9 +966,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
928
966
|
}
|
|
929
967
|
return new construtos_1.Atribuir(this.hashArquivo, expressao.esquerda, expressao, undefined, expressao.operador);
|
|
930
968
|
}
|
|
931
|
-
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
969
|
+
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
|
|
932
970
|
const igual = this.simbolos[this.atual - 1];
|
|
933
|
-
const valor = this.seTernario();
|
|
971
|
+
const valor = await this.seTernario();
|
|
934
972
|
switch (expressao.constructor) {
|
|
935
973
|
case construtos_1.Variavel:
|
|
936
974
|
return new construtos_1.Atribuir(this.hashArquivo, expressao, valor);
|
|
@@ -949,7 +987,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
949
987
|
* Declaração para comando `leia`, para ler dados de entrada do usuário.
|
|
950
988
|
* @returns Um objeto da classe `Leia`.
|
|
951
989
|
*/
|
|
952
|
-
expressaoLeia() {
|
|
990
|
+
async expressaoLeia() {
|
|
953
991
|
const simboloLeia = this.avancarEDevolverAnterior();
|
|
954
992
|
if (this.emAjuda && this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
|
|
955
993
|
return new construtos_1.Leia(simboloLeia, []);
|
|
@@ -958,22 +996,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
958
996
|
const argumentos = [];
|
|
959
997
|
if (this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_DIREITO) {
|
|
960
998
|
do {
|
|
961
|
-
argumentos.push(this.expressao());
|
|
999
|
+
argumentos.push(await this.expressao());
|
|
962
1000
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
963
1001
|
}
|
|
964
1002
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os argumentos em instrução `leia`.");
|
|
965
1003
|
return new construtos_1.Leia(simboloLeia, argumentos);
|
|
966
1004
|
}
|
|
967
1005
|
// TODO: Depreciar.
|
|
968
|
-
expressao() {
|
|
969
|
-
return this.atribuir();
|
|
1006
|
+
async expressao() {
|
|
1007
|
+
return await this.atribuir();
|
|
970
1008
|
}
|
|
971
|
-
blocoEscopo() {
|
|
1009
|
+
async blocoEscopo() {
|
|
972
1010
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
973
1011
|
let declaracoes = [];
|
|
974
1012
|
while (!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA) &&
|
|
975
1013
|
!this.estaNoFinal()) {
|
|
976
|
-
const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
|
|
1014
|
+
const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
|
|
977
1015
|
if (Array.isArray(retornoDeclaracao)) {
|
|
978
1016
|
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
979
1017
|
}
|
|
@@ -1007,45 +1045,45 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1007
1045
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1008
1046
|
return new declaracoes_1.Continua(this.simbolos[this.atual - 1]);
|
|
1009
1047
|
}
|
|
1010
|
-
logicaComumEnquanto() {
|
|
1011
|
-
const condicao = this.expressao();
|
|
1048
|
+
async logicaComumEnquanto() {
|
|
1049
|
+
const condicao = await this.expressao();
|
|
1012
1050
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
1013
|
-
const corpo = this.resolverDeclaracao();
|
|
1051
|
+
const corpo = await this.resolverDeclaracao();
|
|
1014
1052
|
return {
|
|
1015
1053
|
condicao,
|
|
1016
1054
|
corpo,
|
|
1017
1055
|
};
|
|
1018
1056
|
}
|
|
1019
|
-
declaracaoEnquanto() {
|
|
1057
|
+
async declaracaoEnquanto() {
|
|
1020
1058
|
try {
|
|
1021
1059
|
this.blocos += 1;
|
|
1022
|
-
const { condicao, corpo } = this.logicaComumEnquanto();
|
|
1060
|
+
const { condicao, corpo } = await this.logicaComumEnquanto();
|
|
1023
1061
|
return new declaracoes_1.Enquanto(condicao, corpo);
|
|
1024
1062
|
}
|
|
1025
1063
|
finally {
|
|
1026
1064
|
this.blocos -= 1;
|
|
1027
1065
|
}
|
|
1028
1066
|
}
|
|
1029
|
-
declaracaoEscolha() {
|
|
1067
|
+
async declaracaoEscolha() {
|
|
1030
1068
|
try {
|
|
1031
1069
|
this.blocos += 1;
|
|
1032
|
-
const condicao = this.expressao();
|
|
1070
|
+
const condicao = await this.expressao();
|
|
1033
1071
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo do 'escolha'.");
|
|
1034
1072
|
const caminhos = [];
|
|
1035
1073
|
let caminhoPadrao = null;
|
|
1036
1074
|
while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) &&
|
|
1037
1075
|
!this.estaNoFinal()) {
|
|
1038
1076
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
|
|
1039
|
-
const caminhoCondicoes = [this.expressao()];
|
|
1077
|
+
const caminhoCondicoes = [await this.expressao()];
|
|
1040
1078
|
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
|
|
1041
1079
|
while (this.verificarTipoSimboloAtual(delegua_2.default.CASO)) {
|
|
1042
1080
|
this.consumir(delegua_2.default.CASO, null);
|
|
1043
|
-
caminhoCondicoes.push(this.expressao());
|
|
1081
|
+
caminhoCondicoes.push(await this.expressao());
|
|
1044
1082
|
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
|
|
1045
1083
|
}
|
|
1046
1084
|
let declaracoes = [];
|
|
1047
1085
|
do {
|
|
1048
|
-
const retornoDeclaracao = this.resolverDeclaracao();
|
|
1086
|
+
const retornoDeclaracao = await this.resolverDeclaracao();
|
|
1049
1087
|
if (Array.isArray(retornoDeclaracao)) {
|
|
1050
1088
|
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
1051
1089
|
}
|
|
@@ -1069,7 +1107,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1069
1107
|
this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'padrao'.");
|
|
1070
1108
|
const declaracoes = [];
|
|
1071
1109
|
do {
|
|
1072
|
-
declaracoes.push(this.resolverDeclaracao());
|
|
1110
|
+
declaracoes.push(await this.resolverDeclaracao());
|
|
1073
1111
|
} while (!this.verificarTipoSimboloAtual(delegua_2.default.CASO) &&
|
|
1074
1112
|
!this.verificarTipoSimboloAtual(delegua_2.default.PADRAO) &&
|
|
1075
1113
|
!this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_DIREITA));
|
|
@@ -1084,13 +1122,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1084
1122
|
this.blocos -= 1;
|
|
1085
1123
|
}
|
|
1086
1124
|
}
|
|
1087
|
-
declaracaoEscreva() {
|
|
1125
|
+
async declaracaoEscreva() {
|
|
1088
1126
|
const simboloAtual = this.simbolos[this.atual];
|
|
1089
1127
|
this.consumir(delegua_2.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
|
|
1090
1128
|
const argumentos = [];
|
|
1091
1129
|
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
1092
1130
|
do {
|
|
1093
|
-
argumentos.push(this.expressao());
|
|
1131
|
+
argumentos.push(await this.expressao());
|
|
1094
1132
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1095
1133
|
}
|
|
1096
1134
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
|
|
@@ -1098,33 +1136,34 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1098
1136
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1099
1137
|
return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
|
|
1100
1138
|
}
|
|
1101
|
-
declaracaoExpressao() {
|
|
1139
|
+
async declaracaoExpressao() {
|
|
1102
1140
|
// Se há decoradores a serem adicionados aqui, obtemo-los agora,
|
|
1103
1141
|
// para evitar que outros passos recursivos peguem-los antes.
|
|
1104
1142
|
const decoradores = Array.from(this.pilhaDecoradores);
|
|
1105
1143
|
this.pilhaDecoradores = [];
|
|
1106
|
-
const expressao = this.expressao();
|
|
1144
|
+
const expressao = await this.expressao();
|
|
1107
1145
|
// Ponto-e-vírgula é opcional aqui.
|
|
1108
1146
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1109
1147
|
return new declaracoes_1.Expressao(expressao, decoradores);
|
|
1110
1148
|
}
|
|
1111
|
-
declaracaoFalhar() {
|
|
1149
|
+
async declaracaoFalhar() {
|
|
1112
1150
|
const simboloFalha = this.simbolos[this.atual - 1];
|
|
1113
|
-
|
|
1151
|
+
const expressaoFalha = await this.expressao();
|
|
1152
|
+
return new declaracoes_1.Falhar(simboloFalha, expressaoFalha);
|
|
1114
1153
|
}
|
|
1115
|
-
logicaComumFazer() {
|
|
1116
|
-
const caminhoFazer = this.resolverDeclaracao();
|
|
1154
|
+
async logicaComumFazer() {
|
|
1155
|
+
const caminhoFazer = await this.resolverDeclaracao();
|
|
1117
1156
|
this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
|
|
1118
|
-
const condicaoEnquanto = this.expressao();
|
|
1157
|
+
const condicaoEnquanto = await this.expressao();
|
|
1119
1158
|
return {
|
|
1120
1159
|
caminhoFazer,
|
|
1121
1160
|
condicaoEnquanto,
|
|
1122
1161
|
};
|
|
1123
1162
|
}
|
|
1124
|
-
declaracaoFazer(simboloFazer) {
|
|
1163
|
+
async declaracaoFazer(simboloFazer) {
|
|
1125
1164
|
try {
|
|
1126
1165
|
this.blocos += 1;
|
|
1127
|
-
const { caminhoFazer, condicaoEnquanto } = this.logicaComumFazer();
|
|
1166
|
+
const { caminhoFazer, condicaoEnquanto } = await this.logicaComumFazer();
|
|
1128
1167
|
return new declaracoes_1.Fazer(simboloFazer.hashArquivo, Number(simboloFazer.linha), caminhoFazer, // TODO: Aqui pode ser um `Bloco`?
|
|
1129
1168
|
condicaoEnquanto);
|
|
1130
1169
|
}
|
|
@@ -1176,22 +1215,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1176
1215
|
else {
|
|
1177
1216
|
importar.elementosImportacao = elementosImportacao;
|
|
1178
1217
|
}
|
|
1179
|
-
return importar;
|
|
1218
|
+
return Promise.resolve(importar);
|
|
1180
1219
|
}
|
|
1181
|
-
declaracaoPara() {
|
|
1220
|
+
async declaracaoPara() {
|
|
1182
1221
|
try {
|
|
1183
1222
|
const simboloPara = this.simbolos[this.atual - 1];
|
|
1184
1223
|
this.blocos += 1;
|
|
1185
1224
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CADA)) {
|
|
1186
|
-
return this.declaracaoParaCada(simboloPara);
|
|
1225
|
+
return await this.declaracaoParaCada(simboloPara);
|
|
1187
1226
|
}
|
|
1188
|
-
return this.declaracaoParaTradicional(simboloPara);
|
|
1227
|
+
return await this.declaracaoParaTradicional(simboloPara);
|
|
1189
1228
|
}
|
|
1190
1229
|
finally {
|
|
1191
1230
|
this.blocos -= 1;
|
|
1192
1231
|
}
|
|
1193
1232
|
}
|
|
1194
|
-
logicaParaCadaDicionario(simboloPara) {
|
|
1233
|
+
async logicaParaCadaDicionario(simboloPara) {
|
|
1195
1234
|
this.avancarEDevolverAnterior(); // chave esquerda
|
|
1196
1235
|
const nomeVariavelChave = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado identificador de variável para chave de iteração, em instrução 'para cada'.");
|
|
1197
1236
|
this.consumir(delegua_2.default.VIRGULA, "Esperado vírgula após nome de variável para chave de iteração, em instrução 'para cada'.");
|
|
@@ -1200,7 +1239,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1200
1239
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
|
|
1201
1240
|
throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
|
|
1202
1241
|
}
|
|
1203
|
-
const dicionario = this.expressao();
|
|
1242
|
+
const dicionario = await this.expressao();
|
|
1204
1243
|
if (!dicionario.hasOwnProperty('tipo')) {
|
|
1205
1244
|
throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece ser um dicionário.`);
|
|
1206
1245
|
}
|
|
@@ -1211,7 +1250,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1211
1250
|
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelChave.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelChave.lexema, 'qualquer'));
|
|
1212
1251
|
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelValor.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelValor.lexema, 'qualquer'));
|
|
1213
1252
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
1214
|
-
const corpo = this.resolverDeclaracao();
|
|
1253
|
+
const corpo = await this.resolverDeclaracao();
|
|
1215
1254
|
return {
|
|
1216
1255
|
nomeVariavelChave,
|
|
1217
1256
|
nomeVariavelValor,
|
|
@@ -1219,17 +1258,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1219
1258
|
corpo,
|
|
1220
1259
|
};
|
|
1221
1260
|
}
|
|
1222
|
-
declaracaoParaCadaDicionario(simboloPara) {
|
|
1223
|
-
const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = this.logicaParaCadaDicionario(simboloPara);
|
|
1261
|
+
async declaracaoParaCadaDicionario(simboloPara) {
|
|
1262
|
+
const { nomeVariavelChave, nomeVariavelValor, dicionario, corpo } = await this.logicaParaCadaDicionario(simboloPara);
|
|
1224
1263
|
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new tuplas_1.Dupla(new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelChave.lexema), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), nomeVariavelValor.lexema)), dicionario, corpo);
|
|
1225
1264
|
}
|
|
1226
|
-
logicaComumParaCadaVetor(simboloPara) {
|
|
1265
|
+
async logicaComumParaCadaVetor(simboloPara) {
|
|
1227
1266
|
const nomeVariavelIteracao = this.avancarEDevolverAnterior();
|
|
1228
1267
|
const variavelIteracao = new construtos_1.Variavel(this.hashArquivo, nomeVariavelIteracao);
|
|
1229
1268
|
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
|
|
1230
1269
|
throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
|
|
1231
1270
|
}
|
|
1232
|
-
let vetorOuDicionario = this.expressao();
|
|
1271
|
+
let vetorOuDicionario = await this.expressao();
|
|
1233
1272
|
if (vetorOuDicionario.constructor === construtos_1.AcessoIndiceVariavel) {
|
|
1234
1273
|
const construtoAcessoIndiceVariavel = vetorOuDicionario;
|
|
1235
1274
|
if (construtoAcessoIndiceVariavel.entidadeChamada.tipo === 'dicionário') {
|
|
@@ -1250,57 +1289,57 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1250
1289
|
}
|
|
1251
1290
|
this.pilhaEscopos.definirInformacoesVariavel(nomeVariavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomeVariavelIteracao.lexema, tipoVariavelIteracao));
|
|
1252
1291
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
1253
|
-
const corpo = this.resolverDeclaracao();
|
|
1292
|
+
const corpo = await this.resolverDeclaracao();
|
|
1254
1293
|
return {
|
|
1255
1294
|
variavelIteracao,
|
|
1256
1295
|
vetor: vetorOuDicionario,
|
|
1257
1296
|
corpo,
|
|
1258
1297
|
};
|
|
1259
1298
|
}
|
|
1260
|
-
declaracaoParaCadaVetor(simboloPara) {
|
|
1261
|
-
const { variavelIteracao, vetor, corpo } = this.logicaComumParaCadaVetor(simboloPara);
|
|
1299
|
+
async declaracaoParaCadaVetor(simboloPara) {
|
|
1300
|
+
const { variavelIteracao, vetor, corpo } = await this.logicaComumParaCadaVetor(simboloPara);
|
|
1262
1301
|
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), variavelIteracao, vetor, corpo);
|
|
1263
1302
|
}
|
|
1264
|
-
declaracaoParaCada(simboloPara) {
|
|
1303
|
+
async declaracaoParaCada(simboloPara) {
|
|
1265
1304
|
if (this.verificarTipoSimboloAtual(delegua_2.default.IDENTIFICADOR)) {
|
|
1266
|
-
return this.declaracaoParaCadaVetor(simboloPara);
|
|
1305
|
+
return await this.declaracaoParaCadaVetor(simboloPara);
|
|
1267
1306
|
}
|
|
1268
1307
|
if (this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
1269
|
-
return this.declaracaoParaCadaDicionario(simboloPara);
|
|
1308
|
+
return await this.declaracaoParaCadaDicionario(simboloPara);
|
|
1270
1309
|
}
|
|
1271
1310
|
throw this.erro(simboloPara, 'Identificador de iteração deve ser ou um par chave-valor, ou um nome de variável.');
|
|
1272
1311
|
}
|
|
1273
|
-
logicaComumPara() {
|
|
1312
|
+
async logicaComumPara() {
|
|
1274
1313
|
const comParenteses = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
|
|
1275
1314
|
let inicializador;
|
|
1276
1315
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA)) {
|
|
1277
1316
|
inicializador = null;
|
|
1278
1317
|
}
|
|
1279
1318
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VARIAVEL)) {
|
|
1280
|
-
inicializador = this.declaracaoDeVariaveis();
|
|
1319
|
+
inicializador = await this.declaracaoDeVariaveis();
|
|
1281
1320
|
}
|
|
1282
1321
|
else if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CONSTANTE)) {
|
|
1283
|
-
inicializador = this.declaracaoDeConstantes();
|
|
1322
|
+
inicializador = await this.declaracaoDeConstantes();
|
|
1284
1323
|
}
|
|
1285
1324
|
else {
|
|
1286
|
-
inicializador = this.declaracaoExpressao();
|
|
1325
|
+
inicializador = await this.declaracaoExpressao();
|
|
1287
1326
|
}
|
|
1288
1327
|
let condicao = null;
|
|
1289
1328
|
if (!this.verificarTipoSimboloAtual(delegua_2.default.PONTO_E_VIRGULA)) {
|
|
1290
|
-
condicao = this.expressao();
|
|
1329
|
+
condicao = await this.expressao();
|
|
1291
1330
|
}
|
|
1292
1331
|
// Ponto-e-vírgula é opcional aqui.
|
|
1293
1332
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1294
1333
|
let incrementar = null;
|
|
1295
1334
|
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
1296
|
-
incrementar = this.expressao();
|
|
1335
|
+
incrementar = await this.expressao();
|
|
1297
1336
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.INCREMENTAR, delegua_2.default.DECREMENTAR);
|
|
1298
1337
|
}
|
|
1299
1338
|
if (comParenteses) {
|
|
1300
1339
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após cláusulas de inicialização, condição e incremento.");
|
|
1301
1340
|
}
|
|
1302
1341
|
// TODO: Talvez não seja uma ideia melhor chamar o método de `Bloco` aqui?
|
|
1303
|
-
const corpo = this.resolverDeclaracao();
|
|
1342
|
+
const corpo = await this.resolverDeclaracao();
|
|
1304
1343
|
return {
|
|
1305
1344
|
inicializador,
|
|
1306
1345
|
condicao,
|
|
@@ -1308,11 +1347,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1308
1347
|
corpo,
|
|
1309
1348
|
};
|
|
1310
1349
|
}
|
|
1311
|
-
declaracaoParaTradicional(simboloPara) {
|
|
1312
|
-
const { inicializador, condicao, incrementar, corpo } = this.logicaComumPara();
|
|
1350
|
+
async declaracaoParaTradicional(simboloPara) {
|
|
1351
|
+
const { inicializador, condicao, incrementar, corpo } = await this.logicaComumPara();
|
|
1313
1352
|
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), inicializador, condicao, incrementar, corpo);
|
|
1314
1353
|
}
|
|
1315
|
-
declaracaoRetorna() {
|
|
1354
|
+
async declaracaoRetorna() {
|
|
1316
1355
|
const simboloChave = this.simbolos[this.atual - 1];
|
|
1317
1356
|
let valor = null;
|
|
1318
1357
|
if ([
|
|
@@ -1332,18 +1371,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1332
1371
|
delegua_2.default.TEXTO,
|
|
1333
1372
|
delegua_2.default.VERDADEIRO,
|
|
1334
1373
|
].includes(this.simbolos[this.atual].tipo)) {
|
|
1335
|
-
valor = this.expressao();
|
|
1374
|
+
valor = await this.expressao();
|
|
1336
1375
|
}
|
|
1337
1376
|
// Ponto-e-vírgula é opcional aqui.
|
|
1338
1377
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1339
1378
|
return new declaracoes_1.Retorna(simboloChave, valor);
|
|
1340
1379
|
}
|
|
1341
|
-
declaracaoSe() {
|
|
1342
|
-
const condicao = this.expressao();
|
|
1343
|
-
const caminhoEntao = this.resolverDeclaracao();
|
|
1380
|
+
async declaracaoSe() {
|
|
1381
|
+
const condicao = await this.expressao();
|
|
1382
|
+
const caminhoEntao = await this.resolverDeclaracao();
|
|
1344
1383
|
let caminhoSenao = null;
|
|
1345
1384
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
|
|
1346
|
-
caminhoSenao = this.resolverDeclaracao();
|
|
1385
|
+
caminhoSenao = await this.resolverDeclaracao();
|
|
1347
1386
|
}
|
|
1348
1387
|
return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
|
|
1349
1388
|
}
|
|
@@ -1355,69 +1394,68 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1355
1394
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1356
1395
|
return new declaracoes_1.Sustar(this.simbolos[this.atual - 1]);
|
|
1357
1396
|
}
|
|
1358
|
-
declaracaoTente() {
|
|
1397
|
+
async declaracaoTente() {
|
|
1359
1398
|
const simboloTente = this.simbolos[this.atual - 1];
|
|
1360
1399
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'tente'.");
|
|
1361
|
-
const blocoTente = this.blocoEscopo();
|
|
1400
|
+
const blocoTente = await this.blocoEscopo();
|
|
1362
1401
|
let blocoPegue = null;
|
|
1363
1402
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PEGUE)) {
|
|
1364
1403
|
if (this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
1365
1404
|
// Caso 1: com parâmetro de erro.
|
|
1366
1405
|
// `pegue` recebe um `FuncaoConstruto`.
|
|
1367
|
-
blocoPegue = this.corpoDaFuncao('bloco `pegue`');
|
|
1406
|
+
blocoPegue = await this.corpoDaFuncao('bloco `pegue`');
|
|
1368
1407
|
}
|
|
1369
1408
|
else {
|
|
1370
1409
|
// Caso 2: sem parâmetro de erro.
|
|
1371
1410
|
// `pegue` recebe um bloco.
|
|
1372
1411
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'pegue'.");
|
|
1373
|
-
blocoPegue = this.blocoEscopo();
|
|
1412
|
+
blocoPegue = await this.blocoEscopo();
|
|
1374
1413
|
}
|
|
1375
1414
|
}
|
|
1376
1415
|
let blocoSenao = null;
|
|
1377
1416
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
|
|
1378
1417
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'senão'.");
|
|
1379
|
-
blocoSenao = this.blocoEscopo();
|
|
1418
|
+
blocoSenao = await this.blocoEscopo();
|
|
1380
1419
|
}
|
|
1381
1420
|
let blocoFinalmente = null;
|
|
1382
1421
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.FINALMENTE)) {
|
|
1383
1422
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' após a declaração 'finalmente'.");
|
|
1384
|
-
blocoFinalmente = this.blocoEscopo();
|
|
1423
|
+
blocoFinalmente = await this.blocoEscopo();
|
|
1385
1424
|
}
|
|
1386
1425
|
return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente, blocoPegue, blocoSenao, blocoFinalmente);
|
|
1387
1426
|
}
|
|
1388
|
-
|
|
1427
|
+
async resolverDecoradores() {
|
|
1389
1428
|
while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
|
|
1390
|
-
|
|
1429
|
+
this.avancarEDevolverAnterior(); // Arroba
|
|
1430
|
+
let nomeDecorador = '@';
|
|
1391
1431
|
let linha;
|
|
1392
1432
|
let parametros = [];
|
|
1393
|
-
let parenteseEsquerdo = false;
|
|
1394
|
-
linha = this.simbolos[this.atual].linha;
|
|
1395
|
-
let simbolosLinhaAtual = this.simbolos.filter((l) => l.linha === linha);
|
|
1396
|
-
for (let simbolo of simbolosLinhaAtual) {
|
|
1397
|
-
parenteseEsquerdo = this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO);
|
|
1398
|
-
if (parenteseEsquerdo) {
|
|
1399
|
-
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
1400
|
-
parametros = this.logicaComumParametros();
|
|
1401
|
-
}
|
|
1402
|
-
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
1403
|
-
break;
|
|
1404
|
-
}
|
|
1405
|
-
this.avancarEDevolverAnterior();
|
|
1406
|
-
nomeDecorador += simbolo.lexema || '.';
|
|
1407
|
-
}
|
|
1408
1433
|
const atributos = {};
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1434
|
+
const primeiraParteNomeDecorador = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de decorador após '@'.");
|
|
1435
|
+
linha = Number(primeiraParteNomeDecorador.linha);
|
|
1436
|
+
nomeDecorador += primeiraParteNomeDecorador.lexema;
|
|
1437
|
+
while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO)) {
|
|
1438
|
+
const parteNomeDecorador = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome de decorador após '.'.");
|
|
1439
|
+
nomeDecorador += '.' + parteNomeDecorador.lexema;
|
|
1440
|
+
}
|
|
1441
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.PARENTESE_ESQUERDO)) {
|
|
1442
|
+
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
1443
|
+
parametros = await this.logicaComumParametros();
|
|
1444
|
+
}
|
|
1445
|
+
for (const parametro of parametros) {
|
|
1446
|
+
if (parametro.nome.lexema in atributos) {
|
|
1447
|
+
throw this.erro(parametro.nome, `Atributo de decorador declarado duas ou mais vezes: ${parametro.nome.lexema}`);
|
|
1448
|
+
}
|
|
1449
|
+
atributos[parametro.nome.lexema] = parametro.valorPadrao;
|
|
1412
1450
|
}
|
|
1413
|
-
|
|
1451
|
+
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após nome de decorador.");
|
|
1414
1452
|
}
|
|
1415
1453
|
this.pilhaDecoradores.push(new construtos_1.Decorador(this.hashArquivo, linha, nomeDecorador, atributos));
|
|
1416
1454
|
}
|
|
1417
1455
|
}
|
|
1418
|
-
declaracaoTendoComo() {
|
|
1456
|
+
async declaracaoTendoComo() {
|
|
1419
1457
|
const simboloTendo = this.simbolos[this.atual - 1];
|
|
1420
|
-
const expressaoInicializacao = this.expressao();
|
|
1458
|
+
const expressaoInicializacao = await this.expressao();
|
|
1421
1459
|
this.consumir(delegua_2.default.COMO, "Esperado palavra reservada 'como' após expressão de inicialização de variável, em declaração 'tendo'.");
|
|
1422
1460
|
const simboloNomeVariavel = this.consumir(delegua_2.default.IDENTIFICADOR, "Esperado nome do identificador em declaração 'tendo'.");
|
|
1423
1461
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado chave esquerda para abertura de bloco em declaração 'tendo'.");
|
|
@@ -1440,17 +1478,19 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1440
1478
|
break;
|
|
1441
1479
|
}
|
|
1442
1480
|
this.pilhaEscopos.definirInformacoesVariavel(simboloNomeVariavel.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simboloNomeVariavel.lexema, tipoInicializacao));
|
|
1443
|
-
const blocoCorpo = this.blocoEscopo();
|
|
1481
|
+
const blocoCorpo = await this.blocoEscopo();
|
|
1444
1482
|
return new declaracoes_1.TendoComo(simboloTendo.linha, simboloTendo.hashArquivo, simboloNomeVariavel, expressaoInicializacao, new declaracoes_1.Bloco(simboloTendo.linha, simboloTendo.hashArquivo, blocoCorpo));
|
|
1445
1483
|
}
|
|
1446
|
-
declaracaoDesestruturacaoVariavel() {
|
|
1484
|
+
async declaracaoDesestruturacaoVariavel() {
|
|
1447
1485
|
const identificadores = [];
|
|
1448
1486
|
do {
|
|
1449
1487
|
identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
|
|
1450
1488
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1451
1489
|
this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
|
|
1452
|
-
this.
|
|
1453
|
-
|
|
1490
|
+
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
|
|
1491
|
+
throw this.erro(this.simbolos[this.atual], 'Esperado igual ou seta esquerda após relação de propriedades da desestruturação.');
|
|
1492
|
+
}
|
|
1493
|
+
const inicializador = await this.expressao();
|
|
1454
1494
|
const retornos = [];
|
|
1455
1495
|
for (let identificador of identificadores) {
|
|
1456
1496
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
|
|
@@ -1559,7 +1599,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1559
1599
|
}
|
|
1560
1600
|
resolverValorConstruto(construto) {
|
|
1561
1601
|
if (construto instanceof construtos_1.Literal) {
|
|
1562
|
-
return construto.valor;
|
|
1602
|
+
return String(construto.valor);
|
|
1563
1603
|
}
|
|
1564
1604
|
throw this.erro({ hashArquivo: construto.hashArquivo, linha: construto.linha }, `Construto do tipo ${construto.constructor} não possui um mapeamento de valor.`);
|
|
1565
1605
|
}
|
|
@@ -1587,13 +1627,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1587
1627
|
* Caso símbolo atual seja `var`, devolve uma declaração de variável.
|
|
1588
1628
|
* @returns Um Construto do tipo Var.
|
|
1589
1629
|
*/
|
|
1590
|
-
declaracaoDeVariaveis() {
|
|
1630
|
+
async declaracaoDeVariaveis() {
|
|
1591
1631
|
const simboloVariavel = this.simboloAnterior();
|
|
1592
1632
|
const identificadores = [];
|
|
1593
1633
|
const retorno = [];
|
|
1594
1634
|
let tipo = 'qualquer';
|
|
1595
1635
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
1596
|
-
return this.declaracaoDesestruturacaoVariavel();
|
|
1636
|
+
return await this.declaracaoDesestruturacaoVariavel();
|
|
1597
1637
|
}
|
|
1598
1638
|
do {
|
|
1599
1639
|
identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
|
|
@@ -1604,7 +1644,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1604
1644
|
tipoExplicito = true;
|
|
1605
1645
|
this.avancarEDevolverAnterior();
|
|
1606
1646
|
}
|
|
1607
|
-
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1647
|
+
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
|
|
1608
1648
|
// Inicialização de variáveis sem valor.
|
|
1609
1649
|
for (let identificador of identificadores.values()) {
|
|
1610
1650
|
this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
|
|
@@ -1616,7 +1656,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1616
1656
|
}
|
|
1617
1657
|
const inicializadores = [];
|
|
1618
1658
|
do {
|
|
1619
|
-
inicializadores.push(this.expressao());
|
|
1659
|
+
inicializadores.push(await this.expressao());
|
|
1620
1660
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1621
1661
|
if (identificadores.length !== inicializadores.length) {
|
|
1622
1662
|
throw this.erro(simboloVariavel, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
@@ -1636,14 +1676,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1636
1676
|
this.pilhaDecoradores = [];
|
|
1637
1677
|
return retorno;
|
|
1638
1678
|
}
|
|
1639
|
-
declaracaoDesestruturacaoConstante() {
|
|
1679
|
+
async declaracaoDesestruturacaoConstante() {
|
|
1640
1680
|
const identificadores = [];
|
|
1641
1681
|
do {
|
|
1642
1682
|
identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da variável.'));
|
|
1643
1683
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1644
1684
|
this.consumir(delegua_2.default.CHAVE_DIREITA, 'Esperado chave direita para concluir relação de variáveis a serem desestruturadas.');
|
|
1645
|
-
this.
|
|
1646
|
-
|
|
1685
|
+
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
|
|
1686
|
+
throw this.erro(this.simbolos[this.atual], 'Esperado igual ou seta esquerda após relação de propriedades da desestruturação.');
|
|
1687
|
+
}
|
|
1688
|
+
const inicializador = await this.expressao();
|
|
1647
1689
|
const retornos = [];
|
|
1648
1690
|
for (let identificador of identificadores) {
|
|
1649
1691
|
// TODO: Melhorar dicionário para intuir o tipo de cada propriedade.
|
|
@@ -1658,12 +1700,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1658
1700
|
* Caso símbolo atual seja `const, constante ou fixo`, devolve uma declaração de const.
|
|
1659
1701
|
* @returns Um Construto do tipo Const.
|
|
1660
1702
|
*/
|
|
1661
|
-
declaracaoDeConstantes() {
|
|
1703
|
+
async declaracaoDeConstantes() {
|
|
1662
1704
|
const simboloConstante = this.simboloAnterior();
|
|
1663
1705
|
const identificadores = [];
|
|
1664
1706
|
let tipo = 'qualquer';
|
|
1665
1707
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_ESQUERDA)) {
|
|
1666
|
-
return this.declaracaoDesestruturacaoConstante();
|
|
1708
|
+
return await this.declaracaoDesestruturacaoConstante();
|
|
1667
1709
|
}
|
|
1668
1710
|
do {
|
|
1669
1711
|
identificadores.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da constante.'));
|
|
@@ -1674,10 +1716,12 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1674
1716
|
tipoExplicito = true;
|
|
1675
1717
|
this.avancarEDevolverAnterior();
|
|
1676
1718
|
}
|
|
1677
|
-
this.
|
|
1719
|
+
if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL, delegua_2.default.SETA_ESQUERDA)) {
|
|
1720
|
+
throw this.erro(this.simbolos[this.atual], "Esperado '=' ou '<-' após identificador em instrução 'constante'.");
|
|
1721
|
+
}
|
|
1678
1722
|
const inicializadores = [];
|
|
1679
1723
|
do {
|
|
1680
|
-
inicializadores.push(this.expressao());
|
|
1724
|
+
inicializadores.push(await this.expressao());
|
|
1681
1725
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1682
1726
|
if (identificadores.length !== inicializadores.length) {
|
|
1683
1727
|
throw this.erro(simboloConstante, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
@@ -1699,7 +1743,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1699
1743
|
this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
|
|
1700
1744
|
return retorno;
|
|
1701
1745
|
}
|
|
1702
|
-
funcao(tipo) {
|
|
1746
|
+
async funcao(tipo) {
|
|
1703
1747
|
let simbolo;
|
|
1704
1748
|
switch (this.simbolos[this.atual].tipo) {
|
|
1705
1749
|
case delegua_2.default.CONSTRUTOR:
|
|
@@ -1714,14 +1758,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1714
1758
|
// Se houver chamadas recursivas à função, precisamos definir um tipo
|
|
1715
1759
|
// para ela. Vai ser atualizado após avaliação do corpo da função.
|
|
1716
1760
|
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, 'qualquer'));
|
|
1717
|
-
const corpoDaFuncao = this.corpoDaFuncao(tipo);
|
|
1761
|
+
const corpoDaFuncao = await this.corpoDaFuncao(tipo);
|
|
1718
1762
|
const tipoDaFuncao = `função<${corpoDaFuncao.tipo}>`;
|
|
1719
1763
|
this.pilhaEscopos.definirInformacoesVariavel(simbolo.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(simbolo.lexema, tipoDaFuncao));
|
|
1720
1764
|
const funcaoDeclaracao = new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, tipoDaFuncao, decoradores);
|
|
1721
1765
|
this.pilhaEscopos.registrarReferenciaFuncao(simbolo.lexema, funcaoDeclaracao);
|
|
1722
1766
|
return funcaoDeclaracao;
|
|
1723
1767
|
}
|
|
1724
|
-
logicaComumParametros() {
|
|
1768
|
+
async logicaComumParametros() {
|
|
1725
1769
|
const parametros = [];
|
|
1726
1770
|
do {
|
|
1727
1771
|
const parametro = {};
|
|
@@ -1733,13 +1777,22 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1733
1777
|
parametro.abrangencia = 'padrao';
|
|
1734
1778
|
}
|
|
1735
1779
|
parametro.nome = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome do parâmetro.');
|
|
1780
|
+
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1781
|
+
try {
|
|
1782
|
+
const valorPadrao = await this.primario();
|
|
1783
|
+
parametro.valorPadrao = valorPadrao;
|
|
1784
|
+
}
|
|
1785
|
+
catch (erro) {
|
|
1786
|
+
throw this.erro(this.simbolos[this.atual], `Valor padrão do parâmetro '${parametro.nome.lexema}' é inválido.`);
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1736
1789
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.DOIS_PONTOS)) {
|
|
1737
1790
|
let tipoDadoParametro = this.verificarDefinicaoTipoAtual();
|
|
1738
1791
|
parametro.tipoDado = tipoDadoParametro;
|
|
1739
1792
|
this.avancarEDevolverAnterior();
|
|
1740
1793
|
}
|
|
1741
1794
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.IGUAL)) {
|
|
1742
|
-
const valorPadrao = this.primario();
|
|
1795
|
+
const valorPadrao = await this.primario();
|
|
1743
1796
|
parametro.valorPadrao = valorPadrao;
|
|
1744
1797
|
}
|
|
1745
1798
|
this.pilhaEscopos.definirInformacoesVariavel(parametro.nome.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(parametro.nome.lexema, parametro.tipoDado || 'qualquer'));
|
|
@@ -1749,13 +1802,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1749
1802
|
} while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
|
|
1750
1803
|
return parametros;
|
|
1751
1804
|
}
|
|
1752
|
-
corpoDaFuncao(tipo) {
|
|
1805
|
+
async corpoDaFuncao(tipo) {
|
|
1753
1806
|
// O parêntese esquerdo é considerado o símbolo inicial para
|
|
1754
1807
|
// fins de localização.
|
|
1755
1808
|
const parenteseEsquerdo = this.consumir(delegua_2.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}.`);
|
|
1756
1809
|
let parametros = [];
|
|
1757
1810
|
if (!this.verificarTipoSimboloAtual(delegua_2.default.PARENTESE_DIREITO)) {
|
|
1758
|
-
parametros = this.logicaComumParametros();
|
|
1811
|
+
parametros = await this.logicaComumParametros();
|
|
1759
1812
|
}
|
|
1760
1813
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
1761
1814
|
let tipoRetorno = 'qualquer';
|
|
@@ -1766,7 +1819,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1766
1819
|
definicaoExplicitaDeTipo = true;
|
|
1767
1820
|
}
|
|
1768
1821
|
this.consumir(delegua_2.default.CHAVE_ESQUERDA, `Esperado '{' antes do escopo do ${tipo}.`);
|
|
1769
|
-
const corpo = this.blocoEscopo();
|
|
1822
|
+
const corpo = await this.blocoEscopo();
|
|
1770
1823
|
let expressoesRetorna = [];
|
|
1771
1824
|
for (const declaracao of corpo) {
|
|
1772
1825
|
expressoesRetorna = expressoesRetorna.concat((0, comum_1.buscarRetornos)(declaracao));
|
|
@@ -1801,7 +1854,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1801
1854
|
}
|
|
1802
1855
|
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), parametros, corpo, tipoRetorno, definicaoExplicitaDeTipo);
|
|
1803
1856
|
}
|
|
1804
|
-
declaracaoDeClasse() {
|
|
1857
|
+
async declaracaoDeClasse() {
|
|
1805
1858
|
const simbolo = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
1806
1859
|
const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
|
|
1807
1860
|
let superClasse = null;
|
|
@@ -1821,7 +1874,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1821
1874
|
// Se o símbolo atual é arroba, é um decorador.
|
|
1822
1875
|
// Caso contrário, verificamos o próximo símbolo.
|
|
1823
1876
|
if (this.simbolos[this.atual].tipo === delegua_2.default.ARROBA) {
|
|
1824
|
-
this.
|
|
1877
|
+
await this.resolverDecoradores();
|
|
1825
1878
|
continue;
|
|
1826
1879
|
}
|
|
1827
1880
|
// Se o próximo símbolo ao atual for um parênteses, é um método.
|
|
@@ -1829,7 +1882,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1829
1882
|
const proximoSimbolo = this.simbolos[this.atual + 1];
|
|
1830
1883
|
switch (proximoSimbolo.tipo) {
|
|
1831
1884
|
case delegua_2.default.PARENTESE_ESQUERDO:
|
|
1832
|
-
metodos.push(this.funcao('método'));
|
|
1885
|
+
metodos.push(await this.funcao('método'));
|
|
1833
1886
|
break;
|
|
1834
1887
|
case delegua_2.default.DOIS_PONTOS:
|
|
1835
1888
|
const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
|
|
@@ -1859,23 +1912,23 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1859
1912
|
* @returns Uma função ou classe se o símbolo atual resolver aqui.
|
|
1860
1913
|
* O retorno de `resolverDeclaracao()` em caso contrário.
|
|
1861
1914
|
* @see resolverDeclaracao
|
|
1862
|
-
* @see
|
|
1915
|
+
* @see resolverDecoradores
|
|
1863
1916
|
*/
|
|
1864
|
-
resolverDeclaracaoForaDeBloco() {
|
|
1917
|
+
async resolverDeclaracaoForaDeBloco() {
|
|
1865
1918
|
try {
|
|
1866
1919
|
while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
|
|
1867
|
-
this.
|
|
1920
|
+
await this.resolverDecoradores();
|
|
1868
1921
|
}
|
|
1869
1922
|
if ((this.verificarTipoSimboloAtual(delegua_2.default.FUNCAO) ||
|
|
1870
1923
|
this.verificarTipoSimboloAtual(delegua_2.default.FUNÇÃO)) &&
|
|
1871
1924
|
this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
|
|
1872
1925
|
this.avancarEDevolverAnterior();
|
|
1873
|
-
return this.funcao('funcao');
|
|
1926
|
+
return await this.funcao('funcao');
|
|
1874
1927
|
}
|
|
1875
1928
|
if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CLASSE)) {
|
|
1876
|
-
return this.declaracaoDeClasse();
|
|
1929
|
+
return await this.declaracaoDeClasse();
|
|
1877
1930
|
}
|
|
1878
|
-
return this.resolverDeclaracao();
|
|
1931
|
+
return await this.resolverDeclaracao();
|
|
1879
1932
|
}
|
|
1880
1933
|
catch (erro) {
|
|
1881
1934
|
this.sincronizar();
|
|
@@ -1915,62 +1968,62 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1915
1968
|
* @see resolverDeclaracaoForaDeBloco para as declarações que não podem
|
|
1916
1969
|
* ocorrer em blocos de escopo elementares.
|
|
1917
1970
|
*/
|
|
1918
|
-
resolverDeclaracao() {
|
|
1971
|
+
async resolverDeclaracao() {
|
|
1919
1972
|
switch (this.simbolos[this.atual].tipo) {
|
|
1920
1973
|
case delegua_2.default.AJUDA:
|
|
1921
|
-
return this.declaracaoAjuda();
|
|
1974
|
+
return await this.declaracaoAjuda();
|
|
1922
1975
|
case delegua_2.default.CHAVE_ESQUERDA:
|
|
1923
1976
|
const simboloInicioBloco = this.avancarEDevolverAnterior();
|
|
1924
|
-
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), this.blocoEscopo());
|
|
1977
|
+
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
|
|
1925
1978
|
case delegua_2.default.COMENTARIO:
|
|
1926
1979
|
return this.declaracaoComentarioUmaLinha();
|
|
1927
1980
|
case delegua_2.default.CONSTANTE:
|
|
1928
1981
|
this.avancarEDevolverAnterior();
|
|
1929
|
-
return this.declaracaoDeConstantes();
|
|
1982
|
+
return await this.declaracaoDeConstantes();
|
|
1930
1983
|
case delegua_2.default.CONTINUA:
|
|
1931
1984
|
this.avancarEDevolverAnterior();
|
|
1932
1985
|
return this.declaracaoContinua();
|
|
1933
1986
|
case delegua_2.default.ENQUANTO:
|
|
1934
1987
|
this.avancarEDevolverAnterior();
|
|
1935
|
-
return this.declaracaoEnquanto();
|
|
1988
|
+
return await this.declaracaoEnquanto();
|
|
1936
1989
|
case delegua_2.default.ESCOLHA:
|
|
1937
1990
|
this.avancarEDevolverAnterior();
|
|
1938
|
-
return this.declaracaoEscolha();
|
|
1991
|
+
return await this.declaracaoEscolha();
|
|
1939
1992
|
case delegua_2.default.ESCREVA:
|
|
1940
1993
|
this.avancarEDevolverAnterior();
|
|
1941
|
-
return this.declaracaoEscreva();
|
|
1994
|
+
return await this.declaracaoEscreva();
|
|
1942
1995
|
case delegua_2.default.FALHAR:
|
|
1943
1996
|
this.avancarEDevolverAnterior();
|
|
1944
|
-
return this.declaracaoFalhar();
|
|
1997
|
+
return await this.declaracaoFalhar();
|
|
1945
1998
|
case delegua_2.default.FAZER:
|
|
1946
1999
|
const simboloFazer = this.avancarEDevolverAnterior();
|
|
1947
|
-
return this.declaracaoFazer(simboloFazer);
|
|
2000
|
+
return await this.declaracaoFazer(simboloFazer);
|
|
1948
2001
|
case delegua_2.default.IMPORTAR:
|
|
1949
2002
|
this.avancarEDevolverAnterior();
|
|
1950
|
-
return this.declaracaoImportar();
|
|
2003
|
+
return await this.declaracaoImportar();
|
|
1951
2004
|
case delegua_2.default.LINHA_COMENTARIO:
|
|
1952
2005
|
return this.declaracaoComentarioMultilinha();
|
|
1953
2006
|
case delegua_2.default.PARA:
|
|
1954
2007
|
this.avancarEDevolverAnterior();
|
|
1955
|
-
return this.declaracaoPara();
|
|
2008
|
+
return await this.declaracaoPara();
|
|
1956
2009
|
case delegua_2.default.SUSTAR:
|
|
1957
2010
|
this.avancarEDevolverAnterior();
|
|
1958
2011
|
return this.declaracaoSustar();
|
|
1959
2012
|
case delegua_2.default.SE:
|
|
1960
2013
|
this.avancarEDevolverAnterior();
|
|
1961
|
-
return this.declaracaoSe();
|
|
2014
|
+
return await this.declaracaoSe();
|
|
1962
2015
|
case delegua_2.default.RETORNA:
|
|
1963
2016
|
this.avancarEDevolverAnterior();
|
|
1964
|
-
return this.declaracaoRetorna();
|
|
2017
|
+
return await this.declaracaoRetorna();
|
|
1965
2018
|
case delegua_2.default.TENDO:
|
|
1966
2019
|
this.avancarEDevolverAnterior();
|
|
1967
|
-
return this.declaracaoTendoComo();
|
|
2020
|
+
return await this.declaracaoTendoComo();
|
|
1968
2021
|
case delegua_2.default.TENTE:
|
|
1969
2022
|
this.avancarEDevolverAnterior();
|
|
1970
|
-
return this.declaracaoTente();
|
|
2023
|
+
return await this.declaracaoTente();
|
|
1971
2024
|
case delegua_2.default.VARIAVEL:
|
|
1972
2025
|
this.avancarEDevolverAnterior();
|
|
1973
|
-
return this.declaracaoDeVariaveis();
|
|
2026
|
+
return await this.declaracaoDeVariaveis();
|
|
1974
2027
|
}
|
|
1975
2028
|
const simboloAtual = this.simbolos[this.atual];
|
|
1976
2029
|
if (simboloAtual.tipo === delegua_2.default.IDENTIFICADOR) {
|
|
@@ -1984,9 +2037,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1984
2037
|
throw this.erro(this.simbolos[this.atual], 'Não é permitido ter dois identificadores seguidos na mesma linha.');
|
|
1985
2038
|
}
|
|
1986
2039
|
}
|
|
1987
|
-
return this.declaracaoExpressao();
|
|
2040
|
+
return await this.declaracaoExpressao();
|
|
1988
2041
|
}
|
|
1989
|
-
declaracaoAjuda() {
|
|
2042
|
+
async declaracaoAjuda() {
|
|
1990
2043
|
const simboloAjuda = this.avancarEDevolverAnterior();
|
|
1991
2044
|
if (this.estaNoFinal() || this.simbolos[this.atual].tipo !== delegua_2.default.PARENTESE_ESQUERDO) {
|
|
1992
2045
|
return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, false);
|
|
@@ -1996,7 +2049,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
1996
2049
|
this.avancarEDevolverAnterior();
|
|
1997
2050
|
return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, undefined, true);
|
|
1998
2051
|
}
|
|
1999
|
-
const expressaoAjuda = this.expressao();
|
|
2052
|
+
const expressaoAjuda = await this.expressao();
|
|
2000
2053
|
this.consumir(delegua_2.default.PARENTESE_DIREITO, `Esperado parêntese direito após expressão usada como argumento em ajuda(). Atual: ${this.simbolos[this.atual].lexema}.`);
|
|
2001
2054
|
return new declaracoes_1.Ajuda(simboloAjuda.hashArquivo, simboloAjuda.linha, expressaoAjuda);
|
|
2002
2055
|
}
|
|
@@ -2102,7 +2155,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2102
2155
|
}
|
|
2103
2156
|
}
|
|
2104
2157
|
}
|
|
2105
|
-
analisar(retornoLexador, hashArquivo) {
|
|
2158
|
+
async analisar(retornoLexador, hashArquivo) {
|
|
2106
2159
|
const inicioAnalise = (0, browser_process_hrtime_1.default)();
|
|
2107
2160
|
this.erros = [];
|
|
2108
2161
|
this.atual = 0;
|
|
@@ -2115,8 +2168,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
|
|
|
2115
2168
|
this.inicializarPilhaEscopos();
|
|
2116
2169
|
let declaracoes = [];
|
|
2117
2170
|
while (!this.estaNoFinal()) {
|
|
2118
|
-
this.
|
|
2119
|
-
const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
|
|
2171
|
+
await this.resolverDecoradores();
|
|
2172
|
+
const retornoDeclaracao = await this.resolverDeclaracaoForaDeBloco();
|
|
2120
2173
|
if (Array.isArray(retornoDeclaracao)) {
|
|
2121
2174
|
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
2122
2175
|
}
|