@designliquido/potigol 0.0.0 → 0.0.1
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/avaliador-sintatico/avaliador-sintatico-potigol.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico-potigol.js +115 -114
- package/avaliador-sintatico/avaliador-sintatico-potigol.js.map +1 -1
- package/formatador/formatador-potigol.d.ts +82 -0
- package/formatador/formatador-potigol.d.ts.map +1 -0
- package/formatador/formatador-potigol.js +662 -0
- package/formatador/formatador-potigol.js.map +1 -0
- package/formatador/index.d.ts +2 -0
- package/formatador/index.d.ts.map +1 -0
- package/formatador/index.js +18 -0
- package/formatador/index.js.map +1 -0
- package/interpretador/comum.d.ts +5 -1
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js +62 -1
- package/interpretador/comum.js.map +1 -1
- package/interpretador/interpretador-potigol-com-depuracao.d.ts +5 -1
- package/interpretador/interpretador-potigol-com-depuracao.d.ts.map +1 -1
- package/interpretador/interpretador-potigol-com-depuracao.js +9 -0
- package/interpretador/interpretador-potigol-com-depuracao.js.map +1 -1
- package/interpretador/interpretador-potigol.d.ts +2 -0
- package/interpretador/interpretador-potigol.d.ts.map +1 -1
- package/interpretador/interpretador-potigol.js +5 -27
- package/interpretador/interpretador-potigol.js.map +1 -1
- package/lexador/palavras-reservadas.js +1 -1
- package/package.json +3 -2
- package/tipos-de-simbolos/lexico-regular.d.ts +1 -0
- package/tipos-de-simbolos/lexico-regular.d.ts.map +1 -1
- package/tipos-de-simbolos/lexico-regular.js +1 -0
- package/tipos-de-simbolos/lexico-regular.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avaliador-sintatico-potigol.d.ts","sourceRoot":"","sources":["../../fontes/avaliador-sintatico/avaliador-sintatico-potigol.ts"],"names":[],"mappings":"AAAA,OAAO,EAOH,SAAS,EACT,mBAAmB,EACnB,SAAS,EAGT,eAAe,EAOlB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACH,OAAO,EACP,UAAU,EACV,EAAE,EACF,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,KAAK,EACL,iBAAiB,EACjB,KAAK,EACL,GAAG,EAGH,gBAAgB,EAChB,MAAM,EAIN,aAAa,EAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvG,OAAO,EAAE,sBAAsB,EAAE,MAAM,qEAAqE,CAAC;AAE7G,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAIzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AAIxF,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAErF;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,sBAAsB;IACjE,uBAAuB,EAAE,8BAA8B,CAAC;IAExD,uBAAuB;;;;;;;;MAQrB;IAEF,qBAAqB,EAAE;QAAE,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,EAAE,CAAA;KAAE,CAAC;IAE1D;;;;;;OAMG;IACH,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE;IAuB7D;;;;;;;;OAQG;IACH,SAAS,CAAC,uCAAuC,CAC7C,eAAe,EAAE,gBAAgB,EACjC,iBAAiB,EAAE,gBAAgB,EACnC,UAAU,EAAE,kBAAkB,EAAE,EAChC,WAAW,CAAC,EAAE,gBAAgB,GAC/B,gBAAgB;IAOnB;;;;;;;;OAQG;IACH,SAAS,CAAC,sCAAsC,CAC5C,eAAe,EAAE,gBAAgB,EACjC,iBAAiB,EAAE,gBAAgB,EACnC,UAAU,EAAE,kBAAkB,EAAE,EAChC,WAAW,CAAC,EAAE,gBAAgB,GAC/B,gBAAgB;IAKnB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,eAAe;IAQxG,SAAS,CAAC,0BAA0B,CAAC,iBAAiB,EAAE,mBAAmB,GAAG,gBAAgB;IA8C9F,gBAAgB,CAAC,eAAe,EAAE,SAAS,GAAG,SAAS;IAwBvD;;;;;OAKG;IACH,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM;IAUzE,SAAS,CAAC,4BAA4B,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG;QAClE,UAAU,EAAE,kBAAkB,EAAE,CAAC;QACjC,eAAe,EAAE,OAAO,CAAC;KAC5B;IAoED,QAAQ,IAAI,SAAS;IAoFrB;;;;;;;OAOG;IACH,MAAM,IAAI,SAAS;IAyCnB,mBAAmB,IAAI,SAAS;IAYhC,iBAAiB,IAAI,OAAO;IAgB5B,iBAAiB,IAAI,iBAAiB;IAYtC;;;;;;;;;OASG;IACH,WAAW,IAAI,KAAK,CAAC,iBAAiB,CAAC;IAevC,YAAY,IAAI,EAAE;IA0ClB,kBAAkB,IAAI,QAAQ;IA2B9B,cAAc,IAAI,IAAI;IA+ItB,iBAAiB,IAAI,OAAO;IAwD5B,SAAS,CAAC,sBAAsB,IAAI,aAAa,GAAG,KAAK,EAAE;IA6E3D,SAAS,CAAC,qBAAqB,IAAI,GAAG,EAAE;IA6BxC,SAAS,CAAC,6BAA6B,CAAC,SAAS,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"avaliador-sintatico-potigol.d.ts","sourceRoot":"","sources":["../../fontes/avaliador-sintatico/avaliador-sintatico-potigol.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ const declaracoes_1 = require("@designliquido/delegua/declaracoes");
|
|
|
9
9
|
const avaliador_sintatico_base_1 = require("@designliquido/delegua/avaliador-sintatico/avaliador-sintatico-base");
|
|
10
10
|
const lexador_1 = require("@designliquido/delegua/lexador");
|
|
11
11
|
const erro_avaliador_sintatico_1 = require("@designliquido/delegua/avaliador-sintatico/erro-avaliador-sintatico");
|
|
12
|
-
const
|
|
12
|
+
const lexico_regular_1 = __importDefault(require("../tipos-de-simbolos/lexico-regular"));
|
|
13
13
|
const tuplas_1 = require("@designliquido/delegua/construtos/tuplas");
|
|
14
14
|
const micro_avaliador_sintatico_potigol_1 = require("./micro-avaliador-sintatico-potigol");
|
|
15
15
|
/**
|
|
@@ -39,13 +39,13 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
39
39
|
testePrimeiroParametro(simbolos) {
|
|
40
40
|
let atual = 0;
|
|
41
41
|
// Primeiro teste: literal ou identificador
|
|
42
|
-
if ([
|
|
42
|
+
if ([lexico_regular_1.default.INTEIRO, lexico_regular_1.default.LOGICO, lexico_regular_1.default.REAL, lexico_regular_1.default.TEXTO].includes(simbolos[atual].tipo)) {
|
|
43
43
|
return false;
|
|
44
44
|
}
|
|
45
45
|
// Segundo teste: vírgula imediatamente após identificador,
|
|
46
46
|
// ou simplesmente fim da lista de símbolos.
|
|
47
47
|
atual++;
|
|
48
|
-
if (atual === simbolos.length || simbolos[atual].tipo ===
|
|
48
|
+
if (atual === simbolos.length || simbolos[atual].tipo === lexico_regular_1.default.VIRGULA) {
|
|
49
49
|
return false;
|
|
50
50
|
}
|
|
51
51
|
// Outros casos: dois-pontos após identificador, etc.
|
|
@@ -89,21 +89,21 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
89
89
|
// fins de pragma.
|
|
90
90
|
const parenteseEsquerdo = this.avancarEDevolverAnterior();
|
|
91
91
|
const simbolosEntreParenteses = [];
|
|
92
|
-
while (!this.verificarTipoSimboloAtual(
|
|
92
|
+
while (!this.verificarTipoSimboloAtual(lexico_regular_1.default.PARENTESE_DIREITO)) {
|
|
93
93
|
simbolosEntreParenteses.push(this.avancarEDevolverAnterior());
|
|
94
94
|
}
|
|
95
95
|
const resolucaoParametros = this.logicaComumParametrosPotigol(simbolosEntreParenteses);
|
|
96
|
-
const parenteseDireito = this.consumir(
|
|
96
|
+
const parenteseDireito = this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
97
97
|
// Pode haver uma dica do tipo de retorno ou não.
|
|
98
98
|
// Se houver, é uma declaração de função (verificado mais abaixo).
|
|
99
99
|
let tipoRetorno = undefined;
|
|
100
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
100
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.DOIS_PONTOS)) {
|
|
101
101
|
this.verificacaoTipo(this.simbolos[this.atual], 'Esperado tipo válido após dois-pontos como retorno de função.');
|
|
102
102
|
tipoRetorno = this.simbolos[this.atual - 1];
|
|
103
103
|
}
|
|
104
104
|
// Se houver símbolo de igual, seja após fechamento de parênteses,
|
|
105
105
|
// seja após a dica de retorno, é uma declaração de função.
|
|
106
|
-
if (this.simbolos[this.atual].tipo ===
|
|
106
|
+
if (this.simbolos[this.atual].tipo === lexico_regular_1.default.IGUAL) {
|
|
107
107
|
this.avancarEDevolverAnterior();
|
|
108
108
|
this.declaracoesAnteriores[construtoPrimario.simbolo.lexema] = [];
|
|
109
109
|
return this.declaracaoFuncaoPotigolIniciadaPorIgual(construtoPrimario.simbolo, parenteseEsquerdo, resolucaoParametros.parametros, tipoRetorno);
|
|
@@ -114,10 +114,10 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
114
114
|
// Parêntese esquerdo
|
|
115
115
|
// this.avancarEDevolverAnterior();
|
|
116
116
|
const simbolosEntreParenteses = [];
|
|
117
|
-
while (!this.verificarTipoSimboloAtual(
|
|
117
|
+
while (!this.verificarTipoSimboloAtual(lexico_regular_1.default.PARENTESE_DIREITO)) {
|
|
118
118
|
simbolosEntreParenteses.push(this.avancarEDevolverAnterior());
|
|
119
119
|
}
|
|
120
|
-
const parenteseDireito = this.consumir(
|
|
120
|
+
const parenteseDireito = this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
121
121
|
const argumentos = this.microAvaliadorSintatico.analisar({ simbolos: simbolosEntreParenteses }, entidadeChamada.linha);
|
|
122
122
|
return new construtos_1.Chamada(this.hashArquivo, entidadeChamada, parenteseDireito, argumentos.declaracoes.filter((d) => d));
|
|
123
123
|
}
|
|
@@ -128,7 +128,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
128
128
|
* @param mensagemErro A mensagem de erro caso o símbolo atual não seja de tipo.
|
|
129
129
|
*/
|
|
130
130
|
verificacaoTipo(simbolo, mensagemErro) {
|
|
131
|
-
if (![
|
|
131
|
+
if (![lexico_regular_1.default.INTEIRO, lexico_regular_1.default.LOGICO, lexico_regular_1.default.REAL, lexico_regular_1.default.TEXTO].includes(simbolo.tipo)) {
|
|
132
132
|
throw this.erro(simbolo, mensagemErro);
|
|
133
133
|
}
|
|
134
134
|
}
|
|
@@ -149,12 +149,12 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
149
149
|
parametro.abrangencia = 'padrao';
|
|
150
150
|
} */
|
|
151
151
|
parametro.abrangencia = 'padrao';
|
|
152
|
-
if (simbolos[indice].tipo !==
|
|
152
|
+
if (simbolos[indice].tipo !== lexico_regular_1.default.IDENTIFICADOR) {
|
|
153
153
|
throw this.erro(simbolos[indice], 'Esperado nome do parâmetro.');
|
|
154
154
|
}
|
|
155
155
|
parametro.nome = simbolos[indice];
|
|
156
156
|
indice++;
|
|
157
|
-
if (simbolos[indice].tipo ===
|
|
157
|
+
if (simbolos[indice].tipo === lexico_regular_1.default.DOIS_PONTOS) {
|
|
158
158
|
// throw this.erro(simbolos[indice], 'Esperado dois-pontos após nome de argumento para função.');
|
|
159
159
|
indice++;
|
|
160
160
|
this.verificacaoTipo(simbolos[indice], 'Esperado tipo do argumento após dois-pontos, em definição de função.');
|
|
@@ -173,7 +173,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
173
173
|
parametros.push(parametro);
|
|
174
174
|
// if (parametro.abrangencia === 'multiplo') break;
|
|
175
175
|
indice++;
|
|
176
|
-
if (indice < simbolos.length && simbolos[indice].tipo !==
|
|
176
|
+
if (indice < simbolos.length && simbolos[indice].tipo !== lexico_regular_1.default.VIRGULA) {
|
|
177
177
|
throw this.erro(simbolos[indice], 'Esperado vírgula entre parâmetros de função.');
|
|
178
178
|
}
|
|
179
179
|
indice++;
|
|
@@ -186,60 +186,60 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
186
186
|
primario() {
|
|
187
187
|
const simboloAtual = this.simbolos[this.atual];
|
|
188
188
|
switch (simboloAtual.tipo) {
|
|
189
|
-
case
|
|
189
|
+
case lexico_regular_1.default.PARENTESE_ESQUERDO:
|
|
190
190
|
this.avancarEDevolverAnterior();
|
|
191
191
|
const expressao = this.expressao();
|
|
192
192
|
switch (this.simbolos[this.atual].tipo) {
|
|
193
|
-
case
|
|
193
|
+
case lexico_regular_1.default.VIRGULA:
|
|
194
194
|
// Tupla
|
|
195
195
|
const argumentos = [expressao];
|
|
196
|
-
while (this.simbolos[this.atual].tipo ===
|
|
196
|
+
while (this.simbolos[this.atual].tipo === lexico_regular_1.default.VIRGULA) {
|
|
197
197
|
this.avancarEDevolverAnterior();
|
|
198
198
|
argumentos.push(this.expressao());
|
|
199
199
|
}
|
|
200
|
-
this.consumir(
|
|
200
|
+
this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
201
201
|
return new tuplas_1.SeletorTuplas(...argumentos);
|
|
202
202
|
default:
|
|
203
|
-
this.consumir(
|
|
203
|
+
this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
204
204
|
return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
|
|
205
205
|
}
|
|
206
|
-
case
|
|
206
|
+
case lexico_regular_1.default.COLCHETE_ESQUERDO:
|
|
207
207
|
this.avancarEDevolverAnterior();
|
|
208
208
|
let valores = [];
|
|
209
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
209
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.COLCHETE_DIREITO)) {
|
|
210
210
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), []);
|
|
211
211
|
}
|
|
212
|
-
while (!this.verificarSeSimboloAtualEIgualA(
|
|
212
|
+
while (!this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.COLCHETE_DIREITO)) {
|
|
213
213
|
const valor = this.atribuir();
|
|
214
214
|
valores.push(valor);
|
|
215
|
-
if (this.simbolos[this.atual].tipo !==
|
|
216
|
-
this.consumir(
|
|
215
|
+
if (this.simbolos[this.atual].tipo !== lexico_regular_1.default.COLCHETE_DIREITO) {
|
|
216
|
+
this.consumir(lexico_regular_1.default.VIRGULA, 'Esperado vírgula antes da próxima expressão.');
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
return new construtos_1.Vetor(this.hashArquivo, Number(simboloAtual.linha), valores);
|
|
220
|
-
case
|
|
221
|
-
case
|
|
222
|
-
case
|
|
223
|
-
case
|
|
224
|
-
case
|
|
220
|
+
case lexico_regular_1.default.CARACTERE:
|
|
221
|
+
case lexico_regular_1.default.INTEIRO:
|
|
222
|
+
case lexico_regular_1.default.LOGICO:
|
|
223
|
+
case lexico_regular_1.default.REAL:
|
|
224
|
+
case lexico_regular_1.default.TEXTO:
|
|
225
225
|
const simboloLiteral = this.avancarEDevolverAnterior();
|
|
226
226
|
return new construtos_1.Literal(this.hashArquivo, Number(simboloLiteral.linha), simboloLiteral.literal);
|
|
227
|
-
case
|
|
228
|
-
case
|
|
227
|
+
case lexico_regular_1.default.FALSO:
|
|
228
|
+
case lexico_regular_1.default.VERDADEIRO:
|
|
229
229
|
const simboloVerdadeiroFalso = this.avancarEDevolverAnterior();
|
|
230
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloVerdadeiroFalso.linha), simboloVerdadeiroFalso.tipo ===
|
|
231
|
-
case
|
|
232
|
-
case
|
|
233
|
-
case
|
|
230
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloVerdadeiroFalso.linha), simboloVerdadeiroFalso.tipo === lexico_regular_1.default.VERDADEIRO);
|
|
231
|
+
case lexico_regular_1.default.LEIA_INTEIRO:
|
|
232
|
+
case lexico_regular_1.default.LEIA_REAL:
|
|
233
|
+
case lexico_regular_1.default.LEIA_TEXTO:
|
|
234
234
|
const simboloLeia = this.avancarEDevolverAnterior();
|
|
235
235
|
return new declaracoes_1.Leia(simboloLeia, []);
|
|
236
|
-
case
|
|
237
|
-
case
|
|
238
|
-
case
|
|
236
|
+
case lexico_regular_1.default.LEIA_INTEIROS:
|
|
237
|
+
case lexico_regular_1.default.LEIA_REAIS:
|
|
238
|
+
case lexico_regular_1.default.LEIA_TEXTOS:
|
|
239
239
|
const simboloLeiaDefinido = this.avancarEDevolverAnterior();
|
|
240
|
-
this.consumir(
|
|
240
|
+
this.consumir(lexico_regular_1.default.PARENTESE_ESQUERDO, `Esperado parêntese esquerdo após ${simboloLeiaDefinido.lexema}.`);
|
|
241
241
|
const argumento = this.expressao();
|
|
242
|
-
this.consumir(
|
|
242
|
+
this.consumir(lexico_regular_1.default.PARENTESE_DIREITO, `Esperado parêntese direito após número de parâmetros em chamada de ${simboloLeiaDefinido.lexema}.`);
|
|
243
243
|
const leiaDefinido = new declaracoes_1.LeiaMultiplo(simboloLeiaDefinido, argumento);
|
|
244
244
|
return leiaDefinido;
|
|
245
245
|
default:
|
|
@@ -258,14 +258,14 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
258
258
|
chamar() {
|
|
259
259
|
let expressao = this.primario();
|
|
260
260
|
while (true) {
|
|
261
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
261
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_ESQUERDO)) {
|
|
262
262
|
if (expressao instanceof construtos_1.ConstanteOuVariavel) {
|
|
263
263
|
expressao = new construtos_1.Constante(expressao.hashArquivo, expressao.simbolo);
|
|
264
264
|
}
|
|
265
265
|
expressao = this.finalizarChamada(expressao);
|
|
266
266
|
}
|
|
267
|
-
else if (this.verificarSeSimboloAtualEIgualA(
|
|
268
|
-
if (this.verificarTipoSimboloAtual(
|
|
267
|
+
else if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PONTO)) {
|
|
268
|
+
if (this.verificarTipoSimboloAtual(lexico_regular_1.default.QUAL_TIPO)) {
|
|
269
269
|
const identificador = this.simbolos[this.atual - 2];
|
|
270
270
|
const simbolo = this.simbolos[this.atual];
|
|
271
271
|
const valor = expressao ? expressao : identificador.lexema;
|
|
@@ -273,14 +273,14 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
273
273
|
return new construtos_1.QualTipo(this.hashArquivo, simbolo, valor);
|
|
274
274
|
}
|
|
275
275
|
else {
|
|
276
|
-
const nome = this.consumir(
|
|
276
|
+
const nome = this.consumir(lexico_regular_1.default.IDENTIFICADOR, "Esperado nome do método após '.'.");
|
|
277
277
|
const variavelMetodo = new construtos_1.Variavel(expressao.hashArquivo, expressao.simbolo);
|
|
278
278
|
expressao = new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, variavelMetodo, nome);
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
|
-
else if (this.verificarSeSimboloAtualEIgualA(
|
|
281
|
+
else if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.COLCHETE_ESQUERDO)) {
|
|
282
282
|
const indice = this.expressao();
|
|
283
|
-
const simboloFechamento = this.consumir(
|
|
283
|
+
const simboloFechamento = this.consumir(lexico_regular_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
284
284
|
const variavelVetor = new construtos_1.Variavel(expressao.hashArquivo, expressao.simbolo);
|
|
285
285
|
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, variavelVetor, indice, simboloFechamento);
|
|
286
286
|
}
|
|
@@ -295,7 +295,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
295
295
|
}
|
|
296
296
|
comparacaoIgualdade() {
|
|
297
297
|
let expressao = this.comparar();
|
|
298
|
-
while (this.verificarSeSimboloAtualEIgualA(
|
|
298
|
+
while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.DIFERENTE, lexico_regular_1.default.IGUAL_IGUAL)) {
|
|
299
299
|
const operador = this.simbolos[this.atual - 1];
|
|
300
300
|
const direito = this.comparar();
|
|
301
301
|
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
@@ -305,11 +305,11 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
305
305
|
declaracaoEscreva() {
|
|
306
306
|
const simboloAtual = this.avancarEDevolverAnterior();
|
|
307
307
|
const argumentos = [];
|
|
308
|
-
this.verificarSeSimboloAtualEIgualA(
|
|
308
|
+
this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_ESQUERDO);
|
|
309
309
|
do {
|
|
310
310
|
argumentos.push(this.ou());
|
|
311
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
312
|
-
this.verificarSeSimboloAtualEIgualA(
|
|
311
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
312
|
+
this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PARENTESE_DIREITO);
|
|
313
313
|
return new declaracoes_1.Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
|
|
314
314
|
}
|
|
315
315
|
declaracaoImprima() {
|
|
@@ -317,7 +317,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
317
317
|
const argumentos = [];
|
|
318
318
|
do {
|
|
319
319
|
argumentos.push(this.expressao());
|
|
320
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
320
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
321
321
|
return new declaracoes_1.EscrevaMesmaLinha(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
|
|
322
322
|
}
|
|
323
323
|
/**
|
|
@@ -332,7 +332,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
332
332
|
*/
|
|
333
333
|
blocoEscopo() {
|
|
334
334
|
let declaracoes = [];
|
|
335
|
-
while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(
|
|
335
|
+
while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(lexico_regular_1.default.FIM)) {
|
|
336
336
|
const retornoDeclaracao = this.resolverDeclaracaoForaDeBloco();
|
|
337
337
|
if (Array.isArray(retornoDeclaracao)) {
|
|
338
338
|
declaracoes = declaracoes.concat(retornoDeclaracao);
|
|
@@ -346,43 +346,43 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
346
346
|
declaracaoSe() {
|
|
347
347
|
const simboloSe = this.avancarEDevolverAnterior();
|
|
348
348
|
const condicao = this.expressao();
|
|
349
|
-
this.consumir(
|
|
349
|
+
this.consumir(lexico_regular_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
|
|
350
350
|
const declaracoes = [];
|
|
351
351
|
do {
|
|
352
352
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
353
|
-
} while (![
|
|
353
|
+
} while (![lexico_regular_1.default.SENAO, lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo));
|
|
354
354
|
let caminhoSenao = null;
|
|
355
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
355
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.SENAO)) {
|
|
356
356
|
const simboloSenao = this.simbolos[this.atual - 1];
|
|
357
357
|
const declaracoesSenao = [];
|
|
358
358
|
do {
|
|
359
359
|
declaracoesSenao.push(this.resolverDeclaracaoForaDeBloco());
|
|
360
|
-
} while (![
|
|
360
|
+
} while (![lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo));
|
|
361
361
|
caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
|
|
362
362
|
}
|
|
363
|
-
this.consumir(
|
|
363
|
+
this.consumir(lexico_regular_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'se'.");
|
|
364
364
|
return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
|
|
365
365
|
}
|
|
366
366
|
declaracaoEnquanto() {
|
|
367
367
|
const simboloAtual = this.avancarEDevolverAnterior();
|
|
368
368
|
const condicao = this.expressao();
|
|
369
|
-
this.consumir(
|
|
369
|
+
this.consumir(lexico_regular_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
|
|
370
370
|
const declaracoes = [];
|
|
371
371
|
do {
|
|
372
372
|
declaracoes.push(this.resolverDeclaracaoForaDeBloco());
|
|
373
|
-
} while (![
|
|
374
|
-
this.consumir(
|
|
373
|
+
} while (![lexico_regular_1.default.FIM].includes(this.simbolos[this.atual].tipo));
|
|
374
|
+
this.consumir(lexico_regular_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'enquanto'.");
|
|
375
375
|
return new declaracoes_1.Enquanto(condicao, new declaracoes_1.Bloco(simboloAtual.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)));
|
|
376
376
|
}
|
|
377
377
|
declaracaoPara() {
|
|
378
378
|
const simboloPara = this.avancarEDevolverAnterior();
|
|
379
|
-
const variavelIteracao = this.consumir(
|
|
380
|
-
this.consumir(
|
|
379
|
+
const variavelIteracao = this.consumir(lexico_regular_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
|
|
380
|
+
this.consumir(lexico_regular_1.default.DE, "Esperado palavra reservada 'de' após variável de controle de 'para'.");
|
|
381
381
|
const literalOuVariavelInicio = this.adicaoOuSubtracao();
|
|
382
|
-
this.consumir(
|
|
382
|
+
this.consumir(lexico_regular_1.default.ATE, "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'.");
|
|
383
383
|
const literalOuVariavelFim = this.adicaoOuSubtracao();
|
|
384
|
-
let operadorCondicao = new lexador_1.Simbolo(
|
|
385
|
-
let operadorCondicaoIncremento = new lexador_1.Simbolo(
|
|
384
|
+
let operadorCondicao = new lexador_1.Simbolo(lexico_regular_1.default.MENOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
385
|
+
let operadorCondicaoIncremento = new lexador_1.Simbolo(lexico_regular_1.default.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
386
386
|
// Isso existe porque o laço `para` do Potigol pode ter o passo positivo ou negativo
|
|
387
387
|
// dependendo dos operandos de início e fim, que só são possíveis de determinar
|
|
388
388
|
// em tempo de execução.
|
|
@@ -390,15 +390,15 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
390
390
|
// passo são considerados indefinidos aqui.
|
|
391
391
|
let passo;
|
|
392
392
|
let resolverIncrementoEmExecucao = false;
|
|
393
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
393
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.PASSO)) {
|
|
394
394
|
passo = this.unario();
|
|
395
395
|
}
|
|
396
396
|
else {
|
|
397
397
|
if (literalOuVariavelInicio instanceof construtos_1.Literal && literalOuVariavelFim instanceof construtos_1.Literal) {
|
|
398
398
|
if (literalOuVariavelInicio.valor > literalOuVariavelFim.valor) {
|
|
399
|
-
passo = new construtos_1.Unario(this.hashArquivo, new lexador_1.Simbolo(
|
|
400
|
-
operadorCondicao = new lexador_1.Simbolo(
|
|
401
|
-
operadorCondicaoIncremento = new lexador_1.Simbolo(
|
|
399
|
+
passo = new construtos_1.Unario(this.hashArquivo, new lexador_1.Simbolo(lexico_regular_1.default.SUBTRACAO, '-', undefined, simboloPara.linha, simboloPara.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1), 'ANTES');
|
|
400
|
+
operadorCondicao = new lexador_1.Simbolo(lexico_regular_1.default.MAIOR_IGUAL, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
401
|
+
operadorCondicaoIncremento = new lexador_1.Simbolo(lexico_regular_1.default.MAIOR, '', '', Number(simboloPara.linha), this.hashArquivo);
|
|
402
402
|
}
|
|
403
403
|
else {
|
|
404
404
|
passo = new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1);
|
|
@@ -412,16 +412,16 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
412
412
|
resolverIncrementoEmExecucao = true;
|
|
413
413
|
}
|
|
414
414
|
}
|
|
415
|
-
this.consumir(
|
|
415
|
+
this.consumir(lexico_regular_1.default.FACA, "Esperado palavra reservada 'faca' após valor final do laço de repetição 'para'.");
|
|
416
416
|
const declaracoesBlocoPara = [];
|
|
417
417
|
let simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
418
|
-
while (simboloAtualBlocoPara.tipo !==
|
|
418
|
+
while (simboloAtualBlocoPara.tipo !== lexico_regular_1.default.FIM) {
|
|
419
419
|
declaracoesBlocoPara.push(this.resolverDeclaracaoForaDeBloco());
|
|
420
420
|
simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
421
421
|
}
|
|
422
|
-
this.consumir(
|
|
422
|
+
this.consumir(lexico_regular_1.default.FIM, '');
|
|
423
423
|
const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
|
|
424
|
-
const para = new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, literalOuVariavelInicio), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), operadorCondicao, literalOuVariavelFim), new construtos_1.FimPara(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), operadorCondicaoIncremento, literalOuVariavelFim), new declaracoes_1.Expressao(new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(
|
|
424
|
+
const para = new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, literalOuVariavelInicio), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), operadorCondicao, literalOuVariavelFim), new construtos_1.FimPara(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), operadorCondicaoIncremento, literalOuVariavelFim), new declaracoes_1.Expressao(new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(lexico_regular_1.default.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo), passo)))), corpo);
|
|
425
425
|
para.blocoPosExecucao = corpo;
|
|
426
426
|
para.resolverIncrementoEmExecucao = resolverIncrementoEmExecucao;
|
|
427
427
|
return para;
|
|
@@ -431,16 +431,16 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
431
431
|
const condicao = this.expressao();
|
|
432
432
|
const caminhos = [];
|
|
433
433
|
let caminhoPadrao = null;
|
|
434
|
-
while (!this.verificarSeSimboloAtualEIgualA(
|
|
435
|
-
this.consumir(
|
|
436
|
-
if (this.verificarSeSimboloAtualEIgualA(
|
|
434
|
+
while (!this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.FIM)) {
|
|
435
|
+
this.consumir(lexico_regular_1.default.CASO, "Esperado palavra reservada 'caso' após condição de 'escolha'.");
|
|
436
|
+
if (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.TRACO_BAIXO)) {
|
|
437
437
|
// Caso padrão
|
|
438
438
|
if (caminhoPadrao !== null) {
|
|
439
439
|
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simbolos[this.atual], "Você só pode ter um caminho padrão em cada declaração de 'escolha'.");
|
|
440
440
|
this.erros.push(excecao);
|
|
441
441
|
throw excecao;
|
|
442
442
|
}
|
|
443
|
-
this.consumir(
|
|
443
|
+
this.consumir(lexico_regular_1.default.SETA, "Esperado '=>' após palavra reservada 'caso'.");
|
|
444
444
|
const declaracoesPadrao = [this.resolverDeclaracaoForaDeBloco()];
|
|
445
445
|
// TODO: Verificar se Potigol admite bloco de escopo para `escolha`.
|
|
446
446
|
/* const declaracoesPadrao = [];
|
|
@@ -453,7 +453,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
453
453
|
continue;
|
|
454
454
|
}
|
|
455
455
|
const caminhoCondicoes = [this.expressao()];
|
|
456
|
-
this.consumir(
|
|
456
|
+
this.consumir(lexico_regular_1.default.SETA, "Esperado '=>' após palavra reservada 'caso'.");
|
|
457
457
|
const declaracoes = [this.resolverDeclaracaoForaDeBloco()];
|
|
458
458
|
// TODO: Verificar se Potigol admite bloco de escopo para `escolha`.
|
|
459
459
|
/* const declaracoes = [];
|
|
@@ -471,8 +471,8 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
471
471
|
const identificadores = [];
|
|
472
472
|
let tipo = null;
|
|
473
473
|
do {
|
|
474
|
-
identificadores.push(this.consumir(
|
|
475
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
474
|
+
identificadores.push(this.consumir(lexico_regular_1.default.IDENTIFICADOR, 'Esperado nome da constante.'));
|
|
475
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
476
476
|
/* if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.DOIS_PONTOS)) {
|
|
477
477
|
const tipoConstante = this.verificarDefinicaoTipoAtual();
|
|
478
478
|
if (!tipoConstante) {
|
|
@@ -481,7 +481,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
481
481
|
tipo = tipoConstante;
|
|
482
482
|
this.avancarEDevolverAnterior();
|
|
483
483
|
} */
|
|
484
|
-
this.consumir(
|
|
484
|
+
this.consumir(lexico_regular_1.default.IGUAL, "Esperado '=' após identificador em instrução 'constante'.");
|
|
485
485
|
const inicializadores = [];
|
|
486
486
|
do {
|
|
487
487
|
let inicializador = this.expressao();
|
|
@@ -489,7 +489,7 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
489
489
|
inicializador = new declaracoes_1.LeiaMultiplo(inicializador.simbolo, new construtos_1.Literal(this.hashArquivo, Number(inicializador.simbolo.linha), identificadores.length));
|
|
490
490
|
}
|
|
491
491
|
inicializadores.push(inicializador);
|
|
492
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
492
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
493
493
|
if (identificadores.length !== inicializadores.length) {
|
|
494
494
|
// Pode ser que a inicialização seja feita por uma das
|
|
495
495
|
// funções `leia`, que podem ler vários valores. Neste caso, não deve dar erro.
|
|
@@ -499,14 +499,14 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
499
499
|
const inicializadorLeia = inicializadores[0];
|
|
500
500
|
let tipoConversao;
|
|
501
501
|
switch (inicializadorLeia.simbolo.tipo) {
|
|
502
|
-
case
|
|
502
|
+
case lexico_regular_1.default.LEIA_INTEIROS:
|
|
503
503
|
tipoConversao = 'inteiro[]';
|
|
504
504
|
break;
|
|
505
|
-
case
|
|
505
|
+
case lexico_regular_1.default.LEIA_INTEIRO:
|
|
506
506
|
tipoConversao = 'inteiro';
|
|
507
507
|
break;
|
|
508
|
-
case
|
|
509
|
-
case
|
|
508
|
+
case lexico_regular_1.default.LEIA_REAL:
|
|
509
|
+
case lexico_regular_1.default.LEIA_REAIS:
|
|
510
510
|
tipoConversao = 'real';
|
|
511
511
|
break;
|
|
512
512
|
default:
|
|
@@ -528,13 +528,13 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
528
528
|
const simboloVar = this.avancarEDevolverAnterior();
|
|
529
529
|
const identificadores = [];
|
|
530
530
|
do {
|
|
531
|
-
identificadores.push(this.consumir(
|
|
532
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
533
|
-
this.consumir(
|
|
531
|
+
identificadores.push(this.consumir(lexico_regular_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
|
|
532
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
533
|
+
this.consumir(lexico_regular_1.default.REATRIBUIR, "Esperado ':=' após identificador em instrução 'var'.");
|
|
534
534
|
const inicializadores = [];
|
|
535
535
|
do {
|
|
536
536
|
inicializadores.push(this.expressao());
|
|
537
|
-
} while (this.verificarSeSimboloAtualEIgualA(
|
|
537
|
+
} while (this.verificarSeSimboloAtualEIgualA(lexico_regular_1.default.VIRGULA));
|
|
538
538
|
if (identificadores.length !== inicializadores.length) {
|
|
539
539
|
throw this.erro(simboloVar, 'Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores à direita.');
|
|
540
540
|
}
|
|
@@ -550,11 +550,12 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
550
550
|
// podemos ter uma constante apenas.
|
|
551
551
|
this.avancarEDevolverAnterior();
|
|
552
552
|
if (![
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
553
|
+
lexico_regular_1.default.CARACTERE,
|
|
554
|
+
lexico_regular_1.default.INTEIRO,
|
|
555
|
+
lexico_regular_1.default.LOGICO,
|
|
556
|
+
lexico_regular_1.default.LÓGICO,
|
|
557
|
+
lexico_regular_1.default.REAL,
|
|
558
|
+
lexico_regular_1.default.TEXTO,
|
|
558
559
|
].includes(this.simbolos[this.atual].tipo)) {
|
|
559
560
|
throw this.erro(this.simbolos[this.atual], 'Esperado tipo após dois-pontos e nome de identificador.');
|
|
560
561
|
}
|
|
@@ -580,34 +581,34 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
580
581
|
} */
|
|
581
582
|
const metodos = [];
|
|
582
583
|
const propriedades = [];
|
|
583
|
-
while (!this.verificarTipoSimboloAtual(
|
|
584
|
-
const identificador = this.consumir(
|
|
585
|
-
if (this.simbolos[this.atual].tipo ===
|
|
584
|
+
while (!this.verificarTipoSimboloAtual(lexico_regular_1.default.FIM) && !this.estaNoFinal()) {
|
|
585
|
+
const identificador = this.consumir(lexico_regular_1.default.IDENTIFICADOR, 'Esperado nome de propriedade ou método.');
|
|
586
|
+
if (this.simbolos[this.atual].tipo === lexico_regular_1.default.PARENTESE_ESQUERDO) {
|
|
586
587
|
// Método
|
|
587
588
|
const construtoMetodo = new construtos_1.Constante(identificador.hashArquivo, identificador);
|
|
588
589
|
metodos.push(this.declaracaoDeFuncaoOuMetodo(construtoMetodo));
|
|
589
590
|
}
|
|
590
591
|
else {
|
|
591
592
|
// Propriedade
|
|
592
|
-
this.consumir(
|
|
593
|
+
this.consumir(lexico_regular_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade em declaração de tipo.');
|
|
593
594
|
this.verificacaoTipo(this.simbolos[this.atual], 'Esperado tipo do argumento após dois-pontos, em definição de função.');
|
|
594
595
|
const tipoPropriedade = this.avancarEDevolverAnterior();
|
|
595
596
|
propriedades.push(new declaracoes_1.PropriedadeClasse(identificador, this.tiposPotigolParaDelegua[tipoPropriedade.lexema]));
|
|
596
597
|
}
|
|
597
598
|
}
|
|
598
|
-
this.consumir(
|
|
599
|
+
this.consumir(lexico_regular_1.default.FIM, "Esperado 'fim' após o escopo do tipo.");
|
|
599
600
|
// Depois de verificadas todas as propriedades anotadas com tipo,
|
|
600
601
|
// Precisamos gerar um construtor com todas elas na ordem em que
|
|
601
602
|
// foram lidas.
|
|
602
603
|
const instrucoesConstrutor = [];
|
|
603
604
|
for (let propriedade of propriedades) {
|
|
604
|
-
instrucoesConstrutor.push(new declaracoes_1.Expressao(new construtos_1.DefinirValor(propriedade.hashArquivo, propriedade.linha, new construtos_1.Isto(propriedade.hashArquivo, propriedade.linha, new lexador_1.Simbolo(
|
|
605
|
+
instrucoesConstrutor.push(new declaracoes_1.Expressao(new construtos_1.DefinirValor(propriedade.hashArquivo, propriedade.linha, new construtos_1.Isto(propriedade.hashArquivo, propriedade.linha, new lexador_1.Simbolo(lexico_regular_1.default.ISTO, 'isto', undefined, simboloTipo.linha, simboloTipo.hashArquivo)), propriedade.nome, new construtos_1.Variavel(propriedade.hashArquivo, propriedade.nome))));
|
|
605
606
|
}
|
|
606
607
|
const construtorConstruto = new construtos_1.FuncaoConstruto(simboloTipo.hashArquivo, simboloTipo.linha, propriedades.map((p) => ({
|
|
607
608
|
abrangencia: 'padrao',
|
|
608
609
|
nome: p.nome,
|
|
609
610
|
})), instrucoesConstrutor);
|
|
610
|
-
const construtor = new declaracoes_1.FuncaoDeclaracao(new lexador_1.Simbolo(
|
|
611
|
+
const construtor = new declaracoes_1.FuncaoDeclaracao(new lexador_1.Simbolo(lexico_regular_1.default.CONSTRUTOR, 'construtor', undefined, simboloTipo.hashArquivo, simboloTipo.linha), construtorConstruto, undefined);
|
|
611
612
|
metodos.unshift(construtor);
|
|
612
613
|
return new declaracoes_1.Classe(construto.simbolo, undefined, metodos, propriedades);
|
|
613
614
|
}
|
|
@@ -616,14 +617,14 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
616
617
|
if (!this.estaNoFinal() && expressao instanceof construtos_1.Constante) {
|
|
617
618
|
let tipoVariavelOuConstante;
|
|
618
619
|
// Atribuição constante.
|
|
619
|
-
if (this.simbolos[this.atual].tipo ===
|
|
620
|
+
if (this.simbolos[this.atual].tipo === lexico_regular_1.default.DOIS_PONTOS) {
|
|
620
621
|
tipoVariavelOuConstante = this.logicaAtribuicaoComDicaDeTipo(expressao);
|
|
621
622
|
}
|
|
622
623
|
switch (this.simbolos[this.atual].tipo) {
|
|
623
|
-
case
|
|
624
|
+
case lexico_regular_1.default.VIRGULA:
|
|
624
625
|
this.atual--;
|
|
625
626
|
return this.declaracaoDeConstantes();
|
|
626
|
-
case
|
|
627
|
+
case lexico_regular_1.default.IGUAL:
|
|
627
628
|
this.avancarEDevolverAnterior();
|
|
628
629
|
const valorAtribuicao = this.ou();
|
|
629
630
|
return new declaracoes_1.Const(expressao.simbolo, valorAtribuicao, tipoVariavelOuConstante
|
|
@@ -647,10 +648,10 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
647
648
|
* ou uma chamada de função.
|
|
648
649
|
*/
|
|
649
650
|
expressaoOuDefinicaoFuncao() {
|
|
650
|
-
if (!this.estaNoFinal() && this.simbolos[this.atual].tipo ===
|
|
651
|
+
if (!this.estaNoFinal() && this.simbolos[this.atual].tipo === lexico_regular_1.default.IDENTIFICADOR) {
|
|
651
652
|
if (this.atual + 1 < this.simbolos.length) {
|
|
652
653
|
switch (this.simbolos[this.atual + 1].tipo) {
|
|
653
|
-
case
|
|
654
|
+
case lexico_regular_1.default.PARENTESE_ESQUERDO:
|
|
654
655
|
const construtoPrimario = this.primario();
|
|
655
656
|
return this.declaracaoDeFuncaoOuMetodo(construtoPrimario);
|
|
656
657
|
}
|
|
@@ -661,21 +662,21 @@ class AvaliadorSintaticoPotigol extends avaliador_sintatico_base_1.AvaliadorSint
|
|
|
661
662
|
resolverDeclaracaoForaDeBloco() {
|
|
662
663
|
const simboloAtual = this.simbolos[this.atual];
|
|
663
664
|
switch (simboloAtual.tipo) {
|
|
664
|
-
case
|
|
665
|
+
case lexico_regular_1.default.ENQUANTO:
|
|
665
666
|
return this.declaracaoEnquanto();
|
|
666
|
-
case
|
|
667
|
+
case lexico_regular_1.default.ESCOLHA:
|
|
667
668
|
return this.declaracaoEscolha();
|
|
668
|
-
case
|
|
669
|
+
case lexico_regular_1.default.ESCREVA:
|
|
669
670
|
return this.declaracaoEscreva();
|
|
670
|
-
case
|
|
671
|
+
case lexico_regular_1.default.IMPRIMA:
|
|
671
672
|
return this.declaracaoImprima();
|
|
672
|
-
case
|
|
673
|
+
case lexico_regular_1.default.PARA:
|
|
673
674
|
return this.declaracaoPara();
|
|
674
|
-
case
|
|
675
|
+
case lexico_regular_1.default.SE:
|
|
675
676
|
return this.declaracaoSe();
|
|
676
|
-
case
|
|
677
|
+
case lexico_regular_1.default.TIPO:
|
|
677
678
|
return this.declaracaoTipo();
|
|
678
|
-
case
|
|
679
|
+
case lexico_regular_1.default.VARIAVEL:
|
|
679
680
|
return this.declaracaoDeVariaveis();
|
|
680
681
|
default:
|
|
681
682
|
return this.expressaoOuDefinicaoFuncao();
|