diff --git a/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts b/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts index e65224a..1025b0c 100644 --- a/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts +++ b/fontes/avaliador-sintatico/avaliador-sintatico-portugol-studio.ts @@ -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) diff --git a/testes/avaliador-sintatico.test.ts b/testes/avaliador-sintatico.test.ts index fbbf38a..f92624f 100644 --- a/testes/avaliador-sintatico.test.ts +++ b/testes/avaliador-sintatico.test.ts @@ -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', '{', diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts index 7928959..030baea 100644 --- a/testes/interpretador.test.ts +++ b/testes/interpretador.test.ts @@ -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', '{',