New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@designliquido/delegua

Package Overview
Dependencies
Maintainers
3
Versions
271
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@designliquido/delegua - npm Package Compare versions

Comparing version 0.26.3 to 0.27.0

fontes/interfaces/erros/diagnostico-analisador-semantico.d.ts

2

bin/package.json
{
"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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc