@designliquido/delegua 1.17.1 → 1.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,7 +54,7 @@ export declare class InterpretadorEguaClassico implements InterpretadorInterface
54
54
  visitarExpressaoFormatacaoEscrita(declaracao: FormatacaoEscrita): never;
55
55
  visitarDeclaracaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): never;
56
56
  visitarExpressaoLeia(expressao: Leia): Promise<any>;
57
- visitarExpressaoLiteral(expressao: Literal): Promise<import("../../../construtos").ValorLiteral>;
57
+ visitarExpressaoLiteral(expressao: Literal): Promise<import("../../..").ValorLiteral>;
58
58
  avaliar(expressao: Construto | Declaracao): VariavelInterface | any;
59
59
  visitarExpressaoAgrupamento(expressao: any): any;
60
60
  eVerdadeiro(objeto: any): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@designliquido/delegua",
3
- "version": "1.17.1",
3
+ "version": "1.17.2",
4
4
  "description": "Linguagem de programação simples e moderna usando português estruturado.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -107,7 +107,7 @@
107
107
  "ts-jest": "^29.3.0",
108
108
  "ts-node": "^10.9.2",
109
109
  "typedoc": "^0.28.1",
110
- "typescript": "^5.8.2"
110
+ "typescript": "^6.0.2"
111
111
  },
112
112
  "dependencies": {
113
113
  "antlr4ts": "^0.5.0-alpha.4",
package/umd/delegua.js CHANGED
@@ -641,10 +641,16 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
641
641
  }
642
642
  visitarChamadaPorVariavel(entidadeChamadaVariavel, argumentos) {
643
643
  const variavel = entidadeChamadaVariavel;
644
- const funcaoChamada = this.gerenciadorEscopos.buscar(variavel.simbolo.lexema) ||
645
- this.funcoes[variavel.simbolo.lexema];
644
+ const nomeFuncao = variavel.simbolo.lexema;
645
+ const funcoesNativas = ['inteiro', 'real', 'numero', 'número', 'texto', 'leia', 'escreva', 'tipo'];
646
+ const pareceSerClasse = nomeFuncao[0] === nomeFuncao[0].toUpperCase();
647
+ if (funcoesNativas.includes(nomeFuncao) || pareceSerClasse) {
648
+ return Promise.resolve();
649
+ }
650
+ const funcaoChamada = this.gerenciadorEscopos.buscar(nomeFuncao) ||
651
+ this.funcoes[nomeFuncao];
646
652
  if (!funcaoChamada) {
647
- this.erro(entidadeChamadaVariavel.simbolo, `Chamada da função '${entidadeChamadaVariavel.simbolo.lexema}' não existe.`);
653
+ this.erro(entidadeChamadaVariavel.simbolo, `Chamada da função '${nomeFuncao}' não existe.`);
648
654
  return Promise.resolve();
649
655
  }
650
656
  const funcao = funcaoChamada.valor;
@@ -3386,6 +3392,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3386
3392
  const caminhoFazer = await this.declaracaoBloco();
3387
3393
  this.consumir(delegua_2.default.ENQUANTO, "Esperado declaração do 'enquanto' após o escopo do 'fazer'.");
3388
3394
  const condicaoEnquanto = await this.expressao();
3395
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
3389
3396
  return {
3390
3397
  caminhoFazer,
3391
3398
  condicaoEnquanto,
@@ -6188,6 +6195,37 @@ class AvaliadorSintaticoPitugues {
6188
6195
  }
6189
6196
  return false;
6190
6197
  }
6198
+ /**
6199
+ * Transforma uma string com interpolações (f-string) em código equivalente usando o método formatar.
6200
+ * Exemplo: f"Olá {nome}, você tem {idade} anos" -> "Olá " + nome + " você tem " + idade + " anos"
6201
+ * Com formatadores: f"{valor:.2f}" -> "" + "{:.2f}".formatar(valor) + ""
6202
+ * Com depuração: f"{usuario=}" -> "" + "{usuario=}".formatar(usuario) + ""
6203
+ */
6204
+ transformarInterpolacaoEmFormatacao(conteudoOriginal) {
6205
+ const ehDepuracao = (mioloLimpo) => {
6206
+ return mioloLimpo.endsWith('=') && !/^(?:[!=<>]=|[<>])$/.test(mioloLimpo.slice(-2));
6207
+ };
6208
+ const processarParte = (_, miolo) => {
6209
+ const mioloLimpo = miolo.trimEnd();
6210
+ // Modo depuração: {expressao=}
6211
+ if (ehDepuracao(mioloLimpo)) {
6212
+ const expressao = mioloLimpo.slice(0, -1).trim();
6213
+ return `" + "{${miolo}}".formatar(${expressao}) + "`;
6214
+ }
6215
+ // Modo formatação: {expressao:formato}
6216
+ if (mioloLimpo.includes(':')) {
6217
+ const [variavel, formato] = mioloLimpo
6218
+ .split(':')
6219
+ .map(s => s.trim());
6220
+ if (variavel) {
6221
+ return `" + "{:${formato}}".formatar(${variavel}) + "`;
6222
+ }
6223
+ }
6224
+ // Interpolação simples: {expressao}
6225
+ return `" + (${miolo}) + "`;
6226
+ };
6227
+ return '"' + conteudoOriginal.replace(/\{(.*?)\}/g, processarParte) + '"';
6228
+ }
6191
6229
  async primario() {
6192
6230
  const simboloAtual = this.simbolos[this.atual];
6193
6231
  switch (simboloAtual.tipo) {
@@ -6302,19 +6340,8 @@ class AvaliadorSintaticoPitugues {
6302
6340
  case pitugues_2.default.INTERPOLACAO:
6303
6341
  const simboloInterpolacao = this.avancarEDevolverAnterior();
6304
6342
  const conteudoOriginal = simboloInterpolacao.literal;
6305
- const codigoTransformado = '"' +
6306
- conteudoOriginal.replace(/\{(.*?)\}/g, (_, miolo) => {
6307
- // 'miolo' é o texto que estava dentro das chaves. Ex: "valor" ou "valor:.2f"
6308
- if (miolo.includes(':')) {
6309
- const [variavel, formato] = miolo.split(':').map((s) => s.trim());
6310
- if (variavel !== '') {
6311
- // Transforma {valor:.2f} em "{:.2f}".formatar(valor)
6312
- return '" + "{:' + formato + '}".formatar(' + variavel + ') + "';
6313
- }
6314
- }
6315
- return '" + (' + miolo.trim() + ') + "';
6316
- }) +
6317
- '"';
6343
+ const codigoTransformado = this
6344
+ .transformarInterpolacaoEmFormatacao(conteudoOriginal);
6318
6345
  const microLexador = new micro_lexador_pitugues_1.MicroLexadorPitugues();
6319
6346
  const retornoMicroLexador = microLexador.mapear(codigoTransformado);
6320
6347
  const microAvaliadorSintatico = new micro_avaliador_sintatico_pitugues_1.MicroAvaliadorSintaticoPitugues();