Skip to content

Commit

Permalink
Merge pull request #12 from DesignLiquido/issue-9
Browse files Browse the repository at this point in the history
Permitindo incluir um nome de biblioteca sem nome de constante.
  • Loading branch information
leonelsanchesdasilva authored Apr 6, 2024
2 parents 7495e79 + 2fda6b2 commit 5193850
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -215,15 +215,20 @@ export class AvaliadorSintaticoPortugolStudio extends AvaliadorSintaticoBase {
/**
* Declaração para inclusão de uma biblioteca.
* Exemplo: `inclua biblioteca Matematica --> mat` seria o mesmo que
* `const mat = importar('matematica')` em Delégua.
* `const mat = importar('Matematica')` em Delégua, ou
* `inclua biblioteca Matematica` (sem o nome da variável) seria o
* mesmo que `const Matematica = importar('Matematica')`
* @returns Uma declaração do tipo `Importar`.
*/
declaracaoInclua(): Const {
this.avancarEDevolverAnterior();
this.consumir(tiposDeSimbolos.BIBLIOTECA, 'Esperado palavra reservada "biblioteca" após "inclua".');
const nomeBiblioteca = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado identificador com nome de biblioteca após palavra reservada "biblioteca"');
this.consumir(tiposDeSimbolos.SETA, 'Esperado seta de atribuição após nome de biblioteca.');
const constanteBiblioteca = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado identificador com nome de constante de biblioteca após seta de atribuição em declaração "inclua".');
let constanteBiblioteca = nomeBiblioteca;
if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.SETA)) {
constanteBiblioteca = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado identificador com nome de constante de biblioteca após seta de atribuição em declaração "inclua".');
}

return new Const(
constanteBiblioteca,
new Importar(new Literal(this.hashArquivo, nomeBiblioteca.linha, nomeBiblioteca.lexema), null)
Expand Down
18 changes: 18 additions & 0 deletions testes/avaliador-sintatico.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,24 @@ describe('Avaliador sintático (Portugol Studio)', () => {
});

it('Importação de bibliotecas', () => {
const resultado = lexador.mapear([
'programa',
'{',
' inclua biblioteca Matematica',
' funcao inicio()',
' {',
' escreva(Matematica.raiz(4.0, 2.0))',
' }',
'}'
], -1);

const retornoAvaliadorSintatico = avaliadorSintatico.analisar(resultado, -1);

expect(retornoAvaliadorSintatico).toBeTruthy();
expect(retornoAvaliadorSintatico.declaracoes.length).toBeGreaterThan(0);
});

it('Importação de bibliotecas, com nome de constante definido', () => {
const resultado = lexador.mapear([
'programa',
'{',
Expand Down
24 changes: 24 additions & 0 deletions testes/interpretador.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,30 @@ describe('Interpretador (Portugol Studio)', () => {
_saidas += saida;
}

const retornoLexador = lexador.mapear([
'programa',
'{',
' inclua biblioteca Matematica',
' funcao inicio()',
' {',
' escreva(Matematica.raiz(81.0, 2.0))',
' }',
'}'
], -1);

const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);

expect(retornoInterpretador.erros).toHaveLength(0);
expect(_saidas).toBe('9');
});

it('Biblioteca matemática, com nome de variável', async () => {
let _saidas = "";
interpretador.funcaoDeRetornoMesmaLinha = (saida: string) => {
_saidas += saida;
}

const retornoLexador = lexador.mapear([
'programa',
'{',
Expand Down

0 comments on commit 5193850

Please sign in to comment.