@designliquido/delegua 0.33.10 → 0.33.12
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/dialetos/index.d.ts +0 -1
- package/analisador-semantico/dialetos/index.d.ts.map +1 -1
- package/analisador-semantico/dialetos/index.js +0 -1
- package/analisador-semantico/dialetos/index.js.map +1 -1
- package/avaliador-sintatico/dialetos/index.d.ts +0 -2
- package/avaliador-sintatico/dialetos/index.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/index.js +0 -2
- package/avaliador-sintatico/dialetos/index.js.map +1 -1
- package/bin/package.json +3 -5
- package/construtos/qual-tipo.d.ts.map +1 -1
- package/construtos/qual-tipo.js +1 -0
- package/construtos/qual-tipo.js.map +1 -1
- package/interfaces/index.d.ts +0 -1
- package/interfaces/index.d.ts.map +1 -1
- package/interfaces/index.js +0 -1
- package/interfaces/index.js.map +1 -1
- package/interfaces/interpretador-interface-potigol.d.ts.map +1 -1
- package/interpretador/dialetos/index.d.ts +0 -2
- package/interpretador/dialetos/index.d.ts.map +1 -1
- package/interpretador/dialetos/index.js +0 -2
- package/interpretador/dialetos/index.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +5 -1
- package/interpretador/interpretador-base.js.map +1 -1
- package/lexador/dialetos/index.d.ts +0 -1
- package/lexador/dialetos/index.d.ts.map +1 -1
- package/lexador/dialetos/index.js +0 -1
- package/lexador/dialetos/index.js.map +1 -1
- package/package.json +3 -5
- package/analisador-semantico/dialetos/analisador-semantico-birl.d.ts +0 -29
- package/analisador-semantico/dialetos/analisador-semantico-birl.d.ts.map +0 -1
- package/analisador-semantico/dialetos/analisador-semantico-birl.js +0 -88
- package/analisador-semantico/dialetos/analisador-semantico-birl.js.map +0 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-birl.d.ts +0 -54
- package/avaliador-sintatico/dialetos/avaliador-sintatico-birl.d.ts.map +0 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js +0 -674
- package/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js.map +0 -1
- package/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.d.ts +0 -125
- package/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.d.ts.map +0 -1
- package/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.js +0 -709
- package/avaliador-sintatico/dialetos/potigol/avaliador-sintatico-potigol.js.map +0 -1
- package/avaliador-sintatico/dialetos/potigol/index.d.ts +0 -2
- package/avaliador-sintatico/dialetos/potigol/index.d.ts.map +0 -1
- package/avaliador-sintatico/dialetos/potigol/index.js +0 -18
- package/avaliador-sintatico/dialetos/potigol/index.js.map +0 -1
- package/avaliador-sintatico/dialetos/potigol/micro-avaliador-sintatico-potigol.d.ts +0 -13
- package/avaliador-sintatico/dialetos/potigol/micro-avaliador-sintatico-potigol.d.ts.map +0 -1
- package/avaliador-sintatico/dialetos/potigol/micro-avaliador-sintatico-potigol.js +0 -73
- package/avaliador-sintatico/dialetos/potigol/micro-avaliador-sintatico-potigol.js.map +0 -1
- package/bibliotecas/dialetos/potigol/biblioteca-global.d.ts +0 -4
- package/bibliotecas/dialetos/potigol/biblioteca-global.d.ts.map +0 -1
- package/bibliotecas/dialetos/potigol/biblioteca-global.js +0 -44
- package/bibliotecas/dialetos/potigol/biblioteca-global.js.map +0 -1
- package/bibliotecas/dialetos/potigol/primitivas-numero.d.ts +0 -13
- package/bibliotecas/dialetos/potigol/primitivas-numero.d.ts.map +0 -1
- package/bibliotecas/dialetos/potigol/primitivas-numero.js +0 -13
- package/bibliotecas/dialetos/potigol/primitivas-numero.js.map +0 -1
- package/bibliotecas/dialetos/potigol/primitivas-texto.d.ts +0 -29
- package/bibliotecas/dialetos/potigol/primitivas-texto.d.ts.map +0 -1
- package/bibliotecas/dialetos/potigol/primitivas-texto.js +0 -37
- package/bibliotecas/dialetos/potigol/primitivas-texto.js.map +0 -1
- package/bibliotecas/dialetos/potigol/primitivas-vetor.d.ts +0 -27
- package/bibliotecas/dialetos/potigol/primitivas-vetor.d.ts.map +0 -1
- package/bibliotecas/dialetos/potigol/primitivas-vetor.js +0 -49
- package/bibliotecas/dialetos/potigol/primitivas-vetor.js.map +0 -1
- package/interfaces/dialetos/index.d.ts +0 -2
- package/interfaces/dialetos/index.d.ts.map +0 -1
- package/interfaces/dialetos/index.js +0 -18
- package/interfaces/dialetos/index.js.map +0 -1
- package/interfaces/dialetos/interpretador-birl-interface.d.ts +0 -12
- package/interfaces/dialetos/interpretador-birl-interface.d.ts.map +0 -1
- package/interfaces/dialetos/interpretador-birl-interface.js +0 -3
- package/interfaces/dialetos/interpretador-birl-interface.js.map +0 -1
- package/interfaces/interpretador-interface-birl.d.ts +0 -23
- package/interfaces/interpretador-interface-birl.d.ts.map +0 -1
- package/interfaces/interpretador-interface-birl.js +0 -3
- package/interfaces/interpretador-interface-birl.js.map +0 -1
- package/interpretador/dialetos/birl/comum.d.ts +0 -17
- package/interpretador/dialetos/birl/comum.d.ts.map +0 -1
- package/interpretador/dialetos/birl/comum.js +0 -271
- package/interpretador/dialetos/birl/comum.js.map +0 -1
- package/interpretador/dialetos/birl/index.d.ts +0 -3
- package/interpretador/dialetos/birl/index.d.ts.map +0 -1
- package/interpretador/dialetos/birl/index.js +0 -19
- package/interpretador/dialetos/birl/index.js.map +0 -1
- package/interpretador/dialetos/birl/interpretador-birl-com-depuracao.d.ts +0 -27
- package/interpretador/dialetos/birl/interpretador-birl-com-depuracao.d.ts.map +0 -1
- package/interpretador/dialetos/birl/interpretador-birl-com-depuracao.js +0 -68
- package/interpretador/dialetos/birl/interpretador-birl-com-depuracao.js.map +0 -1
- package/interpretador/dialetos/birl/interpretador-birl.d.ts +0 -158
- package/interpretador/dialetos/birl/interpretador-birl.d.ts.map +0 -1
- package/interpretador/dialetos/birl/interpretador-birl.js +0 -702
- package/interpretador/dialetos/birl/interpretador-birl.js.map +0 -1
- package/interpretador/dialetos/potigol/comum.d.ts +0 -22
- package/interpretador/dialetos/potigol/comum.d.ts.map +0 -1
- package/interpretador/dialetos/potigol/comum.js +0 -116
- package/interpretador/dialetos/potigol/comum.js.map +0 -1
- package/interpretador/dialetos/potigol/index.d.ts +0 -3
- package/interpretador/dialetos/potigol/index.d.ts.map +0 -1
- package/interpretador/dialetos/potigol/index.js +0 -19
- package/interpretador/dialetos/potigol/index.js.map +0 -1
- package/interpretador/dialetos/potigol/inferenciador.d.ts +0 -2
- package/interpretador/dialetos/potigol/inferenciador.d.ts.map +0 -1
- package/interpretador/dialetos/potigol/inferenciador.js +0 -34
- package/interpretador/dialetos/potigol/inferenciador.js.map +0 -1
- package/interpretador/dialetos/potigol/interpretador-potigol-com-depuracao.d.ts +0 -9
- package/interpretador/dialetos/potigol/interpretador-potigol-com-depuracao.d.ts.map +0 -1
- package/interpretador/dialetos/potigol/interpretador-potigol-com-depuracao.js +0 -48
- package/interpretador/dialetos/potigol/interpretador-potigol-com-depuracao.js.map +0 -1
- package/interpretador/dialetos/potigol/interpretador-potigol.d.ts +0 -16
- package/interpretador/dialetos/potigol/interpretador-potigol.d.ts.map +0 -1
- package/interpretador/dialetos/potigol/interpretador-potigol.js +0 -104
- package/interpretador/dialetos/potigol/interpretador-potigol.js.map +0 -1
- package/lexador/dialetos/lexador-birl.d.ts +0 -14
- package/lexador/dialetos/lexador-birl.d.ts.map +0 -1
- package/lexador/dialetos/lexador-birl.js +0 -240
- package/lexador/dialetos/lexador-birl.js.map +0 -1
- package/lexador/dialetos/palavras-reservadas/birl.d.ts +0 -46
- package/lexador/dialetos/palavras-reservadas/birl.d.ts.map +0 -1
- package/lexador/dialetos/palavras-reservadas/birl.js +0 -65
- package/lexador/dialetos/palavras-reservadas/birl.js.map +0 -1
- package/lexador/dialetos/palavras-reservadas/index.d.ts +0 -2
- package/lexador/dialetos/palavras-reservadas/index.d.ts.map +0 -1
- package/lexador/dialetos/palavras-reservadas/index.js +0 -6
- package/lexador/dialetos/palavras-reservadas/index.js.map +0 -1
- package/tipos-de-simbolos/birl.d.ts +0 -91
- package/tipos-de-simbolos/birl.d.ts.map +0 -1
- package/tipos-de-simbolos/birl.js +0 -98
- package/tipos-de-simbolos/birl.js.map +0 -1
|
@@ -1,702 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.InterpretadorBirl = void 0;
|
|
30
|
-
const construtos_1 = require("../../../construtos");
|
|
31
|
-
const espaco_variaveis_1 = require("../../../espaco-variaveis");
|
|
32
|
-
const estruturas_1 = require("../../../estruturas");
|
|
33
|
-
const excecoes_1 = require("../../../excecoes");
|
|
34
|
-
const quebras_1 = require("../../../quebras");
|
|
35
|
-
const birl_1 = __importDefault(require("../../../tipos-de-simbolos/birl"));
|
|
36
|
-
const inferenciador_1 = require("../../inferenciador");
|
|
37
|
-
const interpretador_base_1 = require("../../interpretador-base");
|
|
38
|
-
const pilha_escopos_execucao_1 = require("../../pilha-escopos-execucao");
|
|
39
|
-
const comum = __importStar(require("./comum"));
|
|
40
|
-
class InterpretadorBirl extends interpretador_base_1.InterpretadorBase {
|
|
41
|
-
constructor(diretorioBase, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
|
|
42
|
-
super(diretorioBase, false, funcaoDeRetorno, funcaoDeRetornoMesmaLinha);
|
|
43
|
-
this.funcaoDeRetorno = null;
|
|
44
|
-
this.funcaoDeRetornoMesmaLinha = null;
|
|
45
|
-
this.resultadoInterpretador = [];
|
|
46
|
-
this.regexInterpolacao = /\$\{([a-z_][\w]*)\}/gi;
|
|
47
|
-
this.expressoesStringC = {
|
|
48
|
-
'%d': 'inteiro',
|
|
49
|
-
'%i': 'inteiro',
|
|
50
|
-
'%u': 'inteiro',
|
|
51
|
-
'%f': 'real',
|
|
52
|
-
'%F': 'real',
|
|
53
|
-
'%e': 'real',
|
|
54
|
-
'%E': 'real',
|
|
55
|
-
'%g': 'real',
|
|
56
|
-
'%G': 'real',
|
|
57
|
-
'%x': 'inteiro',
|
|
58
|
-
'%X': 'inteiro',
|
|
59
|
-
'%o': 'inteiro',
|
|
60
|
-
'%s': 'texto',
|
|
61
|
-
'%c': 'texto',
|
|
62
|
-
'%p': 'texto',
|
|
63
|
-
};
|
|
64
|
-
this.diretorioBase = diretorioBase;
|
|
65
|
-
this.funcaoDeRetorno = funcaoDeRetorno || console.log;
|
|
66
|
-
this.funcaoDeRetornoMesmaLinha = funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
|
|
67
|
-
this.erros = [];
|
|
68
|
-
this.declaracoes = [];
|
|
69
|
-
this.pilhaEscoposExecucao = new pilha_escopos_execucao_1.PilhaEscoposExecucao();
|
|
70
|
-
const escopoExecucao = {
|
|
71
|
-
declaracoes: [],
|
|
72
|
-
declaracaoAtual: 0,
|
|
73
|
-
ambiente: new espaco_variaveis_1.EspacoVariaveis(),
|
|
74
|
-
finalizado: false,
|
|
75
|
-
tipo: 'outro',
|
|
76
|
-
emLacoRepeticao: false,
|
|
77
|
-
};
|
|
78
|
-
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
|
|
79
|
-
}
|
|
80
|
-
visitarExpressaoTipoDe(expressao) {
|
|
81
|
-
throw new Error('Método não implementado.');
|
|
82
|
-
}
|
|
83
|
-
visitarExpressaoFalhar(expressao) {
|
|
84
|
-
throw new Error('Método não implementado.');
|
|
85
|
-
}
|
|
86
|
-
async avaliar(expressao) {
|
|
87
|
-
// @todo: Implementar validação mais inteligente.
|
|
88
|
-
// Descomente o código abaixo quando precisar detectar expressões undefined ou nulas.
|
|
89
|
-
// Por algum motivo o depurador do VSCode não funciona direito aqui
|
|
90
|
-
// com breakpoint condicional.
|
|
91
|
-
/* if (expressao === null || expressao === undefined) {
|
|
92
|
-
console.log('Aqui');
|
|
93
|
-
} */
|
|
94
|
-
return await expressao.aceitar(this);
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Empilha declarações na pilha de escopos de execução, cria um novo ambiente e
|
|
98
|
-
* executa as declarações empilhadas.
|
|
99
|
-
* Se o retorno do último bloco foi uma exceção (normalmente um erro em tempo de execução),
|
|
100
|
-
* atira a exceção daqui.
|
|
101
|
-
* Isso é usado, por exemplo, em blocos tente ... pegue ... finalmente.
|
|
102
|
-
* @param declaracoes Um vetor de declaracoes a ser executado.
|
|
103
|
-
* @param ambiente O ambiente de execução quando houver, como parâmetros, argumentos, etc.
|
|
104
|
-
*/
|
|
105
|
-
async executarBloco(declaracoes, ambiente) {
|
|
106
|
-
const escopoExecucao = {
|
|
107
|
-
declaracoes: declaracoes,
|
|
108
|
-
declaracaoAtual: 0,
|
|
109
|
-
ambiente: ambiente || new espaco_variaveis_1.EspacoVariaveis(),
|
|
110
|
-
finalizado: false,
|
|
111
|
-
tipo: 'outro',
|
|
112
|
-
emLacoRepeticao: false,
|
|
113
|
-
};
|
|
114
|
-
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
|
|
115
|
-
const retornoUltimoEscopo = await this.executarUltimoEscopo();
|
|
116
|
-
if (retornoUltimoEscopo instanceof excecoes_1.ErroEmTempoDeExecucao) {
|
|
117
|
-
return Promise.reject(retornoUltimoEscopo);
|
|
118
|
-
}
|
|
119
|
-
return retornoUltimoEscopo;
|
|
120
|
-
}
|
|
121
|
-
async visitarExpressaoAgrupamento(expressao) {
|
|
122
|
-
return await this.avaliar(expressao.expressao);
|
|
123
|
-
}
|
|
124
|
-
verificarOperandoNumero(operador, operando) {
|
|
125
|
-
if (typeof operando === 'number' || operando.tipo === 'número')
|
|
126
|
-
return;
|
|
127
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operando precisa ser um número.', Number(operador.linha));
|
|
128
|
-
}
|
|
129
|
-
async visitarExpressaoUnaria(expressao) {
|
|
130
|
-
const operando = await this.avaliar(expressao.operando);
|
|
131
|
-
let valor = operando.hasOwnProperty('valor') ? operando.valor : operando;
|
|
132
|
-
switch (expressao.operador.tipo) {
|
|
133
|
-
case birl_1.default.SUBTRACAO:
|
|
134
|
-
this.verificarOperandoNumero(expressao.operador, valor);
|
|
135
|
-
return -valor;
|
|
136
|
-
case birl_1.default.NEGACAO:
|
|
137
|
-
return !this.eVerdadeiro(valor);
|
|
138
|
-
case birl_1.default.BIT_NOT:
|
|
139
|
-
return ~valor;
|
|
140
|
-
// Para incrementar e decrementar, primeiro precisamos saber se o operador
|
|
141
|
-
// veio antes do literal ou variável.
|
|
142
|
-
// Se veio antes e o operando é uma variável, precisamos incrementar/decrementar,
|
|
143
|
-
// armazenar o valor da variável pra só então devolver o valor.
|
|
144
|
-
case birl_1.default.INCREMENTAR:
|
|
145
|
-
if (expressao.incidenciaOperador === 'ANTES') {
|
|
146
|
-
valor++;
|
|
147
|
-
if (expressao.operando instanceof construtos_1.Variavel) {
|
|
148
|
-
this.pilhaEscoposExecucao.atribuirVariavel(expressao.operando.simbolo, valor);
|
|
149
|
-
}
|
|
150
|
-
return valor;
|
|
151
|
-
}
|
|
152
|
-
const valorAnteriorIncremento = valor;
|
|
153
|
-
this.pilhaEscoposExecucao.atribuirVariavel(expressao.operando.simbolo, ++valor);
|
|
154
|
-
return valorAnteriorIncremento;
|
|
155
|
-
case birl_1.default.DECREMENTAR:
|
|
156
|
-
if (expressao.incidenciaOperador === 'ANTES') {
|
|
157
|
-
valor--;
|
|
158
|
-
if (expressao.operando instanceof construtos_1.Variavel) {
|
|
159
|
-
this.pilhaEscoposExecucao.atribuirVariavel(expressao.operando.simbolo, valor);
|
|
160
|
-
}
|
|
161
|
-
return valor;
|
|
162
|
-
}
|
|
163
|
-
const valorAnteriorDecremento = valor;
|
|
164
|
-
this.pilhaEscoposExecucao.atribuirVariavel(expressao.operando.simbolo, --valor);
|
|
165
|
-
return valorAnteriorDecremento;
|
|
166
|
-
}
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
eIgual(esquerda, direita) {
|
|
170
|
-
if (esquerda === null && direita === null)
|
|
171
|
-
return true;
|
|
172
|
-
if (esquerda === null)
|
|
173
|
-
return false;
|
|
174
|
-
return esquerda === direita;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Verifica se operandos são números, que podem ser tanto variáveis puras do JavaScript
|
|
178
|
-
* (neste caso, `number`), ou podem ser variáveis de Delégua com inferência (`VariavelInterface`).
|
|
179
|
-
* @param operador O símbolo do operador.
|
|
180
|
-
* @param direita O operando direito.
|
|
181
|
-
* @param esquerda O operando esquerdo.
|
|
182
|
-
* @returns Se ambos os operandos são números ou não.
|
|
183
|
-
*/
|
|
184
|
-
verificarOperandosNumeros(operador, direita, esquerda) {
|
|
185
|
-
const tipoDireita = direita.tipo ? direita.tipo : typeof direita === 'number' ? 'número' : String(NaN);
|
|
186
|
-
const tipoEsquerda = esquerda.tipo
|
|
187
|
-
? esquerda.tipo
|
|
188
|
-
: typeof esquerda === 'number'
|
|
189
|
-
? 'número'
|
|
190
|
-
: String(NaN);
|
|
191
|
-
const tiposNumericos = ['inteiro', 'numero', 'número', 'real'];
|
|
192
|
-
if (tiposNumericos.includes(tipoDireita.toLowerCase()) && tiposNumericos.includes(tipoEsquerda.toLowerCase()))
|
|
193
|
-
return;
|
|
194
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
|
|
195
|
-
}
|
|
196
|
-
async visitarExpressaoBinaria(expressao) {
|
|
197
|
-
try {
|
|
198
|
-
const esquerda = await this.avaliar(expressao.esquerda);
|
|
199
|
-
const direita = await this.avaliar(expressao.direita);
|
|
200
|
-
const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda;
|
|
201
|
-
const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita;
|
|
202
|
-
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
|
|
203
|
-
? esquerda.tipo
|
|
204
|
-
: (0, inferenciador_1.inferirTipoVariavel)(esquerda);
|
|
205
|
-
const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo')) ? direita.tipo : (0, inferenciador_1.inferirTipoVariavel)(direita);
|
|
206
|
-
switch (expressao.operador.tipo) {
|
|
207
|
-
case birl_1.default.EXPONENCIACAO:
|
|
208
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
209
|
-
return Math.pow(valorEsquerdo, valorDireito);
|
|
210
|
-
case birl_1.default.MAIOR:
|
|
211
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
212
|
-
return Number(valorEsquerdo) > Number(valorDireito);
|
|
213
|
-
case birl_1.default.MAIOR_IGUAL:
|
|
214
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
215
|
-
return Number(valorEsquerdo) >= Number(valorDireito);
|
|
216
|
-
case birl_1.default.MENOR:
|
|
217
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
218
|
-
return Number(valorEsquerdo) < Number(valorDireito);
|
|
219
|
-
case birl_1.default.MENOR_IGUAL:
|
|
220
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
221
|
-
return Number(valorEsquerdo) <= Number(valorDireito);
|
|
222
|
-
case birl_1.default.SUBTRACAO:
|
|
223
|
-
case birl_1.default.MENOS_IGUAL:
|
|
224
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
225
|
-
return Number(valorEsquerdo) - Number(valorDireito);
|
|
226
|
-
case birl_1.default.ADICAO:
|
|
227
|
-
case birl_1.default.MAIS_IGUAL:
|
|
228
|
-
if (tipoEsquerdo === 'número' && tipoDireito === 'número') {
|
|
229
|
-
return Number(valorEsquerdo) + Number(valorDireito);
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
return String(valorEsquerdo) + String(valorDireito);
|
|
233
|
-
}
|
|
234
|
-
case birl_1.default.DIVISAO:
|
|
235
|
-
case birl_1.default.DIVISAO_IGUAL:
|
|
236
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
237
|
-
return Number(valorEsquerdo) / Number(valorDireito);
|
|
238
|
-
case birl_1.default.DIVISAO_INTEIRA:
|
|
239
|
-
case birl_1.default.DIVISAO_INTEIRA_IGUAL:
|
|
240
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
241
|
-
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
242
|
-
case birl_1.default.MULTIPLICACAO:
|
|
243
|
-
case birl_1.default.MULTIPLICACAO_IGUAL:
|
|
244
|
-
if (tipoEsquerdo === 'texto' || tipoDireito === 'texto') {
|
|
245
|
-
// Sem ambos os valores resolvem como texto, multiplica normal.
|
|
246
|
-
// Se apenas um resolve como texto, o outro repete o
|
|
247
|
-
// texto n vezes, sendo n o valor do outro.
|
|
248
|
-
if (tipoEsquerdo === 'texto' && tipoDireito === 'texto') {
|
|
249
|
-
return Number(valorEsquerdo) * Number(valorDireito);
|
|
250
|
-
}
|
|
251
|
-
if (tipoEsquerdo === 'texto') {
|
|
252
|
-
return valorEsquerdo.repeat(Number(valorDireito));
|
|
253
|
-
}
|
|
254
|
-
return valorDireito.repeat(Number(valorEsquerdo));
|
|
255
|
-
}
|
|
256
|
-
return Number(valorEsquerdo) * Number(valorDireito);
|
|
257
|
-
case birl_1.default.MODULO:
|
|
258
|
-
case birl_1.default.MODULO_IGUAL:
|
|
259
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
260
|
-
return Number(valorEsquerdo) % Number(valorDireito);
|
|
261
|
-
case birl_1.default.BIT_AND:
|
|
262
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
263
|
-
return Number(valorEsquerdo) & Number(valorDireito);
|
|
264
|
-
case birl_1.default.BIT_XOR:
|
|
265
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
266
|
-
return Number(valorEsquerdo) ^ Number(valorDireito);
|
|
267
|
-
case birl_1.default.BIT_OR:
|
|
268
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
269
|
-
return Number(valorEsquerdo) | Number(valorDireito);
|
|
270
|
-
case birl_1.default.MENOR_MENOR:
|
|
271
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
272
|
-
return Number(valorEsquerdo) << Number(valorDireito);
|
|
273
|
-
case birl_1.default.MAIOR_MAIOR:
|
|
274
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
275
|
-
return Number(valorEsquerdo) >> Number(valorDireito);
|
|
276
|
-
case birl_1.default.DIFERENTE:
|
|
277
|
-
return !this.eIgual(valorEsquerdo, valorDireito);
|
|
278
|
-
case birl_1.default.IGUAL_IGUAL:
|
|
279
|
-
return this.eIgual(valorEsquerdo, valorDireito);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
catch (erro) {
|
|
283
|
-
this.erros.push({
|
|
284
|
-
erroInterno: erro,
|
|
285
|
-
linha: expressao.linha,
|
|
286
|
-
hashArquivo: expressao.hashArquivo,
|
|
287
|
-
});
|
|
288
|
-
return Promise.reject(erro);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Executa uma chamada de função, método ou classe.
|
|
293
|
-
* @param expressao A expressão chamada.
|
|
294
|
-
* @returns O resultado da chamada.
|
|
295
|
-
*/
|
|
296
|
-
async visitarExpressaoDeChamada(expressao) {
|
|
297
|
-
try {
|
|
298
|
-
const variavelEntidadeChamada = await this.avaliar(expressao.entidadeChamada);
|
|
299
|
-
if (variavelEntidadeChamada === null) {
|
|
300
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' + String(expressao.entidadeChamada), expressao.linha));
|
|
301
|
-
}
|
|
302
|
-
const entidadeChamada = variavelEntidadeChamada.hasOwnProperty('valor')
|
|
303
|
-
? variavelEntidadeChamada.valor
|
|
304
|
-
: variavelEntidadeChamada;
|
|
305
|
-
let argumentos = [];
|
|
306
|
-
for (let i = 0; i < expressao.argumentos.length; i++) {
|
|
307
|
-
const variavelArgumento = expressao.argumentos[i];
|
|
308
|
-
const nomeArgumento = variavelArgumento.hasOwnProperty('simbolo')
|
|
309
|
-
? variavelArgumento.simbolo.lexema
|
|
310
|
-
: undefined;
|
|
311
|
-
argumentos.push({
|
|
312
|
-
nome: nomeArgumento,
|
|
313
|
-
valor: await this.avaliar(variavelArgumento),
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
if (entidadeChamada instanceof estruturas_1.DeleguaModulo) {
|
|
317
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Entidade chamada é um módulo de Birl. Provavelmente você quer chamar um de seus componentes?', expressao.linha));
|
|
318
|
-
}
|
|
319
|
-
if (entidadeChamada instanceof estruturas_1.MetodoPrimitiva) {
|
|
320
|
-
const argumentosResolvidos = [];
|
|
321
|
-
for (const argumento of expressao.argumentos) {
|
|
322
|
-
const valorResolvido = await this.avaliar(argumento);
|
|
323
|
-
argumentosResolvidos.push((valorResolvido === null || valorResolvido === void 0 ? void 0 : valorResolvido.hasOwnProperty('valor')) ? valorResolvido.valor : valorResolvido);
|
|
324
|
-
}
|
|
325
|
-
return await entidadeChamada.chamar(this, argumentosResolvidos);
|
|
326
|
-
}
|
|
327
|
-
let parametros;
|
|
328
|
-
if (entidadeChamada instanceof estruturas_1.DeleguaFuncao) {
|
|
329
|
-
parametros = entidadeChamada.declaracao.parametros;
|
|
330
|
-
}
|
|
331
|
-
else if (entidadeChamada instanceof estruturas_1.DeleguaClasse) {
|
|
332
|
-
parametros = entidadeChamada.metodos.inicializacao
|
|
333
|
-
? entidadeChamada.metodos.inicializacao.declaracao.parametros
|
|
334
|
-
: [];
|
|
335
|
-
}
|
|
336
|
-
else {
|
|
337
|
-
parametros = [];
|
|
338
|
-
}
|
|
339
|
-
const aridade = entidadeChamada.aridade ? entidadeChamada.aridade() : entidadeChamada.length;
|
|
340
|
-
// Completar os parâmetros não preenchidos com nulos.
|
|
341
|
-
if (argumentos.length < aridade) {
|
|
342
|
-
const diferenca = aridade - argumentos.length;
|
|
343
|
-
for (let i = 0; i < diferenca; i++) {
|
|
344
|
-
argumentos.push(null);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
if (parametros &&
|
|
349
|
-
parametros.length > 0 &&
|
|
350
|
-
parametros[parametros.length - 1].abrangencia === 'multiplo') {
|
|
351
|
-
let novosArgumentos = argumentos.slice(0, parametros.length - 1);
|
|
352
|
-
novosArgumentos = novosArgumentos.concat(argumentos.slice(parametros.length - 1, argumentos.length));
|
|
353
|
-
argumentos = novosArgumentos;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
if (entidadeChamada instanceof estruturas_1.FuncaoPadrao) {
|
|
357
|
-
try {
|
|
358
|
-
return entidadeChamada.chamar(argumentos.map((a) => (a !== null && a.hasOwnProperty('valor') ? a.valor : a)), expressao.entidadeChamada.nome);
|
|
359
|
-
}
|
|
360
|
-
catch (erro) {
|
|
361
|
-
this.erros.push({
|
|
362
|
-
erroInterno: erro,
|
|
363
|
-
linha: expressao.linha,
|
|
364
|
-
hashArquivo: expressao.hashArquivo,
|
|
365
|
-
});
|
|
366
|
-
this.erros.push(erro);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
if (entidadeChamada instanceof estruturas_1.Chamavel) {
|
|
370
|
-
return entidadeChamada.chamar(this, argumentos);
|
|
371
|
-
}
|
|
372
|
-
// A função chamada pode ser de uma biblioteca JavaScript.
|
|
373
|
-
// Neste caso apenas testamos se o tipo é uma função.
|
|
374
|
-
if (typeof entidadeChamada === 'function') {
|
|
375
|
-
let objeto = null;
|
|
376
|
-
if (expressao.entidadeChamada.objeto) {
|
|
377
|
-
objeto = await this.avaliar(expressao.entidadeChamada.objeto);
|
|
378
|
-
}
|
|
379
|
-
return entidadeChamada.apply(objeto.hasOwnProperty('valor') ? objeto.valor : objeto, argumentos);
|
|
380
|
-
}
|
|
381
|
-
return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Só pode chamar função ou classe.', expressao.linha));
|
|
382
|
-
}
|
|
383
|
-
catch (erro) {
|
|
384
|
-
console.log(erro);
|
|
385
|
-
this.erros.push({
|
|
386
|
-
erroInterno: erro,
|
|
387
|
-
linha: expressao.linha,
|
|
388
|
-
hashArquivo: expressao.hashArquivo,
|
|
389
|
-
});
|
|
390
|
-
this.erros.push(erro);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
async visitarExpressaoDeAtribuicao(expressao) {
|
|
394
|
-
throw new Error('Método não implementado.');
|
|
395
|
-
}
|
|
396
|
-
procurarVariavel(simbolo) {
|
|
397
|
-
return this.pilhaEscoposExecucao.obterValorVariavel(simbolo);
|
|
398
|
-
}
|
|
399
|
-
visitarExpressaoDeVariavel(expressao) {
|
|
400
|
-
return this.procurarVariavel(expressao.simbolo);
|
|
401
|
-
}
|
|
402
|
-
async visitarDeclaracaoDeExpressao(declaracao) {
|
|
403
|
-
throw new Error('Método não implementado.');
|
|
404
|
-
}
|
|
405
|
-
/**
|
|
406
|
-
* Execução da leitura de valores da entrada configurada no
|
|
407
|
-
* início da aplicação.
|
|
408
|
-
* @param expressao Expressão do tipo Leia
|
|
409
|
-
* @returns Promise com o resultado da leitura.
|
|
410
|
-
*/
|
|
411
|
-
async visitarExpressaoLeia(expressao) {
|
|
412
|
-
await comum.visitarExpressaoLeia(this, expressao);
|
|
413
|
-
}
|
|
414
|
-
async visitarExpressaoLiteral(expressao) {
|
|
415
|
-
return comum.visitarExpressaoLiteral(expressao);
|
|
416
|
-
}
|
|
417
|
-
async visitarExpressaoLogica(expressao) {
|
|
418
|
-
const esquerda = await this.avaliar(expressao.esquerda);
|
|
419
|
-
if (expressao.operador.tipo === birl_1.default.EM) {
|
|
420
|
-
const direita = await this.avaliar(expressao.direita);
|
|
421
|
-
if (Array.isArray(direita) || typeof direita === 'string') {
|
|
422
|
-
return direita.includes(esquerda);
|
|
423
|
-
}
|
|
424
|
-
else if (direita.constructor === Object) {
|
|
425
|
-
return esquerda in direita;
|
|
426
|
-
}
|
|
427
|
-
else {
|
|
428
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(esquerda, "Tipo de chamada inválida com 'em'.", expressao.linha);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
// se um estado for verdadeiro, retorna verdadeiro
|
|
432
|
-
if (expressao.operador.tipo === birl_1.default.OU) {
|
|
433
|
-
if (this.eVerdadeiro(esquerda))
|
|
434
|
-
return esquerda;
|
|
435
|
-
}
|
|
436
|
-
// se um estado for falso, retorna falso
|
|
437
|
-
if (expressao.operador.tipo === birl_1.default.E) {
|
|
438
|
-
if (!this.eVerdadeiro(esquerda))
|
|
439
|
-
return esquerda;
|
|
440
|
-
}
|
|
441
|
-
return await this.avaliar(expressao.direita);
|
|
442
|
-
}
|
|
443
|
-
async visitarDeclaracaoPara(declaracao) {
|
|
444
|
-
return comum.visitarDeclaracaoPara(this, declaracao);
|
|
445
|
-
}
|
|
446
|
-
visitarDeclaracaoParaCada(declaracao) {
|
|
447
|
-
throw new Error('Método não implementado.');
|
|
448
|
-
}
|
|
449
|
-
eVerdadeiro(objeto) {
|
|
450
|
-
if (objeto === null)
|
|
451
|
-
return false;
|
|
452
|
-
if (typeof objeto === 'boolean')
|
|
453
|
-
return Boolean(objeto);
|
|
454
|
-
if (objeto.hasOwnProperty('valor')) {
|
|
455
|
-
return Boolean(objeto.valor);
|
|
456
|
-
}
|
|
457
|
-
return true;
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Executa uma expressão Se, que tem uma condição, pode ter um bloco
|
|
461
|
-
* Senão, e múltiplos blocos Senão-se.
|
|
462
|
-
* @param declaracao A declaração Se.
|
|
463
|
-
* @returns O resultado da avaliação do bloco cuja condição é verdadeira.
|
|
464
|
-
*/
|
|
465
|
-
async visitarDeclaracaoSe(declaracao) {
|
|
466
|
-
if (this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
467
|
-
return await this.executar(declaracao.caminhoEntao);
|
|
468
|
-
}
|
|
469
|
-
// @todo: Verificar se é necessário avaliar o caminho Senão.
|
|
470
|
-
for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
|
|
471
|
-
const atual = declaracao.caminhosSeSenao[i];
|
|
472
|
-
if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
|
|
473
|
-
return await this.executar(atual.caminho);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
if (declaracao.caminhoSenao !== null) {
|
|
477
|
-
return await this.executar(declaracao.caminhoSenao);
|
|
478
|
-
}
|
|
479
|
-
return null;
|
|
480
|
-
}
|
|
481
|
-
visitarExpressaoFimPara(declaracao) {
|
|
482
|
-
throw new Error('Método não implementado.');
|
|
483
|
-
}
|
|
484
|
-
async visitarDeclaracaoFazer(declaracao) {
|
|
485
|
-
throw new Error('Método não implementado.');
|
|
486
|
-
}
|
|
487
|
-
async visitarDeclaracaoEscolha(declaracao) {
|
|
488
|
-
throw new Error('Método não implementado.');
|
|
489
|
-
}
|
|
490
|
-
async visitarDeclaracaoTente(declaracao) {
|
|
491
|
-
throw new Error('Método não implementado.');
|
|
492
|
-
}
|
|
493
|
-
async visitarDeclaracaoEnquanto(declaracao) {
|
|
494
|
-
let retornoExecucao;
|
|
495
|
-
while (!(retornoExecucao instanceof quebras_1.Quebra) && this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
496
|
-
try {
|
|
497
|
-
retornoExecucao = await this.executar(declaracao.corpo);
|
|
498
|
-
if (retornoExecucao instanceof quebras_1.SustarQuebra) {
|
|
499
|
-
return null;
|
|
500
|
-
}
|
|
501
|
-
if (retornoExecucao instanceof quebras_1.ContinuarQuebra) {
|
|
502
|
-
retornoExecucao = null;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
catch (erro) {
|
|
506
|
-
this.erros.push({
|
|
507
|
-
erroInterno: erro,
|
|
508
|
-
linha: declaracao.linha,
|
|
509
|
-
hashArquivo: declaracao.hashArquivo,
|
|
510
|
-
});
|
|
511
|
-
return Promise.reject(erro);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
return retornoExecucao;
|
|
515
|
-
}
|
|
516
|
-
async substituirValor(stringOriginal, novoValor, simboloTipo) {
|
|
517
|
-
return comum.substituirValor(stringOriginal, novoValor, simboloTipo);
|
|
518
|
-
}
|
|
519
|
-
async resolveQuantidadeDeInterpolacoes(texto) {
|
|
520
|
-
return comum.resolveQuantidadeDeInterpolacoes(texto);
|
|
521
|
-
}
|
|
522
|
-
async verificaTipoDaInterpolação(dados) {
|
|
523
|
-
return comum.verificaTipoDaInterpolação(dados);
|
|
524
|
-
}
|
|
525
|
-
async avaliarArgumentosEscreva(argumentos) {
|
|
526
|
-
return comum.avaliarArgumentosEscreva(this, argumentos);
|
|
527
|
-
}
|
|
528
|
-
/**
|
|
529
|
-
* Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
|
|
530
|
-
* alguma função para escrever numa página Web.
|
|
531
|
-
* @param declaracao A declaração.
|
|
532
|
-
* @returns Sempre nulo, por convenção de visita.
|
|
533
|
-
*/
|
|
534
|
-
async visitarDeclaracaoEscreva(declaracao) {
|
|
535
|
-
try {
|
|
536
|
-
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
537
|
-
this.funcaoDeRetorno(formatoTexto);
|
|
538
|
-
return null;
|
|
539
|
-
}
|
|
540
|
-
catch (erro) {
|
|
541
|
-
this.erros.push({
|
|
542
|
-
erroInterno: erro,
|
|
543
|
-
linha: declaracao.linha,
|
|
544
|
-
hashArquivo: declaracao.hashArquivo,
|
|
545
|
-
});
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
|
|
549
|
-
throw new Error('Método não implementado.');
|
|
550
|
-
}
|
|
551
|
-
async visitarExpressaoBloco(declaracao) {
|
|
552
|
-
return await this.executarBloco(declaracao.declaracoes);
|
|
553
|
-
}
|
|
554
|
-
async avaliacaoDeclaracaoVarOuConst(declaracao) {
|
|
555
|
-
let valorOuOutraVariavel = null;
|
|
556
|
-
if (declaracao.inicializador !== null) {
|
|
557
|
-
valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
|
|
558
|
-
}
|
|
559
|
-
let valorFinal = null;
|
|
560
|
-
if (valorOuOutraVariavel !== null && valorOuOutraVariavel !== undefined) {
|
|
561
|
-
valorFinal = valorOuOutraVariavel.hasOwnProperty('valor')
|
|
562
|
-
? valorOuOutraVariavel.valor
|
|
563
|
-
: valorOuOutraVariavel;
|
|
564
|
-
}
|
|
565
|
-
return valorFinal;
|
|
566
|
-
}
|
|
567
|
-
/**
|
|
568
|
-
* Executa expressão de definição de variável.
|
|
569
|
-
* @param declaracao A declaração Var
|
|
570
|
-
* @returns Sempre retorna nulo.
|
|
571
|
-
*/
|
|
572
|
-
async visitarDeclaracaoVar(declaracao) {
|
|
573
|
-
const valorFinal = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
|
|
574
|
-
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, declaracao.tipo);
|
|
575
|
-
return null;
|
|
576
|
-
}
|
|
577
|
-
visitarDeclaracaoConst(declaracao) {
|
|
578
|
-
throw new Error('Método não implementado.');
|
|
579
|
-
}
|
|
580
|
-
visitarExpressaoContinua(declaracao) {
|
|
581
|
-
return new quebras_1.ContinuarQuebra();
|
|
582
|
-
}
|
|
583
|
-
visitarExpressaoSustar(declaracao) {
|
|
584
|
-
return new quebras_1.SustarQuebra();
|
|
585
|
-
}
|
|
586
|
-
async visitarExpressaoRetornar(declaracao) {
|
|
587
|
-
let valor = null;
|
|
588
|
-
if (declaracao.valor != null)
|
|
589
|
-
valor = await this.avaliar(declaracao.valor);
|
|
590
|
-
return new quebras_1.RetornoQuebra(valor);
|
|
591
|
-
}
|
|
592
|
-
visitarExpressaoAtribuicaoPorIndice(expressao) {
|
|
593
|
-
throw new Error('Método não implementado.');
|
|
594
|
-
}
|
|
595
|
-
async visitarExpressaoAcessoIndiceVariavel(expressao) {
|
|
596
|
-
throw new Error('Método não implementado.');
|
|
597
|
-
}
|
|
598
|
-
async visitarExpressaoDefinirValor(expressao) {
|
|
599
|
-
throw new Error('Método não implementado.');
|
|
600
|
-
}
|
|
601
|
-
visitarDeclaracaoDefinicaoFuncao(declaracao) {
|
|
602
|
-
const funcao = new estruturas_1.DeleguaFuncao(declaracao.simbolo.lexema, declaracao.funcao);
|
|
603
|
-
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, funcao);
|
|
604
|
-
}
|
|
605
|
-
async visitarDeclaracaoClasse(declaracao) {
|
|
606
|
-
throw new Error('Método não implementado.');
|
|
607
|
-
}
|
|
608
|
-
async visitarExpressaoAcessoMetodo(expressao) {
|
|
609
|
-
throw new Error('Método não implementado.');
|
|
610
|
-
}
|
|
611
|
-
visitarExpressaoIsto(expressao) {
|
|
612
|
-
throw new Error('Método não implementado.');
|
|
613
|
-
}
|
|
614
|
-
async visitarExpressaoDicionario(expressao) {
|
|
615
|
-
throw new Error('Método não implementado.');
|
|
616
|
-
}
|
|
617
|
-
async visitarExpressaoVetor(expressao) {
|
|
618
|
-
throw new Error('Método não implementado.');
|
|
619
|
-
}
|
|
620
|
-
visitarExpressaoSuper(expressao) {
|
|
621
|
-
throw new Error('Método não implementado.');
|
|
622
|
-
}
|
|
623
|
-
paraTexto(objeto) {
|
|
624
|
-
if (objeto === null || objeto === undefined)
|
|
625
|
-
return 'nulo';
|
|
626
|
-
if (typeof objeto === 'boolean') {
|
|
627
|
-
return objeto ? 'verdadeiro' : 'falso';
|
|
628
|
-
}
|
|
629
|
-
if (objeto instanceof Date) {
|
|
630
|
-
const formato = Intl.DateTimeFormat('pt', {
|
|
631
|
-
dateStyle: 'full',
|
|
632
|
-
timeStyle: 'full',
|
|
633
|
-
});
|
|
634
|
-
return formato.format(objeto);
|
|
635
|
-
}
|
|
636
|
-
if (Array.isArray(objeto))
|
|
637
|
-
return objeto;
|
|
638
|
-
if (objeto.valor instanceof estruturas_1.ObjetoPadrao)
|
|
639
|
-
return objeto.valor.paraTexto();
|
|
640
|
-
if (typeof objeto === 'object')
|
|
641
|
-
return JSON.stringify(objeto);
|
|
642
|
-
return objeto.toString();
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* Efetivamente executa uma declaração.
|
|
646
|
-
* @param declaracao A declaração a ser executada.
|
|
647
|
-
* @param mostrarResultado Se resultado deve ser mostrado ou não. Normalmente usado
|
|
648
|
-
* pelo modo LAIR.
|
|
649
|
-
*/
|
|
650
|
-
async executar(declaracao, mostrarResultado = false) {
|
|
651
|
-
let resultado = null;
|
|
652
|
-
resultado = await declaracao.aceitar(this);
|
|
653
|
-
if (mostrarResultado) {
|
|
654
|
-
this.funcaoDeRetorno(this.paraTexto(resultado));
|
|
655
|
-
}
|
|
656
|
-
if (resultado || typeof resultado === 'boolean') {
|
|
657
|
-
this.resultadoInterpretador.push(this.paraTexto(resultado));
|
|
658
|
-
}
|
|
659
|
-
return resultado;
|
|
660
|
-
}
|
|
661
|
-
/**
|
|
662
|
-
* Executa o último escopo empilhado no topo na pilha de escopos do interpretador.
|
|
663
|
-
* Esse método pega exceções, mas apenas as devolve.
|
|
664
|
-
*
|
|
665
|
-
* O tratamento das exceções é feito de acordo com o bloco chamador.
|
|
666
|
-
* Por exemplo, em `tente ... pegue ... finalmente`, a exceção é capturada e tratada.
|
|
667
|
-
* Em outros blocos, pode ser desejável ter o erro em tela.
|
|
668
|
-
* @param manterAmbiente Se verdadeiro, ambiente do topo da pilha de escopo é copiado para o ambiente imediatamente abaixo.
|
|
669
|
-
* @returns O resultado da execução do escopo, se houver.
|
|
670
|
-
*/
|
|
671
|
-
async executarUltimoEscopo(manterAmbiente = false) {
|
|
672
|
-
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
673
|
-
try {
|
|
674
|
-
let retornoExecucao;
|
|
675
|
-
for (; !(retornoExecucao instanceof quebras_1.Quebra) && ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
|
|
676
|
-
retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
|
|
677
|
-
}
|
|
678
|
-
return retornoExecucao;
|
|
679
|
-
}
|
|
680
|
-
catch (erro) {
|
|
681
|
-
const declaracaoAtual = ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual];
|
|
682
|
-
this.erros.push({
|
|
683
|
-
erroInterno: erro,
|
|
684
|
-
linha: declaracaoAtual.linha,
|
|
685
|
-
hashArquivo: declaracaoAtual.hashArquivo,
|
|
686
|
-
});
|
|
687
|
-
return Promise.reject(erro);
|
|
688
|
-
}
|
|
689
|
-
finally {
|
|
690
|
-
this.pilhaEscoposExecucao.removerUltimo();
|
|
691
|
-
if (manterAmbiente) {
|
|
692
|
-
const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
|
|
693
|
-
escopoAnterior.ambiente.valores = Object.assign(escopoAnterior.ambiente.valores, ultimoEscopo.ambiente.valores);
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
async interpretar(declaracoes, manterAmbiente) {
|
|
698
|
-
return comum.interpretar(this, declaracoes, manterAmbiente);
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
exports.InterpretadorBirl = InterpretadorBirl;
|
|
702
|
-
//# sourceMappingURL=interpretador-birl.js.map
|