Skip to content

Commit

Permalink
Melhorias declaração Falhar
Browse files Browse the repository at this point in the history
  • Loading branch information
samuelrvg committed Nov 4, 2023
1 parent 449fb55 commit 1947e39
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 9 deletions.
3 changes: 1 addition & 2 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -854,8 +854,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface<SimboloIn

declaracaoFalhar(): Falhar {
const simboloFalha: SimboloInterface = this.simbolos[this.atual - 1];
const textoFalha = this.consumir(tiposDeSimbolos.TEXTO, 'Esperado texto para explicar falha.');
return new Falhar(simboloFalha, textoFalha.literal);
return new Falhar(simboloFalha, this.declaracaoExpressao().expressao);
}

declaracaoImportar(): Importar {
Expand Down
4 changes: 2 additions & 2 deletions fontes/declaracoes/falhar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import { Declaracao } from './declaracao';

export class Falhar extends Declaracao {
simbolo: SimboloInterface;
explicacao: string;
explicacao: any;

constructor(simbolo: SimboloInterface, explicacao: string) {
constructor(simbolo: SimboloInterface, explicacao: any) {
super(Number(simbolo.linha), simbolo.hashArquivo);
this.simbolo = simbolo;
this.explicacao = explicacao;
Expand Down
5 changes: 3 additions & 2 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,9 @@ export class InterpretadorBase implements InterpretadorInterface {
throw new Error('Método não implementado.');
}

visitarExpressaoFalhar(expressao: Falhar): Promise<any> {
throw new ErroEmTempoDeExecucao(expressao.simbolo, expressao.explicacao, expressao.linha);
async visitarExpressaoFalhar(expressao: Falhar): Promise<any> {
const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao) as any).valor;
throw new ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
}

visitarExpressaoFimPara(declaracao: FimPara) {
Expand Down
2 changes: 1 addition & 1 deletion fontes/tradutores/tradutor-assemblyscript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ export class TradutorAssemblyScript {
}

traduzirDeclaracaoFalhar(falhar: Falhar) {
return `throw '${falhar.explicacao}'`;
return `throw '${falhar.explicacao.valor}'`;
}

traduzirDeclaracaoFazer(declaracaoFazer: Fazer): string {
Expand Down
2 changes: 1 addition & 1 deletion fontes/tradutores/tradutor-javascript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,7 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
}

traduzirDeclaracaoFalhar(falhar: Falhar) {
return `throw '${falhar.explicacao}'`;
return `throw '${falhar.explicacao.valor}'`;
}

traduzirConstrutoUnario(unario: Unario): string {
Expand Down
14 changes: 14 additions & 0 deletions testes/interpretador.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1123,6 +1123,20 @@ describe('Interpretador', () => {
expect(retornoInterpretador.erros.length).toBeGreaterThanOrEqual(0);
});
});

describe('Falhar', () => {
it('Trivial', async () => {
const retornoLexador = lexador.mapear([
"var mensagem = \"teste de falha\"",
"falhar mensagem"
], -1);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);

expect(retornoInterpretador.erros.length).toBeGreaterThanOrEqual(0);
});
});
});
});
});
16 changes: 16 additions & 0 deletions testes/tradutores/tradutor-javascript.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,22 @@ describe('Tradutor Delégua -> JavaScript', () => {
expect(resultado).toMatch(/throw 'erro inesperado!'/i);
});

it.skip('falhar - throw', () => {
const retornoLexador = lexador.mapear(
[
'var msg = \'erro inesperado!\'',
'falhar msg',
],
-1
);
const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);

const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
expect(resultado).toBeTruthy();
// expect(resultado).toMatch(/let msg = \'erro inesperado!\'/i);
// expect(resultado).toMatch(/throw 'erro inesperado!'/i);
});

it('tipo de - typeof', () => {
const retornoLexador = lexador.mapear(
[
Expand Down
2 changes: 1 addition & 1 deletion testes/visualg/avaliador-sintatico.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ describe('Avaliador sintático (VisuAlg)', () => {
expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
expect.objectContaining({
name: 'TypeError',
message: "Cannot read properties of undefined (reading 'tipo')",
message: "Cannot read property 'tipo' of undefined",
})
);
});
Expand Down

0 comments on commit 1947e39

Please sign in to comment.