@designliquido/delegua 0.33.10 → 0.33.11
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 -1
- package/avaliador-sintatico/dialetos/index.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/index.js +0 -1
- package/avaliador-sintatico/dialetos/index.js.map +1 -1
- package/bin/package.json +2 -4
- 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/interpretador/dialetos/index.d.ts +0 -1
- package/interpretador/dialetos/index.d.ts.map +1 -1
- package/interpretador/dialetos/index.js +0 -1
- package/interpretador/dialetos/index.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 +2 -4
- 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/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/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,674 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AvaliadorSintaticoBirl = void 0;
|
|
7
|
-
const construtos_1 = require("../../construtos");
|
|
8
|
-
const declaracoes_1 = require("../../declaracoes");
|
|
9
|
-
const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
|
|
10
|
-
const birl_1 = __importDefault(require("../../tipos-de-simbolos/birl"));
|
|
11
|
-
/**
|
|
12
|
-
* Avaliador Sintático de BIRL
|
|
13
|
-
*/
|
|
14
|
-
class AvaliadorSintaticoBirl extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
|
|
15
|
-
validarEscopoPrograma() {
|
|
16
|
-
let declaracoes = [];
|
|
17
|
-
this.validarSegmentoHoraDoShow();
|
|
18
|
-
while (!this.estaNoFinal()) {
|
|
19
|
-
const declaracaoVetor = this.resolverDeclaracaoForaDeBloco();
|
|
20
|
-
if (Array.isArray(declaracaoVetor)) {
|
|
21
|
-
declaracoes = declaracoes.concat(declaracaoVetor);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
declaracoes.push(declaracaoVetor);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
this.validarSegmentoBirlFinal();
|
|
28
|
-
return declaracoes;
|
|
29
|
-
}
|
|
30
|
-
tratarSimbolos(simbolos) {
|
|
31
|
-
let identificador = 0, adicao = 0, subtracao = 0;
|
|
32
|
-
for (const simbolo of simbolos) {
|
|
33
|
-
if (simbolo.tipo === birl_1.default.IDENTIFICADOR) {
|
|
34
|
-
identificador++;
|
|
35
|
-
}
|
|
36
|
-
else if (simbolo.tipo === birl_1.default.ADICAO) {
|
|
37
|
-
adicao++;
|
|
38
|
-
}
|
|
39
|
-
else if (simbolo.tipo === birl_1.default.SUBTRACAO) {
|
|
40
|
-
subtracao++;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (identificador !== 1 || (adicao > 0 && subtracao > 0)) {
|
|
44
|
-
this.erros.push({
|
|
45
|
-
message: 'Erro: Combinação desconhecida de símbolos.',
|
|
46
|
-
name: 'ErroSintatico',
|
|
47
|
-
simbolo: simbolos[0],
|
|
48
|
-
});
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
if (adicao === 2) {
|
|
52
|
-
return 'ADICAO';
|
|
53
|
-
}
|
|
54
|
-
else if (subtracao === 2) {
|
|
55
|
-
return 'SUBTRACAO';
|
|
56
|
-
}
|
|
57
|
-
this.erros.push({
|
|
58
|
-
message: 'Erro: Combinação desconhecida de símbolos.',
|
|
59
|
-
name: 'ErroSintatico',
|
|
60
|
-
simbolo: simbolos[0],
|
|
61
|
-
});
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
validarSegmentoHoraDoShow() {
|
|
65
|
-
this.consumir(birl_1.default.HORA, 'Esperado expressão `HORA DO SHOW` para iniciar o programa');
|
|
66
|
-
this.consumir(birl_1.default.DO, 'Esperado expressão `HORA DO SHOW` para iniciar o programa');
|
|
67
|
-
this.consumir(birl_1.default.SHOW, 'Esperado expressão `HORA DO SHOW` para iniciar o programa');
|
|
68
|
-
this.blocos += 1;
|
|
69
|
-
}
|
|
70
|
-
validarSegmentoBirlFinal() {
|
|
71
|
-
this.regredirEDevolverAtual();
|
|
72
|
-
while (!this.verificarTipoSimboloAtual(birl_1.default.BIRL)) {
|
|
73
|
-
this.consumir(birl_1.default.QUEBRA_LINHA, 'Esperado expressão `QUEBRA_LINHA` após a declaração de variáveis');
|
|
74
|
-
this.regredirEDevolverAtual();
|
|
75
|
-
this.regredirEDevolverAtual();
|
|
76
|
-
}
|
|
77
|
-
this.consumir(birl_1.default.BIRL, 'Esperado expressão `BIRL` para fechamento do programa');
|
|
78
|
-
this.blocos -= 1;
|
|
79
|
-
}
|
|
80
|
-
primario() {
|
|
81
|
-
const simboloAtual = this.simbolos[this.atual];
|
|
82
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.SUBTRACAO))
|
|
83
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
|
|
84
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.ADICAO))
|
|
85
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
|
|
86
|
-
// Simplesmente avança o símbolo por enquanto.
|
|
87
|
-
// O `if` de baixo irá tratar a referência.
|
|
88
|
-
this.verificarSeSimboloAtualEIgualA(birl_1.default.PONTEIRO);
|
|
89
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.IDENTIFICADOR)) {
|
|
90
|
-
return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
|
|
91
|
-
}
|
|
92
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.NUMERO, birl_1.default.FRANGAO, birl_1.default.FRANGÃO, birl_1.default.FRANGO, birl_1.default.TEXTO)) {
|
|
93
|
-
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
94
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
|
|
95
|
-
}
|
|
96
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.PARENTESE_ESQUERDO)) {
|
|
97
|
-
const expressao = this.expressao();
|
|
98
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
99
|
-
return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
|
|
100
|
-
}
|
|
101
|
-
throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
|
|
102
|
-
}
|
|
103
|
-
chamar() {
|
|
104
|
-
let expressao = this.primario();
|
|
105
|
-
while (true) {
|
|
106
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.PARENTESE_ESQUERDO)) {
|
|
107
|
-
expressao = this.finalizarChamada(expressao);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
break;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return expressao;
|
|
114
|
-
}
|
|
115
|
-
atribuir() {
|
|
116
|
-
const expressao = this.ou();
|
|
117
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.IGUAL)) {
|
|
118
|
-
const igual = this.simboloAnterior();
|
|
119
|
-
const valor = this.atribuir();
|
|
120
|
-
if (expressao instanceof construtos_1.Variavel) {
|
|
121
|
-
const simbolo = expressao.simbolo;
|
|
122
|
-
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
123
|
-
}
|
|
124
|
-
else if (expressao instanceof construtos_1.AcessoMetodoOuPropriedade) {
|
|
125
|
-
const get = expressao;
|
|
126
|
-
return new construtos_1.DefinirValor(this.hashArquivo, 0, get.objeto, get.simbolo, valor);
|
|
127
|
-
}
|
|
128
|
-
else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
|
|
129
|
-
return new construtos_1.AtribuicaoPorIndice(this.hashArquivo, 0, expressao.entidadeChamada, expressao.indice, valor);
|
|
130
|
-
}
|
|
131
|
-
this.erro(igual, 'Tarefa de atribuição inválida');
|
|
132
|
-
}
|
|
133
|
-
return expressao;
|
|
134
|
-
}
|
|
135
|
-
blocoEscopo() {
|
|
136
|
-
throw new Error('Método não implementado.');
|
|
137
|
-
}
|
|
138
|
-
declaracaoEnquanto() {
|
|
139
|
-
const simboloNegatica = this.consumir(birl_1.default.NEGATIVA, 'Esperado expressão `NEGATIVA` para iniciar o bloco `ENQUANTO`.');
|
|
140
|
-
this.consumir(birl_1.default.BAMBAM, 'Esperado expressão `BAMBAM` após `NEGATIVA` para iniciar o bloco `ENQUANTO`.');
|
|
141
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado expressão `(` após `BAMBAM` para iniciar o bloco `ENQUANTO`.');
|
|
142
|
-
const codicao = this.expressao();
|
|
143
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado expressão `)` após a condição para iniciar o bloco `ENQUANTO`.');
|
|
144
|
-
const declaracoes = [];
|
|
145
|
-
while (!this.verificarSeSimboloAtualEIgualA(birl_1.default.BIRL)) {
|
|
146
|
-
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
147
|
-
}
|
|
148
|
-
this.consumir(birl_1.default.BIRL, 'Esperado expressão `BIRL` para fechar o bloco `ENQUANTO`.');
|
|
149
|
-
return new declaracoes_1.Enquanto(codicao, new declaracoes_1.Bloco(this.hashArquivo, simboloNegatica.linha, declaracoes));
|
|
150
|
-
}
|
|
151
|
-
declaracaoExpressao() {
|
|
152
|
-
const expressao = this.expressao();
|
|
153
|
-
this.consumir(birl_1.default.PONTO_E_VIRGULA, "Esperado ';' após expressão.");
|
|
154
|
-
return new declaracoes_1.Expressao(expressao);
|
|
155
|
-
}
|
|
156
|
-
declaracaoPara() {
|
|
157
|
-
const primeiroSimbolo = this.consumir(birl_1.default.MAIS, 'Esperado expressão `MAIS` para iniciar o bloco `PARA`.');
|
|
158
|
-
this.consumir(birl_1.default.QUERO, 'Esperado expressão `QUERO` após `MAIS` para iniciar o bloco `PARA`.');
|
|
159
|
-
this.consumir(birl_1.default.MAIS, 'Esperado expressão `MAIS` após `QUERO` para iniciar o bloco `PARA`.');
|
|
160
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado expressão `(` após `MAIS` para iniciar o bloco `PARA`.');
|
|
161
|
-
let declaracaoInicial = null;
|
|
162
|
-
if (this.simbolos[this.atual].tipo === birl_1.default.IDENTIFICADOR) {
|
|
163
|
-
const variavelLoop = this.consumir(birl_1.default.IDENTIFICADOR, 'Esperado expressão `IDENTIFICADOR` após `(` para iniciar o bloco `PARA`.');
|
|
164
|
-
this.consumir(birl_1.default.IGUAL, 'Esperado expressão `=` após `IDENTIFICADOR` para iniciar o bloco `PARA`.');
|
|
165
|
-
const valor = this.consumir(birl_1.default.NUMERO, 'Esperado expressão `NUMERO` após `=` para iniciar o bloco `PARA`.');
|
|
166
|
-
declaracaoInicial = [
|
|
167
|
-
new construtos_1.Variavel(this.hashArquivo, variavelLoop),
|
|
168
|
-
new construtos_1.Literal(this.hashArquivo, Number(valor.linha), Number(valor.literal)),
|
|
169
|
-
];
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
const declaracaoVetor = this.resolverDeclaracaoForaDeBloco(); // inicialização da variável de controle
|
|
173
|
-
if (Array.isArray(declaracaoVetor)) {
|
|
174
|
-
declaracaoInicial = declaracaoVetor[0];
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
declaracaoInicial = declaracaoVetor;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
this.consumir(birl_1.default.PONTO_E_VIRGULA, 'Esperado expressão `;` após a inicialização do `PARA`.');
|
|
181
|
-
const condicao = this.resolverDeclaracaoForaDeBloco(); // condição de parada
|
|
182
|
-
this.consumir(birl_1.default.PONTO_E_VIRGULA, 'Esperado expressão `;` após a condição do `PARA`.');
|
|
183
|
-
const incremento = this.resolverDeclaracaoForaDeBloco();
|
|
184
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado expressão `)` após a condição do `PARA`.');
|
|
185
|
-
this.consumir(birl_1.default.QUEBRA_LINHA, 'Esperado expressão `QUEBRA_LINHA` após a condição do `PARA`.');
|
|
186
|
-
const declaracoes = [];
|
|
187
|
-
while (!this.verificarSeSimboloAtualEIgualA(birl_1.default.BIRL)) {
|
|
188
|
-
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
189
|
-
}
|
|
190
|
-
const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(this.simbolos[this.atual].linha) + 1, declaracoes.filter((d) => d));
|
|
191
|
-
return new declaracoes_1.Para(this.hashArquivo, Number(this.simbolos[this.atual].linha), declaracaoInicial, condicao, incremento, corpo);
|
|
192
|
-
}
|
|
193
|
-
declaracaoEscolha() {
|
|
194
|
-
throw new Error('Método não implementado.');
|
|
195
|
-
}
|
|
196
|
-
declaracaoEscreva() {
|
|
197
|
-
const primeiroSimbolo = this.consumir(birl_1.default.CE, 'Esperado expressão `CE` para escrever mensagem.');
|
|
198
|
-
this.consumir(birl_1.default.QUER, 'Esperado expressão `QUER` após `CE` para escrever mensagem.');
|
|
199
|
-
this.consumir(birl_1.default.VER, 'Esperado expressão `VER` após `QUER` para escrever mensagem.');
|
|
200
|
-
this.consumir(birl_1.default.ESSA, 'Esperado expressão `ESSA` após `VER` para escrever mensagem.');
|
|
201
|
-
this.consumir(birl_1.default.PORRA, 'Esperado expressão `PORRA` após `ESSA` para escrever mensagem.');
|
|
202
|
-
this.consumir(birl_1.default.INTERROGACAO, 'Esperado interrogação após `PORRA` para escrever mensagem.');
|
|
203
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após interrogação para escrever mensagem.');
|
|
204
|
-
const argumentos = [];
|
|
205
|
-
argumentos.push(this.resolverDeclaracaoForaDeBloco());
|
|
206
|
-
while (this.verificarTipoSimboloAtual(birl_1.default.VIRGULA)) {
|
|
207
|
-
this.avancarEDevolverAnterior(); // Vírgula
|
|
208
|
-
const variavelParaEscrita = this.resolverDeclaracaoForaDeBloco();
|
|
209
|
-
argumentos.push(variavelParaEscrita);
|
|
210
|
-
}
|
|
211
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito após argumento para escrever mensagem.');
|
|
212
|
-
return new declaracoes_1.Escreva(Number(primeiroSimbolo.linha), this.hashArquivo, argumentos);
|
|
213
|
-
}
|
|
214
|
-
declaracaoFazer() {
|
|
215
|
-
throw new Error('Método não implementado.');
|
|
216
|
-
}
|
|
217
|
-
declaracaoCaracteres() {
|
|
218
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.BICEPS)) {
|
|
219
|
-
this.consumir(birl_1.default.BICEPS, '');
|
|
220
|
-
}
|
|
221
|
-
const simboloCaractere = this.consumir(birl_1.default.FRANGO, '');
|
|
222
|
-
const inicializacoes = [];
|
|
223
|
-
let eLiteral = true;
|
|
224
|
-
do {
|
|
225
|
-
const identificador = this.consumir(birl_1.default.IDENTIFICADOR, "Esperado identificador após palavra reservada 'FRANGO'.");
|
|
226
|
-
let valorInicializacao;
|
|
227
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.IGUAL)) {
|
|
228
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.AJUDA)) {
|
|
229
|
-
eLiteral = false;
|
|
230
|
-
valorInicializacao = this.resolverDeclaracaoForaDeBloco();
|
|
231
|
-
}
|
|
232
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.IDENTIFICADOR)) {
|
|
233
|
-
eLiteral = false;
|
|
234
|
-
valorInicializacao = this.resolverDeclaracaoForaDeBloco();
|
|
235
|
-
}
|
|
236
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.TEXTO)) {
|
|
237
|
-
const literalInicializacao = this.consumir(birl_1.default.TEXTO, "Esperado ' para começar o texto.");
|
|
238
|
-
valorInicializacao = String(literalInicializacao.literal);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
throw new Error('Erro ao declarar variável do tipo texto. Verifique se esta atribuindo um valor do tipo texto.');
|
|
242
|
-
}
|
|
243
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, eLiteral
|
|
244
|
-
? new construtos_1.Literal(this.hashArquivo, Number(simboloCaractere.linha), valorInicializacao)
|
|
245
|
-
: valorInicializacao, 'texto'));
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(simboloCaractere.hashArquivo), ''), 'texto'));
|
|
249
|
-
}
|
|
250
|
-
} while (this.verificarSeSimboloAtualEIgualA(birl_1.default.VIRGULA));
|
|
251
|
-
return inicializacoes;
|
|
252
|
-
}
|
|
253
|
-
validarTipoDeclaracaoInteiro() {
|
|
254
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.MONSTRO)) {
|
|
255
|
-
return this.consumir(birl_1.default.MONSTRO, '');
|
|
256
|
-
}
|
|
257
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.MONSTRINHO)) {
|
|
258
|
-
return this.consumir(birl_1.default.MONSTRINHO, '');
|
|
259
|
-
}
|
|
260
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.MONSTRAO)) {
|
|
261
|
-
return this.consumir(birl_1.default.MONSTRAO, '');
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
264
|
-
throw new Error('Simbolo referente a inteiro não especificado.');
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
declaracaoInteiros() {
|
|
268
|
-
let simboloInteiro = this.validarTipoDeclaracaoInteiro();
|
|
269
|
-
let eLiteral = true;
|
|
270
|
-
const inicializacoes = [];
|
|
271
|
-
do {
|
|
272
|
-
const identificador = this.consumir(birl_1.default.IDENTIFICADOR, `Esperado identificador após palavra reservada '${simboloInteiro.lexema}'.`);
|
|
273
|
-
let valorInicializacao = 0x00;
|
|
274
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.IGUAL)) {
|
|
275
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.AJUDA)) {
|
|
276
|
-
eLiteral = false;
|
|
277
|
-
valorInicializacao = this.resolverDeclaracaoForaDeBloco();
|
|
278
|
-
}
|
|
279
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.IDENTIFICADOR)) {
|
|
280
|
-
eLiteral = false;
|
|
281
|
-
valorInicializacao = this.resolverDeclaracaoForaDeBloco();
|
|
282
|
-
}
|
|
283
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.NUMERO)) {
|
|
284
|
-
const literalInicializacao = this.consumir(birl_1.default.NUMERO, `Esperado literal de ${simboloInteiro.lexema} após símbolo de igual em declaração de variável.`);
|
|
285
|
-
valorInicializacao = Number(literalInicializacao.literal);
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
throw new Error(`Simbolo passado para inicialização de variável do tipo ${simboloInteiro.lexema} não é válido.`);
|
|
289
|
-
}
|
|
290
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, eLiteral
|
|
291
|
-
? new construtos_1.Literal(this.hashArquivo, Number(simboloInteiro.linha), valorInicializacao)
|
|
292
|
-
: valorInicializacao, 'numero'));
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(simboloInteiro.linha), 0), 'numero'));
|
|
296
|
-
}
|
|
297
|
-
} while (this.verificarSeSimboloAtualEIgualA(birl_1.default.VIRGULA));
|
|
298
|
-
return inicializacoes;
|
|
299
|
-
}
|
|
300
|
-
declaracaoPontoFlutuante() {
|
|
301
|
-
const simboloFloat = this.consumir(birl_1.default.TRAPEZIO, '');
|
|
302
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.DESCENDENTE)) {
|
|
303
|
-
this.consumir(birl_1.default.DESCENDENTE, '');
|
|
304
|
-
}
|
|
305
|
-
let eLiteral = true;
|
|
306
|
-
const inicializacoes = [];
|
|
307
|
-
do {
|
|
308
|
-
const identificador = this.consumir(birl_1.default.IDENTIFICADOR, "Esperado identificador após palavra reservada 'TRAPEZIO'.");
|
|
309
|
-
let valorInicializacao = 0x00;
|
|
310
|
-
if (this.verificarSeSimboloAtualEIgualA(birl_1.default.IGUAL)) {
|
|
311
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.AJUDA)) {
|
|
312
|
-
eLiteral = false;
|
|
313
|
-
valorInicializacao = this.resolverDeclaracaoForaDeBloco();
|
|
314
|
-
}
|
|
315
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.IDENTIFICADOR)) {
|
|
316
|
-
eLiteral = false;
|
|
317
|
-
valorInicializacao = this.resolverDeclaracaoForaDeBloco();
|
|
318
|
-
}
|
|
319
|
-
else if (this.verificarTipoSimboloAtual(birl_1.default.NUMERO)) {
|
|
320
|
-
const literalInicializacao = this.consumir(birl_1.default.NUMERO, "Esperado literal de 'TRAPEZIO' após símbolo de igual em declaração de variável.");
|
|
321
|
-
valorInicializacao = parseFloat(literalInicializacao.literal);
|
|
322
|
-
}
|
|
323
|
-
else {
|
|
324
|
-
throw new Error(`Simbolo passado para inicialização de variável do tipo 'TRAPEZIO' não é válido.`);
|
|
325
|
-
}
|
|
326
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, eLiteral
|
|
327
|
-
? new construtos_1.Literal(this.hashArquivo, Number(simboloFloat.linha), valorInicializacao)
|
|
328
|
-
: valorInicializacao, 'numero'));
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(simboloFloat.linha), 0), 'numero'));
|
|
332
|
-
}
|
|
333
|
-
} while (this.verificarSeSimboloAtualEIgualA(birl_1.default.VIRGULA));
|
|
334
|
-
return inicializacoes;
|
|
335
|
-
}
|
|
336
|
-
declaracaoRetorna() {
|
|
337
|
-
const primeiroSimbolo = this.consumir(birl_1.default.BORA, 'Esperado expressão `BORA` para retornar valor.');
|
|
338
|
-
this.consumir(birl_1.default.CUMPADE, 'Esperado expressão `CUMPADE` após `BORA` para retornar valor.');
|
|
339
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.INTERROGACAO)) {
|
|
340
|
-
this.consumir(birl_1.default.INTERROGACAO, 'Esperado interrogação após `CUMPADE` para retornar valor.');
|
|
341
|
-
}
|
|
342
|
-
const valor = this.resolverDeclaracaoForaDeBloco();
|
|
343
|
-
return new declaracoes_1.Retorna(primeiroSimbolo, valor);
|
|
344
|
-
}
|
|
345
|
-
validaTipoDeclaracaoLeia(caracteres) {
|
|
346
|
-
const tipoCaractere = caracteres.charAt(1);
|
|
347
|
-
const tipos = {
|
|
348
|
-
d: 'número',
|
|
349
|
-
i: 'número',
|
|
350
|
-
u: 'número',
|
|
351
|
-
f: 'número',
|
|
352
|
-
F: 'número',
|
|
353
|
-
e: 'número',
|
|
354
|
-
E: 'número',
|
|
355
|
-
g: 'número',
|
|
356
|
-
G: 'número',
|
|
357
|
-
x: 'número',
|
|
358
|
-
X: 'número',
|
|
359
|
-
o: 'número',
|
|
360
|
-
c: 'texto',
|
|
361
|
-
s: 'texto',
|
|
362
|
-
p: 'texto',
|
|
363
|
-
};
|
|
364
|
-
return tipos[tipoCaractere] || 'desconhecido';
|
|
365
|
-
}
|
|
366
|
-
declaracaoLeia() {
|
|
367
|
-
const primeiroSimbolo = this.consumir(birl_1.default.QUE, 'Esperado expressão `QUE` para ler valor.');
|
|
368
|
-
this.consumir(birl_1.default.QUE, 'Esperado expressão `QUE` após `QUE` para ler valor.');
|
|
369
|
-
this.consumir(birl_1.default.CE, 'Esperado expressão `CE` após `QUE` para ler valor.');
|
|
370
|
-
this.consumir(birl_1.default.QUER, 'Esperado expressão `QUER` após `CE` para ler valor.');
|
|
371
|
-
this.consumir(birl_1.default.MONSTRAO, 'Esperado expressão `MONSTRAO` após `QUER` para ler valor.');
|
|
372
|
-
this.consumir(birl_1.default.INTERROGACAO, 'Esperado interrogação após `MONSTRAO` para ler valor.');
|
|
373
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após interrogação para ler valor.');
|
|
374
|
-
const textoOuSimbolo = this.consumir(birl_1.default.TEXTO, 'Esperado texto após parêntese esquerdo para ler valor.');
|
|
375
|
-
this.consumir(birl_1.default.VIRGULA, 'Esperado vírgula após texto para ler valor.');
|
|
376
|
-
this.consumir(birl_1.default.PONTEIRO, 'Esperado expressão `&` após texto para ler valor.');
|
|
377
|
-
const variavel = this.consumir(birl_1.default.IDENTIFICADOR, 'Esperado identificador após `&` para ler valor.');
|
|
378
|
-
const tipo = this.validaTipoDeclaracaoLeia(textoOuSimbolo.literal);
|
|
379
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito após identificador para ler valor.');
|
|
380
|
-
return new declaracoes_1.Leia(primeiroSimbolo, [
|
|
381
|
-
new construtos_1.Variavel(this.hashArquivo, variavel),
|
|
382
|
-
new construtos_1.Literal(this.hashArquivo, Number(textoOuSimbolo.linha), tipo),
|
|
383
|
-
]);
|
|
384
|
-
}
|
|
385
|
-
consomeSeSenao() {
|
|
386
|
-
this.consumir(birl_1.default.QUE, 'Esperado expressão `QUE` após `SE`.');
|
|
387
|
-
this.consumir(birl_1.default.NAO, 'Esperado expressão `NAO` após `QUE`.');
|
|
388
|
-
this.consumir(birl_1.default.VAI, 'Esperado expressão `VAI` após `NAO`.');
|
|
389
|
-
this.consumir(birl_1.default.DAR, 'Esperado expressão `DAR` após `VAI`.');
|
|
390
|
-
this.consumir(birl_1.default.O, 'Esperado expressão `O` após `DAR`.');
|
|
391
|
-
this.consumir(birl_1.default.QUE, 'Esperado expressão `QUE` após `O`.');
|
|
392
|
-
this.consumir(birl_1.default.INTERROGACAO, 'Esperado expressão `?` após `QUE`.');
|
|
393
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após `?`.');
|
|
394
|
-
const condicaoSeSenao = this.resolverDeclaracaoForaDeBloco();
|
|
395
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito após expressão de condição.');
|
|
396
|
-
return {
|
|
397
|
-
condicaoSeSenao,
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
consomeSe() {
|
|
401
|
-
const simboloSe = this.consumir(birl_1.default.ELE, 'Esperado expressão `ELE`.');
|
|
402
|
-
this.consumir(birl_1.default.QUE, 'Esperado expressão `QUE` após `ELE`.');
|
|
403
|
-
this.consumir(birl_1.default.A, 'Esperado expressão `A` após `QUE`.');
|
|
404
|
-
this.consumir(birl_1.default.GENTE, 'Esperado expressão `GENTE` após `A`.');
|
|
405
|
-
this.consumir(birl_1.default.QUER, 'Esperado expressão `QUER` após `GENTE`.');
|
|
406
|
-
this.consumir(birl_1.default.INTERROGACAO, 'Esperado expressão `?` após `QUER`.');
|
|
407
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após `?`.');
|
|
408
|
-
const condicaoSe = this.resolverDeclaracaoForaDeBloco();
|
|
409
|
-
// @TODO: Verificar se é possível consumir os dois símbolos juntos.
|
|
410
|
-
// Consumindo n == 1 || n == 2 separado.
|
|
411
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito após expressão de condição.');
|
|
412
|
-
return {
|
|
413
|
-
simboloSe,
|
|
414
|
-
condicaoSe,
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
consumeSenao() {
|
|
418
|
-
this.consumir(birl_1.default.NAO, 'Esperado expressão `NAO` após `SE`.');
|
|
419
|
-
this.consumir(birl_1.default.VAI, 'Esperado expressão `VAI` após `NAO`.');
|
|
420
|
-
this.consumir(birl_1.default.DAR, 'Esperado expressão `DAR` após `VAI`.');
|
|
421
|
-
this.consumir(birl_1.default.NAO, 'Esperado expressão `NAO` após `DAR`.');
|
|
422
|
-
}
|
|
423
|
-
resolveCaminhoSe() {
|
|
424
|
-
let controle = true;
|
|
425
|
-
const declaracoesEntao = [];
|
|
426
|
-
while (controle) {
|
|
427
|
-
switch (this.simbolos[this.atual].tipo) {
|
|
428
|
-
case birl_1.default.BIRL:
|
|
429
|
-
case birl_1.default.NAO:
|
|
430
|
-
controle = false;
|
|
431
|
-
break;
|
|
432
|
-
case birl_1.default.QUE:
|
|
433
|
-
if (this.verificarTipoProximoSimbolo(birl_1.default.NAO)) {
|
|
434
|
-
controle = false;
|
|
435
|
-
break;
|
|
436
|
-
}
|
|
437
|
-
default:
|
|
438
|
-
declaracoesEntao.push(this.resolverDeclaracaoForaDeBloco());
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
return new declaracoes_1.Bloco(this.hashArquivo, Number(this.simbolos[this.atual].linha), declaracoesEntao.filter((d) => d));
|
|
442
|
-
}
|
|
443
|
-
declaracaoSe() {
|
|
444
|
-
const { condicaoSe, simboloSe } = this.consomeSe();
|
|
445
|
-
const caminhoEntão = this.resolveCaminhoSe();
|
|
446
|
-
const caminhoSeSenao = [];
|
|
447
|
-
while (!this.verificarTipoSimboloAtual(birl_1.default.BIRL) &&
|
|
448
|
-
!this.verificarTipoSimboloAtual(birl_1.default.NAO)) {
|
|
449
|
-
const { condicaoSeSenao } = this.consomeSeSenao();
|
|
450
|
-
const caminho = this.resolveCaminhoSe();
|
|
451
|
-
caminhoSeSenao.push({
|
|
452
|
-
condicao: condicaoSeSenao,
|
|
453
|
-
caminho: caminho,
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
let caminhoSenao = null;
|
|
457
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.NAO)) {
|
|
458
|
-
this.consumeSenao();
|
|
459
|
-
const declaraçõesSenao = [];
|
|
460
|
-
while (!this.verificarTipoSimboloAtual(birl_1.default.BIRL)) {
|
|
461
|
-
declaraçõesSenao.push(this.resolverDeclaracaoForaDeBloco());
|
|
462
|
-
}
|
|
463
|
-
caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(this.simbolos[this.atual].linha), declaraçõesSenao.filter((d) => d));
|
|
464
|
-
}
|
|
465
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.BIRL)) {
|
|
466
|
-
this.consumir(birl_1.default.BIRL, 'Esperado expressão `BIRL` após `SE`.');
|
|
467
|
-
}
|
|
468
|
-
return new declaracoes_1.Se(condicaoSe, caminhoEntão, caminhoSeSenao, caminhoSenao);
|
|
469
|
-
}
|
|
470
|
-
resolveSimboloInterfaceParaTiposDadosInterface(simbolo) {
|
|
471
|
-
switch (simbolo.tipo) {
|
|
472
|
-
case birl_1.default.TRAPEZIO:
|
|
473
|
-
this.verificarSeSimboloAtualEIgualA(birl_1.default.DESCENDENTE);
|
|
474
|
-
case birl_1.default.MONSTRO:
|
|
475
|
-
case birl_1.default.MONSTRINHO:
|
|
476
|
-
case birl_1.default.MONSTRAO:
|
|
477
|
-
return 'numero';
|
|
478
|
-
case birl_1.default.FRANGO:
|
|
479
|
-
return 'texto';
|
|
480
|
-
default:
|
|
481
|
-
throw new Error('Tipo desconhecido');
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
logicaComumParamentros() {
|
|
485
|
-
const parametros = [];
|
|
486
|
-
do {
|
|
487
|
-
if (parametros.length >= 255) {
|
|
488
|
-
this.erro(this.simbolos[this.atual], 'Não pode haver mais de 255 parâmetros');
|
|
489
|
-
}
|
|
490
|
-
const parametro = {
|
|
491
|
-
abrangencia: 'padrao',
|
|
492
|
-
};
|
|
493
|
-
const tipo = this.resolveTipo(this.simbolos[this.atual].tipo);
|
|
494
|
-
const resolucaoTipo = this.resolveSimboloInterfaceParaTiposDadosInterface(tipo);
|
|
495
|
-
parametro.tipoDado = {
|
|
496
|
-
nome: this.simbolos[this.atual].lexema,
|
|
497
|
-
tipo: resolucaoTipo,
|
|
498
|
-
};
|
|
499
|
-
this.avancarEDevolverAnterior();
|
|
500
|
-
parametro.nome = this.simbolos[this.atual];
|
|
501
|
-
parametros.push(parametro);
|
|
502
|
-
this.avancarEDevolverAnterior();
|
|
503
|
-
if (this.simbolos[this.atual].tipo === birl_1.default.VIRGULA) {
|
|
504
|
-
this.avancarEDevolverAnterior();
|
|
505
|
-
}
|
|
506
|
-
} while (![birl_1.default.PARENTESE_DIREITO].includes(this.simbolos[this.atual].tipo));
|
|
507
|
-
return parametros;
|
|
508
|
-
}
|
|
509
|
-
corpoDaFuncao(tipo) {
|
|
510
|
-
const parenteseEsquerdo = this.consumir(birl_1.default.PARENTESE_ESQUERDO, `Esperado '(' após o nome ${tipo}`);
|
|
511
|
-
let paramentros = [];
|
|
512
|
-
if (!this.verificarTipoSimboloAtual(birl_1.default.PARENTESE_DIREITO)) {
|
|
513
|
-
paramentros = this.logicaComumParamentros();
|
|
514
|
-
}
|
|
515
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
516
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
517
|
-
let corpo = [];
|
|
518
|
-
do {
|
|
519
|
-
const declaracaoVetor = this.resolverDeclaracaoForaDeBloco();
|
|
520
|
-
if (Array.isArray(declaracaoVetor)) {
|
|
521
|
-
corpo = corpo.concat(declaracaoVetor);
|
|
522
|
-
}
|
|
523
|
-
else {
|
|
524
|
-
corpo.push(declaracaoVetor);
|
|
525
|
-
}
|
|
526
|
-
} while (![birl_1.default.BIRL].includes(this.simbolos[this.atual].tipo));
|
|
527
|
-
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(parenteseEsquerdo.linha), paramentros, corpo.filter((c) => c));
|
|
528
|
-
}
|
|
529
|
-
declacacaoEnquanto() {
|
|
530
|
-
const simboloEnquanto = this.consumir(birl_1.default.NEGATIVA, 'Esperado expressão `NEGATIVA`.');
|
|
531
|
-
this.consumir(birl_1.default.BAMBAM, 'Esperado expressão `BAMBAM` após `NEGATIVA`.');
|
|
532
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após `BAMBAM`.');
|
|
533
|
-
const condicao = this.resolverDeclaracaoForaDeBloco(); // E para ser um binario.
|
|
534
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito após expressão de condição.');
|
|
535
|
-
const declaracoes = [];
|
|
536
|
-
while (!this.verificarSeSimboloAtualEIgualA(birl_1.default.BIRL)) {
|
|
537
|
-
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
538
|
-
}
|
|
539
|
-
return new declaracoes_1.Enquanto(condicao, new declaracoes_1.Bloco(simboloEnquanto.hashArquivo, Number(simboloEnquanto.linha), declaracoes.filter((d) => d)));
|
|
540
|
-
}
|
|
541
|
-
declaracaoSustar() {
|
|
542
|
-
this.consumir(birl_1.default.SAI, 'Esperado expressão `SAI`.');
|
|
543
|
-
this.consumir(birl_1.default.FILHO, 'Esperado expressão `FILHO` após `SAI`.');
|
|
544
|
-
this.consumir(birl_1.default.DA, 'Esperado expressão `DA` após `FILHO`.');
|
|
545
|
-
this.consumir(birl_1.default.PUTA, 'Esperado expressão `PUTA` após `DA`.');
|
|
546
|
-
this.consumir(birl_1.default.PONTO_E_VIRGULA, 'Esperado expressão `PONTO_E_VIRGULA` após `PUTA`.');
|
|
547
|
-
return new declaracoes_1.Sustar(this.simbolos[this.atual - 1]);
|
|
548
|
-
}
|
|
549
|
-
declaracaoContinua() {
|
|
550
|
-
this.consumir(birl_1.default.VAMO, 'Esperado expressão `VAMO`.');
|
|
551
|
-
this.consumir(birl_1.default.MONSTRO, 'Esperado expressão `MONSTRO` após `VAMO`.');
|
|
552
|
-
this.consumir(birl_1.default.PONTO_E_VIRGULA, 'Esperado expressão `PONTO_E_VIRGULA` após `MONSTRO`.');
|
|
553
|
-
return new declaracoes_1.Continua(this.simbolos[this.atual - 1]);
|
|
554
|
-
}
|
|
555
|
-
resolveTipo(tipo) {
|
|
556
|
-
switch (tipo) {
|
|
557
|
-
case birl_1.default.TRAPEZIO:
|
|
558
|
-
this.verificarSeSimboloAtualEIgualA(birl_1.default.DESCENDENTE);
|
|
559
|
-
case birl_1.default.MONSTRAO:
|
|
560
|
-
case birl_1.default.MONSTRINHO:
|
|
561
|
-
case birl_1.default.MONSTRO:
|
|
562
|
-
case birl_1.default.FRANGO:
|
|
563
|
-
case birl_1.default.BICEPS:
|
|
564
|
-
return this.simbolos[this.atual];
|
|
565
|
-
default:
|
|
566
|
-
throw new Error('Esperado tipo da função');
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
funcao(tipo) {
|
|
570
|
-
this.consumir(birl_1.default.OH, 'Esperado expressão `OH`.');
|
|
571
|
-
this.consumir(birl_1.default.O, 'Esperado expressão `O` após `OH`.');
|
|
572
|
-
this.consumir(birl_1.default.HOME, 'Esperado expressão `HOME` após `O`.');
|
|
573
|
-
this.consumir(birl_1.default.AI, 'Esperado expressão `AI` após `HOME`.');
|
|
574
|
-
this.consumir(birl_1.default.PO, 'Esperado expressão `PO` após `AI`.');
|
|
575
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após `PO`.');
|
|
576
|
-
let tipoRetorno = this.resolveTipo(this.simbolos[this.atual].tipo);
|
|
577
|
-
this.avancarEDevolverAnterior();
|
|
578
|
-
const nomeFuncao = this.consumir(birl_1.default.IDENTIFICADOR, 'Esperado nome da função apos a declaração do tipo.');
|
|
579
|
-
return new declaracoes_1.FuncaoDeclaracao(nomeFuncao, this.corpoDaFuncao(tipo), tipoRetorno);
|
|
580
|
-
}
|
|
581
|
-
declaracaoChamaFuncao() {
|
|
582
|
-
const declaracaoInicio = this.consumir(birl_1.default.AJUDA, 'Esperado expressão `AJUDA`.');
|
|
583
|
-
this.consumir(birl_1.default.O, 'Esperado expressão `O` após `AJUDA`.');
|
|
584
|
-
this.consumir(birl_1.default.MALUCO, 'Esperado expressão `MALUCO` após `O`.');
|
|
585
|
-
this.consumir(birl_1.default.TA, 'Esperado expressão `TA` após `MALUCO`.');
|
|
586
|
-
this.consumir(birl_1.default.DOENTE, 'Esperado expressão `DOENTE` após `TA`.');
|
|
587
|
-
let expressao = this.primario();
|
|
588
|
-
this.consumir(birl_1.default.PARENTESE_ESQUERDO, 'Esperado parêntese esquerdo após `DOENTE`.');
|
|
589
|
-
const paramentros = [];
|
|
590
|
-
while (!this.verificarTipoSimboloAtual(birl_1.default.PARENTESE_DIREITO)) {
|
|
591
|
-
paramentros.push(this.resolverDeclaracaoForaDeBloco());
|
|
592
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.VIRGULA)) {
|
|
593
|
-
this.avancarEDevolverAnterior();
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
this.consumir(birl_1.default.PARENTESE_DIREITO, 'Esperado parêntese direito após lista de parâmetros.');
|
|
597
|
-
this.consumir(birl_1.default.PONTO_E_VIRGULA, 'Esperado ponto e vírgula após a chamada de função.');
|
|
598
|
-
return new construtos_1.Chamada(declaracaoInicio.hashArquivo, expressao, null, paramentros);
|
|
599
|
-
}
|
|
600
|
-
resolverDeclaracaoForaDeBloco() {
|
|
601
|
-
const simboloAtual = this.simbolos[this.atual];
|
|
602
|
-
switch (simboloAtual.tipo) {
|
|
603
|
-
case birl_1.default.INCREMENTAR:
|
|
604
|
-
case birl_1.default.DECREMENTAR:
|
|
605
|
-
let adicionaOuSubtrai;
|
|
606
|
-
if ([birl_1.default.INCREMENTAR, birl_1.default.DECREMENTAR].includes(simboloAtual.tipo)) {
|
|
607
|
-
adicionaOuSubtrai = this.consumir(birl_1.default[simboloAtual.tipo], 'Esperado expressão `INCREMENTAR` ou `DECREMENTAR`.');
|
|
608
|
-
}
|
|
609
|
-
if (this.verificarTipoSimboloAtual(birl_1.default.IDENTIFICADOR)) {
|
|
610
|
-
const identificador = this.consumir(birl_1.default.IDENTIFICADOR, 'Esperado expressão `IDENTIFICADOR`.');
|
|
611
|
-
return new construtos_1.Unario(this.hashArquivo, adicionaOuSubtrai, new construtos_1.Variavel(this.hashArquivo, identificador), 'ANTES');
|
|
612
|
-
}
|
|
613
|
-
return;
|
|
614
|
-
case birl_1.default.BORA:
|
|
615
|
-
return this.declaracaoRetorna();
|
|
616
|
-
case birl_1.default.SAI:
|
|
617
|
-
return this.declaracaoSustar();
|
|
618
|
-
case birl_1.default.VAMO:
|
|
619
|
-
return this.declaracaoContinua();
|
|
620
|
-
case birl_1.default.QUE:
|
|
621
|
-
return this.declaracaoLeia();
|
|
622
|
-
case birl_1.default.ELE:
|
|
623
|
-
return this.declaracaoSe();
|
|
624
|
-
case birl_1.default.NEGATIVA:
|
|
625
|
-
return this.declacacaoEnquanto();
|
|
626
|
-
case birl_1.default.MAIS:
|
|
627
|
-
return this.declaracaoPara();
|
|
628
|
-
case birl_1.default.MONSTRO:
|
|
629
|
-
case birl_1.default.MONSTRINHO:
|
|
630
|
-
case birl_1.default.MONSTRAO:
|
|
631
|
-
return this.declaracaoInteiros();
|
|
632
|
-
case birl_1.default.BICEPS:
|
|
633
|
-
case birl_1.default.FRANGO:
|
|
634
|
-
return this.declaracaoCaracteres();
|
|
635
|
-
case birl_1.default.TRAPEZIO:
|
|
636
|
-
return this.declaracaoPontoFlutuante();
|
|
637
|
-
case birl_1.default.OH:
|
|
638
|
-
return this.funcao('funcao');
|
|
639
|
-
case birl_1.default.AJUDA:
|
|
640
|
-
return this.declaracaoChamaFuncao();
|
|
641
|
-
case birl_1.default.CE:
|
|
642
|
-
return this.declaracaoEscreva();
|
|
643
|
-
case birl_1.default.PONTO_E_VIRGULA:
|
|
644
|
-
case birl_1.default.QUEBRA_LINHA:
|
|
645
|
-
case birl_1.default.BIRL:
|
|
646
|
-
this.avancarEDevolverAnterior();
|
|
647
|
-
return null;
|
|
648
|
-
case birl_1.default.IDENTIFICADOR:
|
|
649
|
-
const simboloIdentificador = this.simbolos[this.atual];
|
|
650
|
-
if (this.simbolos[this.atual + 1] &&
|
|
651
|
-
[birl_1.default.DECREMENTAR, birl_1.default.INCREMENTAR].includes(this.simbolos[this.atual + 1].tipo)) {
|
|
652
|
-
this.avancarEDevolverAnterior();
|
|
653
|
-
const simboloIncrementoDecremento = this.avancarEDevolverAnterior();
|
|
654
|
-
return new construtos_1.Unario(this.hashArquivo, simboloIncrementoDecremento, new construtos_1.Variavel(this.hashArquivo, simboloIdentificador), 'DEPOIS');
|
|
655
|
-
}
|
|
656
|
-
return this.expressao();
|
|
657
|
-
default:
|
|
658
|
-
return this.expressao();
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
analisar(retornoLexador, hashArquivo) {
|
|
662
|
-
this.erros = [];
|
|
663
|
-
this.blocos = 0;
|
|
664
|
-
this.atual = 0;
|
|
665
|
-
this.simbolos = retornoLexador.simbolos;
|
|
666
|
-
const declaracoes = this.validarEscopoPrograma();
|
|
667
|
-
return {
|
|
668
|
-
declaracoes: declaracoes.filter((d) => d),
|
|
669
|
-
erros: this.erros,
|
|
670
|
-
};
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
exports.AvaliadorSintaticoBirl = AvaliadorSintaticoBirl;
|
|
674
|
-
//# sourceMappingURL=avaliador-sintatico-birl.js.map
|