Skip to content

Commit

Permalink
Permitindo chamada a super() para construtor de classe herdada.
Browse files Browse the repository at this point in the history
  • Loading branch information
leonelsanchesdasilva committed Nov 8, 2023
1 parent b3b2837 commit 3f9a369
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 23 deletions.
49 changes: 28 additions & 21 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import tiposDeSimbolos from '../tipos-de-simbolos/delegua';
import hrtime from 'browser-process-hrtime';

import {
AvaliadorSintaticoInterface,
ParametroInterface,
SimboloInterface,
} from '../interfaces';
import { AvaliadorSintaticoInterface, ParametroInterface, SimboloInterface } from '../interfaces';
import {
AcessoMetodo as AcessoMetodo,
Agrupamento,
Expand Down Expand Up @@ -58,6 +54,7 @@ import { RetornoAvaliadorSintatico } from '../interfaces/retornos/retorno-avalia
import { RetornoLexador } from '../interfaces/retornos/retorno-lexador';
import { RetornoDeclaracao } from './retornos';
import { TiposDadosInterface } from '../interfaces/tipos-dados-interface';
import { Simbolo } from '../lexador';

/**
* O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
Expand Down Expand Up @@ -254,10 +251,22 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
return new Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);

case tiposDeSimbolos.SUPER:
const simboloChave = this.avancarEDevolverAnterior();
this.consumir(tiposDeSimbolos.PONTO, "Esperado '.' após 'super'.");
const metodo = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
return new Super(this.hashArquivo, simboloChave, metodo);
const simboloSuper = this.avancarEDevolverAnterior();
// Se o próximo símbolo for uma abertura de parênteses, significa que
// é uma chamada ao construtor da classe ancestral (superclasse).
// Se o próximo símbolo for um ponto, significa que é uma chamada
// a um método da superclasse.
switch (this.simbolos[this.atual].tipo) {
case tiposDeSimbolos.PARENTESE_ESQUERDO:
return new Super(
this.hashArquivo,
simboloSuper,
new Simbolo(tiposDeSimbolos.IDENTIFICADOR, 'construtor', null, simboloSuper.linha, this.hashArquivo));
default:
this.consumir(tiposDeSimbolos.PONTO, "Esperado '.' após 'super'.");
const metodoSuperclasse = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome do método da Superclasse.');
return new Super(this.hashArquivo, simboloSuper, metodoSuperclasse);
}

case tiposDeSimbolos.VERDADEIRO:
this.avancarEDevolverAnterior();
Expand All @@ -276,21 +285,19 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
case tiposDeSimbolos.EXPRESSAO_REGULAR:
let valor: string = '';
let linhaAtual = this.simbolos[this.atual].linha;
let eParExpressaoRegular = this.simbolos
.filter(l => l.linha === linhaAtual && l.tipo === tiposDeSimbolos.EXPRESSAO_REGULAR)
.length % 2 === 0;
if(eParExpressaoRegular) {
let eParExpressaoRegular =
this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === tiposDeSimbolos.EXPRESSAO_REGULAR)
.length %
2 ===
0;
if (eParExpressaoRegular) {
this.avancarEDevolverAnterior();
while (!this.verificarTipoSimboloAtual(tiposDeSimbolos.EXPRESSAO_REGULAR)) {
valor += this.simboloAtual().lexema || '';
this.avancarEDevolverAnterior();
}
this.avancarEDevolverAnterior();
return new ExpressaoRegular(
this.hashArquivo,
simboloAtual,
valor
);
return new ExpressaoRegular(this.hashArquivo, simboloAtual, valor);
}
}

Expand Down Expand Up @@ -704,7 +711,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
let incrementar = null;
if (!this.verificarTipoSimboloAtual(tiposDeSimbolos.PARENTESE_DIREITO)) {
incrementar = this.expressao();
this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.INCREMENTAR, tiposDeSimbolos.DECREMENTAR)
this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.INCREMENTAR, tiposDeSimbolos.DECREMENTAR);
}

if (comParenteses) {
Expand Down Expand Up @@ -1132,8 +1139,8 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn
parametro.tipoDado = {
nome: this.simbolos[this.atual - 2].lexema,
tipo: tipoDadoParametro,
tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null
}
tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null,
};
this.avancarEDevolverAnterior();
}

Expand Down
2 changes: 2 additions & 0 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1488,6 +1488,8 @@ export class InterpretadorBase implements InterpretadorInterface {

if (Array.isArray(objeto)) return objeto;
if (objeto.valor instanceof ObjetoPadrao) return objeto.valor.paraTexto();
// TODO: Idealmente isso deveria devolver um texto estruturado representando o objeto.
if (objeto instanceof ObjetoDeleguaClasse) return objeto.toString();
if (typeof objeto === 'object') return JSON.stringify(objeto);

return objeto.toString();
Expand Down
4 changes: 2 additions & 2 deletions testes/interpretador.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -902,7 +902,7 @@ describe('Interpretador', () => {
expect(retornoInterpretador.erros).toHaveLength(0);
});

it.skip('Chamada de método com `super` e definição de propriedade com `isto`', async () => {
it('Chamada de método com `super` e definição de propriedade com `isto`', async () => {
const codigo = [
"classe A {",
"construtor() {",
Expand All @@ -914,7 +914,7 @@ describe('Interpretador', () => {
"}",
"classe B herda A {",
"construtor(data) {",
// "super();",
"super();",
"super.data(data);",
"}",
"}",
Expand Down

0 comments on commit 3f9a369

Please sign in to comment.