@designliquido/delegua
Advanced tools
Comparing version 0.26.3 to 0.27.0
{ | ||
"name": "@designliquido/delegua", | ||
"version": "0.26.2", | ||
"version": "0.26.3", | ||
"description": "Linguagem de programação simples e moderna usando português estruturado, com suporte a múltiplos dialetos", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
import { Atribuir, Chamada, ExpressaoRegular, FimPara, FormatacaoEscrita, Literal, Super, TipoDe } from '../construtos'; | ||
import { Bloco, Classe, Const, ConstMultiplo, Continua, Declaracao, Enquanto, Escolha, Escreva, EscrevaMesmaLinha, Expressao, Fazer, FuncaoDeclaracao, Importar, Leia, LeiaMultiplo, Para, ParaCada, Retorna, Se, Sustar, Tente, Var, VarMultiplo } from '../declaracoes'; | ||
import { Bloco, Classe, Const, ConstMultiplo, Continua, Declaracao, Enquanto, Escolha, Escreva, EscrevaMesmaLinha, Expressao, Falhar, Fazer, FuncaoDeclaracao, Importar, Leia, LeiaMultiplo, Para, ParaCada, Retorna, Se, Sustar, Tente, Var, VarMultiplo } from '../declaracoes'; | ||
import { SimboloInterface } from '../interfaces'; | ||
import { AnalisadorSemanticoInterface } from '../interfaces/analisador-semantico-interface'; | ||
import { ErroAnalisadorSemantico } from '../interfaces/erros'; | ||
import { DiagnosticoAnalisadorSemantico } from '../interfaces/erros'; | ||
import { RetornoAnalisadorSemantico } from '../interfaces/retornos/retorno-analisador-semantico'; | ||
@@ -28,10 +28,12 @@ import { TiposDadosInterface } from '../interfaces/tipos-dados-interface'; | ||
atual: number; | ||
erros: ErroAnalisadorSemantico[]; | ||
diagnosticos: DiagnosticoAnalisadorSemantico[]; | ||
constructor(); | ||
visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<any>; | ||
erro(simbolo: SimboloInterface, mensagemDeErro: string): void; | ||
erro(simbolo: SimboloInterface, mensagem: string): void; | ||
aviso(simbolo: SimboloInterface, mensagem: string): void; | ||
verificarTipoAtribuido(declaracao: Var | Const): void; | ||
visitarExpressaoTipoDe(expressao: TipoDe): Promise<any>; | ||
private verificarTipoDe; | ||
visitarExpressaoFalhar(expressao: any): Promise<any>; | ||
visitarExpressaoFalhar(expressao: Falhar): Promise<any>; | ||
private verificarFalhar; | ||
visitarExpressaoLiteral(expressao: Literal): Promise<any>; | ||
@@ -71,2 +73,3 @@ visitarExpressaoAgrupamento(expressao: any): Promise<any>; | ||
visitarDeclaracaoConst(declaracao: Const): Promise<any>; | ||
virificarTipoDeclaracaoConst(declaracao: Const): Promise<any>; | ||
visitarDeclaracaoConstMultiplo(declaracao: ConstMultiplo): Promise<any>; | ||
@@ -73,0 +76,0 @@ visitarDeclaracaoVar(declaracao: Var): Promise<any>; |
@@ -6,2 +6,3 @@ "use strict"; | ||
const declaracoes_1 = require("../declaracoes"); | ||
const erros_1 = require("../interfaces/erros"); | ||
const pilha_variaveis_1 = require("./pilha-variaveis"); | ||
@@ -14,3 +15,3 @@ class AnalisadorSemantico { | ||
this.atual = 0; | ||
this.erros = []; | ||
this.diagnosticos = []; | ||
} | ||
@@ -20,10 +21,20 @@ visitarExpressaoExpressaoRegular(expressao) { | ||
} | ||
erro(simbolo, mensagemDeErro) { | ||
this.erros.push({ | ||
erro(simbolo, mensagem) { | ||
this.diagnosticos.push({ | ||
simbolo: simbolo, | ||
mensagem: mensagemDeErro, | ||
mensagem: mensagem, | ||
hashArquivo: simbolo.hashArquivo, | ||
linha: simbolo.linha, | ||
severidade: erros_1.DiagnosticoSeveridade.ERRO | ||
}); | ||
} | ||
aviso(simbolo, mensagem) { | ||
this.diagnosticos.push({ | ||
simbolo: simbolo, | ||
mensagem: mensagem, | ||
hashArquivo: simbolo.hashArquivo, | ||
linha: simbolo.linha, | ||
severidade: erros_1.DiagnosticoSeveridade.AVISO | ||
}); | ||
} | ||
verificarTipoAtribuido(declaracao) { | ||
@@ -88,2 +99,15 @@ if (declaracao.tipo) { | ||
visitarExpressaoFalhar(expressao) { | ||
return this.verificarFalhar(expressao.explicacao); | ||
} | ||
verificarFalhar(valor) { | ||
if (valor instanceof construtos_1.Binario) { | ||
this.verificarFalhar(valor.direita); | ||
this.verificarFalhar(valor.esquerda); | ||
} | ||
if (valor instanceof construtos_1.Agrupamento) { | ||
return this.verificarFalhar(valor.expressao); | ||
} | ||
if (valor instanceof construtos_1.Variavel) { | ||
return this.verificarVariavel(valor); | ||
} | ||
return Promise.resolve(); | ||
@@ -185,2 +209,7 @@ } | ||
} | ||
else { | ||
if (this.variaveis[expressao.simbolo.lexema]) { | ||
this.variaveis[expressao.simbolo.lexema].valor = expressao.valor; | ||
} | ||
} | ||
} | ||
@@ -334,2 +363,3 @@ visitarExpressaoDeVariavel(expressao) { | ||
visitarDeclaracaoEscreva(declaracao) { | ||
var _a; | ||
const variaveis = declaracao.argumentos.filter(arg => arg instanceof construtos_1.Variavel); | ||
@@ -340,2 +370,5 @@ for (let variavel of variaveis) { | ||
} | ||
if (((_a = this.variaveis[variavel.simbolo.lexema]) === null || _a === void 0 ? void 0 : _a.valor) === undefined) { | ||
this.aviso(variavel.simbolo, `Variável '${variavel.simbolo.lexema}' não foi inicializada.`); | ||
} | ||
} | ||
@@ -353,8 +386,3 @@ return Promise.resolve(); | ||
if (this.variaveis.hasOwnProperty(declaracao.simbolo.lexema)) { | ||
this.erros.push({ | ||
simbolo: declaracao.simbolo, | ||
mensagem: 'Declaração de constante já feita.', | ||
hashArquivo: declaracao.hashArquivo, | ||
linha: declaracao.linha, | ||
}); | ||
this.erro(declaracao.simbolo, 'Declaração de constante já feita.'); | ||
} | ||
@@ -368,4 +396,19 @@ else { | ||
} | ||
this.virificarTipoDeclaracaoConst(declaracao); | ||
return Promise.resolve(); | ||
} | ||
virificarTipoDeclaracaoConst(declaracao) { | ||
if (declaracao.inicializador instanceof construtos_1.Binario) { | ||
// verificar tipos iguais no lado esquerdo e direito | ||
const binario = declaracao.inicializador; | ||
this.verificarLadoBinario(binario.direita); | ||
this.verificarLadoBinario(binario.esquerda); | ||
const tipoDireita = typeof binario.direita.valor; | ||
const tipoEsquerda = typeof binario.esquerda.valor; | ||
if (tipoDireita !== tipoEsquerda) { | ||
this.aviso(declaracao.simbolo, 'Declaração de constante com tipos diferentes.'); | ||
} | ||
} | ||
return Promise.resolve(); | ||
} | ||
visitarDeclaracaoConstMultiplo(declaracao) { | ||
@@ -480,3 +523,3 @@ return Promise.resolve(); | ||
this.atual = 0; | ||
this.erros = []; | ||
this.diagnosticos = []; | ||
while (this.atual < declaracoes.length) { | ||
@@ -487,3 +530,3 @@ declaracoes[this.atual].aceitar(this); | ||
return { | ||
erros: this.erros, | ||
diagnosticos: this.diagnosticos, | ||
}; | ||
@@ -490,0 +533,0 @@ } |
import { Atribuir, ExpressaoRegular, FimPara, FormatacaoEscrita, Literal, Super, TipoDe } from '../../construtos'; | ||
import { Bloco, Classe, Const, ConstMultiplo, Continua, Declaracao, Enquanto, Escolha, Escreva, EscrevaMesmaLinha, Expressao, Fazer, FuncaoDeclaracao, Importar, Leia, LeiaMultiplo, Para, ParaCada, Retorna, Se, Sustar, Tente, Var, VarMultiplo } from '../../declaracoes'; | ||
import { AnalisadorSemanticoInterface } from '../../interfaces/analisador-semantico-interface'; | ||
import { ErroAnalisadorSemantico } from '../../interfaces/erros'; | ||
import { DiagnosticoAnalisadorSemantico } from '../../interfaces/erros'; | ||
import { RetornoAnalisadorSemantico } from '../../interfaces/retornos/retorno-analisador-semantico'; | ||
@@ -19,3 +19,3 @@ import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../../quebras'; | ||
atual: number; | ||
erros: ErroAnalisadorSemantico[]; | ||
diagnosticos: DiagnosticoAnalisadorSemantico[]; | ||
constructor(); | ||
@@ -22,0 +22,0 @@ visitarExpressaoExpressaoRegular(expressao: ExpressaoRegular): Promise<any>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.AnalisadorSemanticoBirl = void 0; | ||
const erros_1 = require("../../interfaces/erros"); | ||
const pilha_variaveis_1 = require("../pilha-variaveis"); | ||
@@ -10,3 +11,3 @@ class AnalisadorSemanticoBirl { | ||
this.atual = 0; | ||
this.erros = []; | ||
this.diagnosticos = []; | ||
} | ||
@@ -30,3 +31,3 @@ visitarExpressaoExpressaoRegular(expressao) { | ||
if (!this.variaveis.hasOwnProperty(expressao.simbolo.lexema)) { | ||
this.erros.push({ | ||
this.diagnosticos.push({ | ||
simbolo: expressao.simbolo, | ||
@@ -36,2 +37,3 @@ mensagem: `A variável ${expressao.simbolo.lexema} não foi declarada.`, | ||
linha: expressao.linha, | ||
severidade: erros_1.DiagnosticoSeveridade.ERRO, | ||
}); | ||
@@ -41,3 +43,3 @@ return Promise.resolve(); | ||
if (this.variaveis[expressao.simbolo.lexema].imutavel) { | ||
this.erros.push({ | ||
this.diagnosticos.push({ | ||
simbolo: expressao.simbolo, | ||
@@ -47,2 +49,3 @@ mensagem: `Constante ${expressao.simbolo.lexema} não pode ser modificada.`, | ||
linha: expressao.linha, | ||
severidade: erros_1.DiagnosticoSeveridade.ERRO, | ||
}); | ||
@@ -148,3 +151,3 @@ return Promise.resolve(); | ||
if (!this.variaveis.hasOwnProperty(expressao.argumentos[0].simbolo.lexema)) { | ||
this.erros.push({ | ||
this.diagnosticos.push({ | ||
simbolo: expressao.argumentos[0].simbolo, | ||
@@ -154,2 +157,3 @@ mensagem: `A variável ${expressao.argumentos[0].simbolo.lexema} não foi declarada.`, | ||
linha: expressao.linha, | ||
severidade: erros_1.DiagnosticoSeveridade.ERRO, | ||
}); | ||
@@ -161,3 +165,3 @@ return Promise.resolve(); | ||
if (tipoVariavelExpressão !== tipoVariavelArgumento) { | ||
this.erros.push({ | ||
this.diagnosticos.push({ | ||
simbolo: expressao.argumentos[0].simbolo, | ||
@@ -167,2 +171,3 @@ mensagem: `A variável ${expressao.argumentos[0].simbolo.lexema} não é do tipo ${tipoVariavelArgumento}.`, | ||
linha: expressao.linha, | ||
severidade: erros_1.DiagnosticoSeveridade.ERRO, | ||
}); | ||
@@ -200,3 +205,3 @@ return Promise.resolve(); | ||
this.atual = 0; | ||
this.erros = []; | ||
this.diagnosticos = []; | ||
while (this.atual < declaracoes.length) { | ||
@@ -207,3 +212,3 @@ declaracoes[this.atual].aceitar(this); | ||
return { | ||
erros: this.erros, | ||
diagnosticos: this.diagnosticos, | ||
}; | ||
@@ -210,0 +215,0 @@ } |
@@ -12,2 +12,3 @@ "use strict"; | ||
const declaracoes_1 = require("../declaracoes"); | ||
const lexador_1 = require("../lexador"); | ||
/** | ||
@@ -157,6 +158,15 @@ * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível. | ||
case delegua_1.default.SUPER: | ||
const simboloChave = this.avancarEDevolverAnterior(); | ||
this.consumir(delegua_1.default.PONTO, "Esperado '.' após 'super'."); | ||
const metodo = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.'); | ||
return new construtos_1.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 delegua_1.default.PARENTESE_ESQUERDO: | ||
return new construtos_1.Super(this.hashArquivo, simboloSuper, new lexador_1.Simbolo(delegua_1.default.IDENTIFICADOR, 'construtor', null, simboloSuper.linha, this.hashArquivo)); | ||
default: | ||
this.consumir(delegua_1.default.PONTO, "Esperado '.' após 'super'."); | ||
const metodoSuperclasse = this.consumir(delegua_1.default.IDENTIFICADOR, 'Esperado nome do método da Superclasse.'); | ||
return new construtos_1.Super(this.hashArquivo, simboloSuper, metodoSuperclasse); | ||
} | ||
case delegua_1.default.VERDADEIRO: | ||
@@ -173,5 +183,6 @@ this.avancarEDevolverAnterior(); | ||
let linhaAtual = this.simbolos[this.atual].linha; | ||
let eParExpressaoRegular = this.simbolos | ||
.filter(l => l.linha === linhaAtual && l.tipo === delegua_1.default.EXPRESSAO_REGULAR) | ||
.length % 2 === 0; | ||
let eParExpressaoRegular = this.simbolos.filter((l) => l.linha === linhaAtual && l.tipo === delegua_1.default.EXPRESSAO_REGULAR) | ||
.length % | ||
2 === | ||
0; | ||
if (eParExpressaoRegular) { | ||
@@ -812,3 +823,3 @@ this.avancarEDevolverAnterior(); | ||
tipo: tipoDadoParametro, | ||
tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null | ||
tipoInvalido: !tipoDadoParametro ? this.simboloAtual().lexema : null, | ||
}; | ||
@@ -815,0 +826,0 @@ this.avancarEDevolverAnterior(); |
@@ -241,9 +241,5 @@ "use strict"; | ||
this.consumir(potigol_1.default.PARENTESE_ESQUERDO, `Esperado parêntese esquerdo após ${simboloLeiaDefinido.lexema}.`); | ||
if (!this.verificarSeSimboloAtualEIgualA(potigol_1.default.INTEIRO, potigol_1.default.REAL)) { | ||
throw this.erro(this.simbolos[this.atual], `Esperado número de argumentos como inteiro ou real em ${simboloLeiaDefinido.lexema}`); | ||
} | ||
let numeroArgumentosLeia = this.simbolos[this.atual - 1]; | ||
const argumento = this.expressao(); | ||
this.consumir(potigol_1.default.PARENTESE_DIREITO, `Esperado parêntese direito após número de parâmetros em chamada de ${simboloLeiaDefinido.lexema}.`); | ||
const leiaDefinido = new declaracoes_1.LeiaMultiplo(simboloLeiaDefinido, []); | ||
leiaDefinido.numeroArgumentosEsperados = parseInt(numeroArgumentosLeia.literal); | ||
const leiaDefinido = new declaracoes_1.LeiaMultiplo(simboloLeiaDefinido, argumento); | ||
return leiaDefinido; | ||
@@ -494,3 +490,3 @@ default: | ||
if (inicializador instanceof declaracoes_1.Leia && identificadores.length > 1) { | ||
inicializador = new declaracoes_1.LeiaMultiplo(inicializador.simbolo, inicializador.argumentos, inicializador.numeroArgumentosEsperados); | ||
inicializador = new declaracoes_1.LeiaMultiplo(inicializador.simbolo, inicializador.argumentos[0]); | ||
} | ||
@@ -505,10 +501,3 @@ inicializadores.push(inicializador); | ||
} | ||
// `leia_inteiros`, `leia_reais` e `leia_textos` pedem um inteiro como argumento, | ||
// que pode ser usado para verificar se a expressão faz sentido ou não aqui. | ||
const inicializadorLeia = inicializadores[0]; | ||
if (inicializadorLeia.numeroArgumentosEsperados > 0) { | ||
if (identificadores.length !== inicializadorLeia.numeroArgumentosEsperados) { | ||
throw this.erro(this.simbolos[this.atual], `Quantidade de identificadores à esquerda do igual é diferente da quantidade de valores passada por parâmetro à direita em ${inicializadorLeia.simbolo.lexema}.`); | ||
} | ||
} | ||
let tipoConversao; | ||
@@ -515,0 +504,0 @@ switch (inicializadorLeia.simbolo.tipo) { |
@@ -11,7 +11,5 @@ import { Construto } from '../construtos'; | ||
id: string; | ||
argumentos: Construto[]; | ||
tipo?: string; | ||
numeroArgumentosEsperados?: number; | ||
constructor(simbolo: SimboloInterface, argumentos: Construto[], numeroArgumentosEsperados?: number); | ||
argumento: Construto; | ||
constructor(simbolo: SimboloInterface, argumento: Construto); | ||
aceitar(visitante: VisitanteComumInterface): Promise<any>; | ||
} |
@@ -11,8 +11,7 @@ "use strict"; | ||
class LeiaMultiplo extends declaracao_1.Declaracao { | ||
constructor(simbolo, argumentos, numeroArgumentosEsperados) { | ||
constructor(simbolo, argumento) { | ||
super(simbolo.linha, simbolo.hashArquivo); | ||
this.simbolo = simbolo; | ||
this.id = (0, geracao_identificadores_1.uuidv4)(); | ||
this.argumentos = argumentos; | ||
this.numeroArgumentosEsperados = numeroArgumentosEsperados; | ||
this.argumento = argumento; | ||
} | ||
@@ -19,0 +18,0 @@ async aceitar(visitante) { |
@@ -1,1 +0,1 @@ | ||
export * from './erro-analisador-semantico'; | ||
export * from './diagnostico-analisador-semantico'; |
@@ -17,3 +17,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
__exportStar(require("./erro-analisador-semantico"), exports); | ||
__exportStar(require("./diagnostico-analisador-semantico"), exports); | ||
//# sourceMappingURL=index.js.map |
@@ -1,4 +0,4 @@ | ||
import { ErroAnalisadorSemantico } from '../erros'; | ||
import { DiagnosticoAnalisadorSemantico } from '../erros'; | ||
export interface RetornoAnalisadorSemantico { | ||
erros: ErroAnalisadorSemantico[]; | ||
diagnosticos: DiagnosticoAnalisadorSemantico[]; | ||
} |
@@ -30,2 +30,3 @@ import { EspacoVariaveis } from '../espaco-variaveis'; | ||
interfaceEntradaSaida: any; | ||
emDeclaracaoTente: boolean; | ||
pilhaEscoposExecucao: PilhaEscoposExecucaoInterface; | ||
@@ -32,0 +33,0 @@ microLexador: MicroLexador; |
@@ -36,2 +36,3 @@ "use strict"; | ||
this.interfaceEntradaSaida = null; | ||
this.emDeclaracaoTente = false; | ||
this.microLexador = new micro_lexador_1.MicroLexador(); | ||
@@ -65,4 +66,4 @@ this.microAvaliadorSintatico = new micro_avaliador_sintatico_1.MicroAvaliadorSintatico(); | ||
const match = texto.match(/^([\/~@;%#'])(.*?)\1([gimsuy]*)$/); | ||
return match ? | ||
new RegExp(match[2], match[3] | ||
return match | ||
? new RegExp(match[2], match[3] | ||
.split('') | ||
@@ -127,8 +128,21 @@ .filter((char, pos, flagArr) => flagArr.indexOf(char) === pos) | ||
async visitarExpressaoLeiaMultiplo(expressao) { | ||
const mensagem = expressao.argumentos && expressao.argumentos[0] ? expressao.argumentos[0].valor : '> '; | ||
return new Promise((resolucao) => this.interfaceEntradaSaida.question(mensagem, (resposta) => { | ||
resolucao(String(resposta) | ||
.split(/(\s+)/) | ||
.filter((r) => !/(\s+)/.test(r))); | ||
})); | ||
const mensagem = '> '; | ||
if (expressao.argumento instanceof construtos_1.Literal) { | ||
let valor = expressao.argumento.valor; | ||
if (typeof valor === 'string') { | ||
return new Promise((resolucao) => this.interfaceEntradaSaida.question(mensagem, (resposta) => { | ||
resolucao(String(resposta) | ||
.split(valor) | ||
.filter((r) => !/(\s+)/.test(r))); | ||
})); | ||
} | ||
let respostas = []; | ||
for (let i = 0; i < valor; i++) { | ||
this.interfaceEntradaSaida.question(mensagem, (resposta) => { | ||
respostas.push(resposta); | ||
}); | ||
} | ||
return Promise.resolve(respostas); | ||
} | ||
return Promise.resolve(); | ||
} | ||
@@ -285,103 +299,91 @@ /** | ||
async visitarExpressaoBinaria(expressao) { | ||
try { | ||
const esquerda = await this.avaliar(expressao.esquerda); | ||
const direita = await this.avaliar(expressao.direita); | ||
const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda; | ||
const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita; | ||
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo')) | ||
? esquerda.tipo | ||
: (0, inferenciador_1.inferirTipoVariavel)(esquerda); | ||
const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo')) ? direita.tipo : (0, inferenciador_1.inferirTipoVariavel)(direita); | ||
switch (expressao.operador.tipo) { | ||
case delegua_1.default.EXPONENCIACAO: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Math.pow(valorEsquerdo, valorDireito); | ||
case delegua_1.default.MAIOR: | ||
if (tipoEsquerdo === 'número' && tipoDireito === 'número') { | ||
return Number(valorEsquerdo) > Number(valorDireito); | ||
const esquerda = await this.avaliar(expressao.esquerda); | ||
const direita = await this.avaliar(expressao.direita); | ||
const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda; | ||
const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita; | ||
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo')) ? esquerda.tipo : (0, inferenciador_1.inferirTipoVariavel)(esquerda); | ||
const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo')) ? direita.tipo : (0, inferenciador_1.inferirTipoVariavel)(direita); | ||
switch (expressao.operador.tipo) { | ||
case delegua_1.default.EXPONENCIACAO: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Math.pow(valorEsquerdo, valorDireito); | ||
case delegua_1.default.MAIOR: | ||
if (tipoEsquerdo === 'número' && tipoDireito === 'número') { | ||
return Number(valorEsquerdo) > Number(valorDireito); | ||
} | ||
else { | ||
return String(valorEsquerdo) > String(valorDireito); | ||
} | ||
case delegua_1.default.MAIOR_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) >= Number(valorDireito); | ||
case delegua_1.default.MENOR: | ||
if (tipoEsquerdo === 'número' && tipoDireito === 'número') { | ||
return Number(valorEsquerdo) < Number(valorDireito); | ||
} | ||
else { | ||
return String(valorEsquerdo) < String(valorDireito); | ||
} | ||
case delegua_1.default.MENOR_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) <= Number(valorDireito); | ||
case delegua_1.default.SUBTRACAO: | ||
case delegua_1.default.MENOS_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) - Number(valorDireito); | ||
case delegua_1.default.ADICAO: | ||
case delegua_1.default.MAIS_IGUAL: | ||
if (['número', 'inteiro'].includes(tipoEsquerdo) && ['número', 'inteiro'].includes(tipoDireito)) { | ||
return Number(valorEsquerdo) + Number(valorDireito); | ||
} | ||
else { | ||
return String(valorEsquerdo) + String(valorDireito); | ||
} | ||
case delegua_1.default.DIVISAO: | ||
case delegua_1.default.DIVISAO_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) / Number(valorDireito); | ||
case delegua_1.default.DIVISAO_INTEIRA: | ||
case delegua_1.default.DIVISAO_INTEIRA_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Math.floor(Number(valorEsquerdo) / Number(valorDireito)); | ||
case delegua_1.default.MULTIPLICACAO: | ||
case delegua_1.default.MULTIPLICACAO_IGUAL: | ||
if (tipoEsquerdo === 'texto' || tipoDireito === 'texto') { | ||
// Sem ambos os valores resolvem como texto, multiplica normal. | ||
// Se apenas um resolve como texto, o outro repete o | ||
// texto n vezes, sendo n o valor do outro. | ||
if (tipoEsquerdo === 'texto' && tipoDireito === 'texto') { | ||
return Number(valorEsquerdo) * Number(valorDireito); | ||
} | ||
else { | ||
return String(valorEsquerdo) > String(valorDireito); | ||
if (tipoEsquerdo === 'texto') { | ||
return valorEsquerdo.repeat(Number(valorDireito)); | ||
} | ||
case delegua_1.default.MAIOR_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) >= Number(valorDireito); | ||
case delegua_1.default.MENOR: | ||
if (tipoEsquerdo === 'número' && tipoDireito === 'número') { | ||
return Number(valorEsquerdo) < Number(valorDireito); | ||
} | ||
else { | ||
return String(valorEsquerdo) < String(valorDireito); | ||
} | ||
case delegua_1.default.MENOR_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) <= Number(valorDireito); | ||
case delegua_1.default.SUBTRACAO: | ||
case delegua_1.default.MENOS_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) - Number(valorDireito); | ||
case delegua_1.default.ADICAO: | ||
case delegua_1.default.MAIS_IGUAL: | ||
if (['número', 'inteiro'].includes(tipoEsquerdo) && ['número', 'inteiro'].includes(tipoDireito)) { | ||
return Number(valorEsquerdo) + Number(valorDireito); | ||
} | ||
else { | ||
return String(valorEsquerdo) + String(valorDireito); | ||
} | ||
case delegua_1.default.DIVISAO: | ||
case delegua_1.default.DIVISAO_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) / Number(valorDireito); | ||
case delegua_1.default.DIVISAO_INTEIRA: | ||
case delegua_1.default.DIVISAO_INTEIRA_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Math.floor(Number(valorEsquerdo) / Number(valorDireito)); | ||
case delegua_1.default.MULTIPLICACAO: | ||
case delegua_1.default.MULTIPLICACAO_IGUAL: | ||
if (tipoEsquerdo === 'texto' || tipoDireito === 'texto') { | ||
// Sem ambos os valores resolvem como texto, multiplica normal. | ||
// Se apenas um resolve como texto, o outro repete o | ||
// texto n vezes, sendo n o valor do outro. | ||
if (tipoEsquerdo === 'texto' && tipoDireito === 'texto') { | ||
return Number(valorEsquerdo) * Number(valorDireito); | ||
} | ||
if (tipoEsquerdo === 'texto') { | ||
return valorEsquerdo.repeat(Number(valorDireito)); | ||
} | ||
return valorDireito.repeat(Number(valorEsquerdo)); | ||
} | ||
return Number(valorEsquerdo) * Number(valorDireito); | ||
case delegua_1.default.MODULO: | ||
case delegua_1.default.MODULO_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) % Number(valorDireito); | ||
case delegua_1.default.BIT_AND: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) & Number(valorDireito); | ||
case delegua_1.default.BIT_XOR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) ^ Number(valorDireito); | ||
case delegua_1.default.BIT_OR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) | Number(valorDireito); | ||
case delegua_1.default.MENOR_MENOR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) << Number(valorDireito); | ||
case delegua_1.default.MAIOR_MAIOR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) >> Number(valorDireito); | ||
case delegua_1.default.DIFERENTE: | ||
return !this.eIgual(valorEsquerdo, valorDireito); | ||
case delegua_1.default.IGUAL_IGUAL: | ||
return this.eIgual(valorEsquerdo, valorDireito); | ||
} | ||
return valorDireito.repeat(Number(valorEsquerdo)); | ||
} | ||
return Number(valorEsquerdo) * Number(valorDireito); | ||
case delegua_1.default.MODULO: | ||
case delegua_1.default.MODULO_IGUAL: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) % Number(valorDireito); | ||
case delegua_1.default.BIT_AND: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) & Number(valorDireito); | ||
case delegua_1.default.BIT_XOR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) ^ Number(valorDireito); | ||
case delegua_1.default.BIT_OR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) | Number(valorDireito); | ||
case delegua_1.default.MENOR_MENOR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) << Number(valorDireito); | ||
case delegua_1.default.MAIOR_MAIOR: | ||
this.verificarOperandosNumeros(expressao.operador, esquerda, direita); | ||
return Number(valorEsquerdo) >> Number(valorDireito); | ||
case delegua_1.default.DIFERENTE: | ||
return !this.eIgual(valorEsquerdo, valorDireito); | ||
case delegua_1.default.IGUAL_IGUAL: | ||
return this.eIgual(valorEsquerdo, valorDireito); | ||
} | ||
catch (erro) { | ||
this.erros.push({ | ||
erroInterno: erro, | ||
linha: expressao.linha, | ||
hashArquivo: expressao.hashArquivo, | ||
}); | ||
return Promise.reject(erro); | ||
} | ||
} | ||
@@ -463,3 +465,2 @@ /** | ||
}); | ||
this.erros.push(erro); | ||
} | ||
@@ -483,3 +484,2 @@ } | ||
catch (erro) { | ||
console.log(erro); | ||
this.erros.push({ | ||
@@ -490,3 +490,2 @@ erroInterno: erro, | ||
}); | ||
this.erros.push(erro); | ||
} | ||
@@ -501,3 +500,3 @@ } | ||
const valor = await this.avaliar(expressao.valor); | ||
const valorResolvido = valor.hasOwnProperty('valor') ? valor.valor : valor; | ||
const valorResolvido = valor !== undefined && valor.hasOwnProperty('valor') ? valor.valor : valor; | ||
this.pilhaEscoposExecucao.atribuirVariavel(expressao.simbolo, valorResolvido); | ||
@@ -720,3 +719,3 @@ return valorResolvido; | ||
try { | ||
let sucesso = true; | ||
this.emDeclaracaoTente = true; | ||
try { | ||
@@ -726,3 +725,2 @@ valorRetorno = await this.executarBloco(declaracao.caminhoTente); | ||
catch (erro) { | ||
sucesso = false; | ||
if (declaracao.caminhoPegue !== null) { | ||
@@ -746,2 +744,3 @@ // `caminhoPegue` aqui pode ser um construto de função (se `pegue` tem parâmetros) | ||
valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente); | ||
this.emDeclaracaoTente = false; | ||
} | ||
@@ -1146,2 +1145,5 @@ return valorRetorno; | ||
return objeto.valor.paraTexto(); | ||
// TODO: Idealmente isso deveria devolver um texto estruturado representando o objeto. | ||
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse) | ||
return objeto.toString(); | ||
if (typeof objeto === 'object') | ||
@@ -1188,7 +1190,9 @@ return JSON.stringify(objeto); | ||
const declaracaoAtual = ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]; | ||
this.erros.push({ | ||
erroInterno: erro, | ||
linha: declaracaoAtual.linha, | ||
hashArquivo: declaracaoAtual.hashArquivo, | ||
}); | ||
if (!this.emDeclaracaoTente) { | ||
this.erros.push({ | ||
erroInterno: erro, | ||
linha: declaracaoAtual.linha, | ||
hashArquivo: declaracaoAtual.hashArquivo, | ||
}); | ||
} | ||
return Promise.reject(erro); | ||
@@ -1214,2 +1218,3 @@ } | ||
this.erros = []; | ||
this.emDeclaracaoTente = false; | ||
const escopoExecucao = { | ||
@@ -1216,0 +1221,0 @@ declaracoes: declaracoes, |
{ | ||
"name": "@designliquido/delegua", | ||
"version": "0.26.3", | ||
"version": "0.27.0", | ||
"description": "Linguagem de programação simples e moderna usando português estruturado, com suporte a múltiplos dialetos", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
3066582
45391
2