@designliquido/delegua 1.15.0 → 1.15.1
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.
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +1 -0
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +18 -0
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +13 -3
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts +10 -3
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +279 -57
- package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
- package/bibliotecas/dialetos/prisma/biblioteca-global.d.ts +10 -0
- package/bibliotecas/dialetos/prisma/biblioteca-global.d.ts.map +1 -0
- package/bibliotecas/dialetos/prisma/biblioteca-global.js +224 -0
- package/bibliotecas/dialetos/prisma/biblioteca-global.js.map +1 -0
- package/bin/package.json +1 -1
- package/interpretador/dialetos/index.d.ts +1 -0
- package/interpretador/dialetos/index.d.ts.map +1 -1
- package/interpretador/dialetos/index.js +1 -0
- package/interpretador/dialetos/index.js.map +1 -1
- package/interpretador/dialetos/prisma/index.d.ts +2 -0
- package/interpretador/dialetos/prisma/index.d.ts.map +1 -0
- package/interpretador/dialetos/prisma/index.js +18 -0
- package/interpretador/dialetos/prisma/index.js.map +1 -0
- package/interpretador/dialetos/prisma/interpretador-prisma.d.ts +13 -0
- package/interpretador/dialetos/prisma/interpretador-prisma.d.ts.map +1 -0
- package/interpretador/dialetos/prisma/interpretador-prisma.js +49 -0
- package/interpretador/dialetos/prisma/interpretador-prisma.js.map +1 -0
- package/lexador/dialetos/lexador-prisma.d.ts.map +1 -1
- package/lexador/dialetos/lexador-prisma.js +24 -6
- package/lexador/dialetos/lexador-prisma.js.map +1 -1
- package/lexador/dialetos/palavras-reservadas/prisma.d.ts +3 -0
- package/lexador/dialetos/palavras-reservadas/prisma.d.ts.map +1 -1
- package/lexador/dialetos/palavras-reservadas/prisma.js +3 -0
- package/lexador/dialetos/palavras-reservadas/prisma.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +55 -4
- package/lexador/lexador.js.map +1 -1
- package/package.json +1 -1
- package/tipos-de-simbolos/prisma.d.ts +4 -0
- package/tipos-de-simbolos/prisma.d.ts.map +1 -1
- package/tipos-de-simbolos/prisma.js +4 -0
- package/tipos-de-simbolos/prisma.js.map +1 -1
- package/tradutores/tradutor-assemblyscript.d.ts +2 -0
- package/tradutores/tradutor-assemblyscript.d.ts.map +1 -1
- package/tradutores/tradutor-assemblyscript.js +63 -0
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/umd/delegua.js +442 -71
package/umd/delegua.js
CHANGED
|
@@ -6284,7 +6284,7 @@ class AvaliadorSintaticoPitugues {
|
|
|
6284
6284
|
while (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SE)) {
|
|
6285
6285
|
const operador = this.simbolos[this.atual - 1];
|
|
6286
6286
|
const expressaoOuCondicao = await this.seTernario();
|
|
6287
|
-
this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
|
|
6287
|
+
this.consumir(pitugues_2.default.SENAO, `Esperado 'senão' ou 'senao' após caminho positivo em se ternário. Atual:
|
|
6288
6288
|
${this.simbolos[this.atual].lexema}.`);
|
|
6289
6289
|
const expressaoSenao = await this.seTernario();
|
|
6290
6290
|
expressaoEntao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, expressaoEntao, operador, expressaoSenao);
|
|
@@ -6554,10 +6554,20 @@ class AvaliadorSintaticoPitugues {
|
|
|
6554
6554
|
}
|
|
6555
6555
|
async declaracaoSe() {
|
|
6556
6556
|
const condicao = await this.expressao();
|
|
6557
|
-
|
|
6557
|
+
this.consumir(pitugues_2.default.DOIS_PONTOS, "Esperado ':' após condição do 'se'.");
|
|
6558
|
+
const simboloColonEntao = this.simboloAnterior();
|
|
6559
|
+
const caminhoEntao = new declaracoes_1.Bloco(simboloColonEntao.hashArquivo, Number(simboloColonEntao.linha), await this.blocoEscopo());
|
|
6558
6560
|
let caminhoSenao = null;
|
|
6559
6561
|
if (this.verificarSeSimboloAtualEIgualA(pitugues_2.default.SENAO, pitugues_2.default.SENÃO)) {
|
|
6560
|
-
|
|
6562
|
+
if (this.verificarTipoSimboloAtual(pitugues_2.default.SE)) {
|
|
6563
|
+
// 'senao se' - encadeamento de condicionais, sem dois-pontos
|
|
6564
|
+
caminhoSenao = await this.resolverDeclaracao();
|
|
6565
|
+
}
|
|
6566
|
+
else {
|
|
6567
|
+
this.consumir(pitugues_2.default.DOIS_PONTOS, "Esperado ':' após 'senao'.");
|
|
6568
|
+
const simboloColonSenao = this.simboloAnterior();
|
|
6569
|
+
caminhoSenao = new declaracoes_1.Bloco(simboloColonSenao.hashArquivo, Number(simboloColonSenao.linha), await this.blocoEscopo());
|
|
6570
|
+
}
|
|
6561
6571
|
}
|
|
6562
6572
|
return new declaracoes_1.Se(condicao, caminhoEntao, [], caminhoSenao);
|
|
6563
6573
|
}
|
|
@@ -7400,6 +7410,7 @@ const browser_process_hrtime_1 = __importDefault(require("browser-process-hrtime
|
|
|
7400
7410
|
const construtos_1 = require("../../construtos");
|
|
7401
7411
|
const declaracoes_1 = require("../../declaracoes");
|
|
7402
7412
|
const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
|
|
7413
|
+
const erro_avaliador_sintatico_1 = require("../erro-avaliador-sintatico");
|
|
7403
7414
|
const inferenciador_1 = require("../../inferenciador");
|
|
7404
7415
|
const pilha_escopos_1 = require("../pilha-escopos");
|
|
7405
7416
|
const informacao_escopo_1 = require("../informacao-escopo");
|
|
@@ -7484,6 +7495,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7484
7495
|
return false;
|
|
7485
7496
|
}
|
|
7486
7497
|
async primario() {
|
|
7498
|
+
var _a;
|
|
7487
7499
|
const simboloAtual = this.simbolos[this.atual];
|
|
7488
7500
|
let valores = [];
|
|
7489
7501
|
switch (simboloAtual.tipo) {
|
|
@@ -7505,10 +7517,16 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7505
7517
|
}
|
|
7506
7518
|
let indice = 1;
|
|
7507
7519
|
do {
|
|
7508
|
-
let chave
|
|
7509
|
-
if (this.
|
|
7510
|
-
|
|
7511
|
-
//
|
|
7520
|
+
let chave;
|
|
7521
|
+
if (this.verificarTipoSimboloAtual(prisma_1.default.IDENTIFICADOR) &&
|
|
7522
|
+
((_a = this.simbolos[this.atual + 1]) === null || _a === void 0 ? void 0 : _a.tipo) === prisma_1.default.IGUAL) {
|
|
7523
|
+
// Chave nomeada: {nome = "João"}
|
|
7524
|
+
const chaveIdentificador = this.avancarEDevolverAnterior();
|
|
7525
|
+
this.avancarEDevolverAnterior(); // consume IGUAL
|
|
7526
|
+
chave = new construtos_1.Literal(this.hashArquivo, simboloAtual.linha, chaveIdentificador.lexema);
|
|
7527
|
+
}
|
|
7528
|
+
else {
|
|
7529
|
+
chave = new construtos_1.Literal(this.hashArquivo, simboloAtual.linha, String(indice));
|
|
7512
7530
|
}
|
|
7513
7531
|
const valor = await this.ou();
|
|
7514
7532
|
chaves.push(chave);
|
|
@@ -7568,8 +7586,12 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7568
7586
|
}
|
|
7569
7587
|
throw this.erro(this.simbolos[this.atual], 'Esperado expressão.');
|
|
7570
7588
|
}
|
|
7571
|
-
expressaoImportar() {
|
|
7572
|
-
|
|
7589
|
+
async expressaoImportar() {
|
|
7590
|
+
this.avancarEDevolverAnterior();
|
|
7591
|
+
this.consumir(prisma_1.default.PARENTESE_ESQUERDO, "Esperado '(' após declaração.");
|
|
7592
|
+
const caminho = await this.expressao();
|
|
7593
|
+
this.consumir(prisma_1.default.PARENTESE_DIREITO, "Esperado ')' após declaração.");
|
|
7594
|
+
return new construtos_1.ImportarComoConstruto(caminho);
|
|
7573
7595
|
}
|
|
7574
7596
|
/**
|
|
7575
7597
|
* Construto para texto multilinhas.
|
|
@@ -7637,7 +7659,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7637
7659
|
return expressao;
|
|
7638
7660
|
}
|
|
7639
7661
|
async unario() {
|
|
7640
|
-
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.NEGACAO, prisma_1.default.SUBTRACAO, prisma_1.default.BIT_NOT)) {
|
|
7662
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.NEGACAO, prisma_1.default.SUBTRACAO, prisma_1.default.BIT_NOT, prisma_1.default.NAO, prisma_1.default.COMPRIMENTO)) {
|
|
7641
7663
|
const operador = this.simboloAnterior();
|
|
7642
7664
|
const direito = await this.unario();
|
|
7643
7665
|
return new construtos_1.Unario(this.hashArquivo, operador, direito);
|
|
@@ -7671,8 +7693,17 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7671
7693
|
}
|
|
7672
7694
|
return expressao;
|
|
7673
7695
|
}
|
|
7674
|
-
async
|
|
7696
|
+
async concatenacao() {
|
|
7675
7697
|
let expressao = await this.adicaoOuSubtracao();
|
|
7698
|
+
while (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CONCATENACAO)) {
|
|
7699
|
+
const operador = this.simboloAnterior();
|
|
7700
|
+
const direito = await this.adicaoOuSubtracao();
|
|
7701
|
+
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
7702
|
+
}
|
|
7703
|
+
return expressao;
|
|
7704
|
+
}
|
|
7705
|
+
async bitShift() {
|
|
7706
|
+
let expressao = await this.concatenacao();
|
|
7676
7707
|
while (this.verificarSeSimboloAtualEIgualA(prisma_1.default.MENOR_MENOR, prisma_1.default.MAIOR_MAIOR)) {
|
|
7677
7708
|
const operador = this.simboloAnterior();
|
|
7678
7709
|
const direito = await this.adicaoOuSubtracao();
|
|
@@ -7743,8 +7774,19 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7743
7774
|
}
|
|
7744
7775
|
return expressao;
|
|
7745
7776
|
}
|
|
7777
|
+
async ternario() {
|
|
7778
|
+
let expressaoOuCondicao = await this.ou();
|
|
7779
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.INTERROGACAO)) {
|
|
7780
|
+
const operador = this.simboloAnterior();
|
|
7781
|
+
const caminhoEntao = await this.e();
|
|
7782
|
+
this.consumir(prisma_1.default.OU, "Esperado palavra reservada 'ou' após caminho positivo em operador ternário.");
|
|
7783
|
+
const caminhoSenao = await this.ternario();
|
|
7784
|
+
expressaoOuCondicao = new construtos_1.SeTernario(this.hashArquivo, expressaoOuCondicao, caminhoEntao, operador, caminhoSenao);
|
|
7785
|
+
}
|
|
7786
|
+
return expressaoOuCondicao;
|
|
7787
|
+
}
|
|
7746
7788
|
async atribuir() {
|
|
7747
|
-
const expressao = await this.
|
|
7789
|
+
const expressao = await this.ternario();
|
|
7748
7790
|
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.IGUAL) ||
|
|
7749
7791
|
this.verificarSeSimboloAtualEIgualA(prisma_1.default.MAIS_IGUAL)) {
|
|
7750
7792
|
const igual = this.simboloAnterior();
|
|
@@ -7796,7 +7838,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7796
7838
|
}
|
|
7797
7839
|
this.consumir(prisma_1.default.FIM, "Esperado 'fim' após o bloco.");
|
|
7798
7840
|
this.pilhaEscopos.removerUltimo();
|
|
7799
|
-
return declaracoes;
|
|
7841
|
+
return declaracoes.filter((d) => d);
|
|
7800
7842
|
}
|
|
7801
7843
|
async declaracaoDeLocal() {
|
|
7802
7844
|
const identificador = this.consumir(prisma_1.default.IDENTIFICADOR, 'Esperado nome de variável.');
|
|
@@ -7821,6 +7863,65 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7821
7863
|
this.blocos -= 1;
|
|
7822
7864
|
}
|
|
7823
7865
|
}
|
|
7866
|
+
async declaracaoEscolha() {
|
|
7867
|
+
try {
|
|
7868
|
+
this.blocos += 1;
|
|
7869
|
+
const condicao = await this.expressao();
|
|
7870
|
+
const caminhos = [];
|
|
7871
|
+
let caminhoPadrao = null;
|
|
7872
|
+
while (!this.verificarTipoSimboloAtual(prisma_1.default.FIM) && !this.estaNoFinal()) {
|
|
7873
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CASO)) {
|
|
7874
|
+
const caminhoCondicoes = [await this.expressao()];
|
|
7875
|
+
while (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CASO)) {
|
|
7876
|
+
caminhoCondicoes.push(await this.expressao());
|
|
7877
|
+
}
|
|
7878
|
+
this.consumir(prisma_1.default.ENTAO, "Esperado palavra reservada 'entao' ou 'então' após valor do 'caso'.");
|
|
7879
|
+
const declaracoes = [];
|
|
7880
|
+
while (!this.estaNoFinal() &&
|
|
7881
|
+
![
|
|
7882
|
+
prisma_1.default.CASO,
|
|
7883
|
+
prisma_1.default.PADRAO,
|
|
7884
|
+
prisma_1.default.FIM,
|
|
7885
|
+
].includes(this.simbolos[this.atual].tipo)) {
|
|
7886
|
+
declaracoes.push(await this.resolverDeclaracaoForaDeBloco());
|
|
7887
|
+
}
|
|
7888
|
+
caminhos.push({
|
|
7889
|
+
condicoes: caminhoCondicoes,
|
|
7890
|
+
declaracoes: declaracoes.filter((d) => d),
|
|
7891
|
+
});
|
|
7892
|
+
}
|
|
7893
|
+
else if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.PADRAO)) {
|
|
7894
|
+
if (caminhoPadrao !== null) {
|
|
7895
|
+
const excecao = new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(this.simbolos[this.atual], "Você só pode ter um 'padrao' em cada declaração de 'escolha'.");
|
|
7896
|
+
this.erros.push(excecao);
|
|
7897
|
+
throw excecao;
|
|
7898
|
+
}
|
|
7899
|
+
this.consumir(prisma_1.default.ENTAO, "Esperado palavra reservada 'entao' ou 'então' após declaração do 'padrao'.");
|
|
7900
|
+
const declaracoes = [];
|
|
7901
|
+
while (!this.estaNoFinal() &&
|
|
7902
|
+
![
|
|
7903
|
+
prisma_1.default.CASO,
|
|
7904
|
+
prisma_1.default.PADRAO,
|
|
7905
|
+
prisma_1.default.FIM,
|
|
7906
|
+
].includes(this.simbolos[this.atual].tipo)) {
|
|
7907
|
+
declaracoes.push(await this.resolverDeclaracaoForaDeBloco());
|
|
7908
|
+
}
|
|
7909
|
+
caminhoPadrao = {
|
|
7910
|
+
condicoes: [],
|
|
7911
|
+
declaracoes: declaracoes.filter((d) => d),
|
|
7912
|
+
};
|
|
7913
|
+
}
|
|
7914
|
+
else {
|
|
7915
|
+
throw this.erro(this.simbolos[this.atual], "Esperado 'caso', 'padrao' ou 'fim' em declaração 'escolha'.");
|
|
7916
|
+
}
|
|
7917
|
+
}
|
|
7918
|
+
this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'escolha'.");
|
|
7919
|
+
return new declaracoes_1.Escolha(condicao, caminhos, caminhoPadrao);
|
|
7920
|
+
}
|
|
7921
|
+
finally {
|
|
7922
|
+
this.blocos -= 1;
|
|
7923
|
+
}
|
|
7924
|
+
}
|
|
7824
7925
|
async declaracaoSe() {
|
|
7825
7926
|
const simboloSe = this.simbolos[this.atual];
|
|
7826
7927
|
const condicao = await this.expressao();
|
|
@@ -7831,17 +7932,57 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7831
7932
|
} while (!this.estaNoFinal() &&
|
|
7832
7933
|
![prisma_1.default.SENAO, prisma_1.default.SENÃO, prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo));
|
|
7833
7934
|
let caminhoSenao = null;
|
|
7935
|
+
let fimConsumidoNoCaminhoSenao = false;
|
|
7834
7936
|
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.SENAO, prisma_1.default.SENÃO)) {
|
|
7835
7937
|
const simboloSenao = this.simbolos[this.atual - 1];
|
|
7836
|
-
|
|
7837
|
-
|
|
7838
|
-
|
|
7839
|
-
}
|
|
7840
|
-
|
|
7938
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.SE)) {
|
|
7939
|
+
caminhoSenao = await this.declaracaoSe();
|
|
7940
|
+
fimConsumidoNoCaminhoSenao = true;
|
|
7941
|
+
}
|
|
7942
|
+
else {
|
|
7943
|
+
const declaracoesSenao = [];
|
|
7944
|
+
do {
|
|
7945
|
+
declaracoesSenao.push(await this.resolverDeclaracaoForaDeBloco());
|
|
7946
|
+
} while (![prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo));
|
|
7947
|
+
caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
|
|
7948
|
+
}
|
|
7949
|
+
}
|
|
7950
|
+
if (!fimConsumidoNoCaminhoSenao) {
|
|
7951
|
+
this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'se'.");
|
|
7841
7952
|
}
|
|
7842
|
-
this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fimse' para fechamento de declaração 'se'.");
|
|
7843
7953
|
return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
|
|
7844
7954
|
}
|
|
7955
|
+
async declaracaoTente() {
|
|
7956
|
+
const simboloTente = this.simboloAnterior();
|
|
7957
|
+
const blocoTente = [];
|
|
7958
|
+
while (!this.estaNoFinal() &&
|
|
7959
|
+
![
|
|
7960
|
+
prisma_1.default.PEGUE,
|
|
7961
|
+
prisma_1.default.FINALMENTE,
|
|
7962
|
+
prisma_1.default.FIM,
|
|
7963
|
+
].includes(this.simbolos[this.atual].tipo)) {
|
|
7964
|
+
blocoTente.push(await this.resolverDeclaracaoForaDeBloco());
|
|
7965
|
+
}
|
|
7966
|
+
let blocoPegue = null;
|
|
7967
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.PEGUE)) {
|
|
7968
|
+
const declaracoesPegue = [];
|
|
7969
|
+
while (!this.estaNoFinal() &&
|
|
7970
|
+
![prisma_1.default.FINALMENTE, prisma_1.default.FIM].includes(this.simbolos[this.atual].tipo)) {
|
|
7971
|
+
declaracoesPegue.push(await this.resolverDeclaracaoForaDeBloco());
|
|
7972
|
+
}
|
|
7973
|
+
blocoPegue = declaracoesPegue.filter((d) => d);
|
|
7974
|
+
}
|
|
7975
|
+
let blocoFinalmente = null;
|
|
7976
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.FINALMENTE)) {
|
|
7977
|
+
const declaracoesFinalmente = [];
|
|
7978
|
+
while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(prisma_1.default.FIM)) {
|
|
7979
|
+
declaracoesFinalmente.push(await this.resolverDeclaracaoForaDeBloco());
|
|
7980
|
+
}
|
|
7981
|
+
blocoFinalmente = declaracoesFinalmente.filter((d) => d);
|
|
7982
|
+
}
|
|
7983
|
+
this.consumir(prisma_1.default.FIM, "Esperado palavra-chave 'fim' para fechamento de declaração 'tente'.");
|
|
7984
|
+
return new declaracoes_1.Tente(simboloTente.hashArquivo, Number(simboloTente.linha), blocoTente.filter((d) => d), blocoPegue, null, blocoFinalmente);
|
|
7985
|
+
}
|
|
7845
7986
|
async declaracaoQuebre() {
|
|
7846
7987
|
if (this.blocos < 1) {
|
|
7847
7988
|
throw this.erro(this.simboloAnterior(), "'quebre' deve estar dentro de um laço de repetição.");
|
|
@@ -7925,11 +8066,15 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7925
8066
|
return null;
|
|
7926
8067
|
case prisma_1.default.ENTAO:
|
|
7927
8068
|
case prisma_1.default.INICIO:
|
|
8069
|
+
case prisma_1.default.FAZER:
|
|
7928
8070
|
const simboloInicioBloco = this.avancarEDevolverAnterior();
|
|
7929
8071
|
return new declaracoes_1.Bloco(simboloInicioBloco.hashArquivo, Number(simboloInicioBloco.linha), await this.blocoEscopo());
|
|
7930
8072
|
case prisma_1.default.ENQUANTO:
|
|
7931
8073
|
this.avancarEDevolverAnterior();
|
|
7932
8074
|
return await this.declaracaoEnquanto();
|
|
8075
|
+
case prisma_1.default.ESCOLHA:
|
|
8076
|
+
this.avancarEDevolverAnterior();
|
|
8077
|
+
return await this.declaracaoEscolha();
|
|
7933
8078
|
case prisma_1.default.IDENTIFICADOR:
|
|
7934
8079
|
const proximoSimbolo = this.simbolos[this.atual + 1];
|
|
7935
8080
|
if (proximoSimbolo && proximoSimbolo.tipo === prisma_1.default.IGUAL) {
|
|
@@ -7951,6 +8096,9 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7951
8096
|
case prisma_1.default.RETORNE:
|
|
7952
8097
|
this.avancarEDevolverAnterior();
|
|
7953
8098
|
return await this.declaracaoRetorna();
|
|
8099
|
+
case prisma_1.default.TENTE:
|
|
8100
|
+
this.avancarEDevolverAnterior();
|
|
8101
|
+
return await this.declaracaoTente();
|
|
7954
8102
|
case prisma_1.default.LOCAL:
|
|
7955
8103
|
this.avancarEDevolverAnterior();
|
|
7956
8104
|
return await this.declaracaoDeLocal();
|
|
@@ -7993,20 +8141,40 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
7993
8141
|
console.log(inicializador.constructor.name);
|
|
7994
8142
|
}
|
|
7995
8143
|
}
|
|
8144
|
+
async declaracaoParaCada(simboloPara) {
|
|
8145
|
+
const variavelIteracao = this.consumir(prisma_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para cada'.");
|
|
8146
|
+
this.consumir(prisma_1.default.EM, "Esperado palavra reservada 'em' após variável de iteração.");
|
|
8147
|
+
const vetorOuDicionario = await this.expressao();
|
|
8148
|
+
this.consumir(prisma_1.default.INICIO, `espera-se 'inicio' proximo a '${this.simbolos[this.atual].lexema}'.`);
|
|
8149
|
+
this.pilhaEscopos.definirInformacoesVariavel(variavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(variavelIteracao.lexema, 'qualquer'));
|
|
8150
|
+
const declaracoesBlocoParaCada = [];
|
|
8151
|
+
while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(prisma_1.default.FIM)) {
|
|
8152
|
+
declaracoesBlocoParaCada.push(await this.resolverDeclaracaoForaDeBloco());
|
|
8153
|
+
}
|
|
8154
|
+
this.consumir(prisma_1.default.FIM, "Esperado 'fim' após bloco do para cada.");
|
|
8155
|
+
const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoParaCada.filter((d) => d));
|
|
8156
|
+
return new declaracoes_1.ParaCada(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'qualquer'), vetorOuDicionario, corpo);
|
|
8157
|
+
}
|
|
7996
8158
|
async declaracaoPara() {
|
|
7997
8159
|
try {
|
|
7998
8160
|
this.blocos += 1;
|
|
7999
8161
|
const simboloPara = this.avancarEDevolverAnterior();
|
|
8162
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CADA)) {
|
|
8163
|
+
return await this.declaracaoParaCada(simboloPara);
|
|
8164
|
+
}
|
|
8000
8165
|
const variavelIteracao = this.consumir(prisma_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
|
|
8001
8166
|
this.consumir(prisma_1.default.IGUAL, `'=' or 'em' esperado próximo a '${this.simbolos[this.atual].lexema}'.`);
|
|
8002
8167
|
const literalOuVariavelInicio = await this.adicaoOuSubtracao();
|
|
8003
8168
|
this.consumir(prisma_1.default.VIRGULA, `Espera-se '=' próximo a '${this.simbolos[this.atual].lexema}'.`);
|
|
8004
8169
|
const literalOuVariavelFim = await this.adicaoOuSubtracao();
|
|
8005
8170
|
let operadorCondicao = new lexador_1.Simbolo(prisma_1.default.MENOR_IGUAL, '<=', null, Number(simboloPara.linha), this.hashArquivo);
|
|
8006
|
-
let operadorCondicaoIncremento = new lexador_1.Simbolo(prisma_1.default.MENOR, '<', null, Number(simboloPara.linha), this.hashArquivo);
|
|
8007
8171
|
let passo = new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1);
|
|
8008
|
-
|
|
8009
|
-
|
|
8172
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.VIRGULA)) {
|
|
8173
|
+
passo = await this.adicaoOuSubtracao();
|
|
8174
|
+
}
|
|
8175
|
+
if (!this.verificarSeSimboloAtualEIgualA(prisma_1.default.INICIO, prisma_1.default.FAZER)) {
|
|
8176
|
+
throw this.erro(this.simbolos[this.atual], `espera-se 'inicio' ou 'fazer' proximo a '${this.simbolos[this.atual].lexema}'.`);
|
|
8177
|
+
}
|
|
8010
8178
|
// Aqui já é seguro inicializar a variável.
|
|
8011
8179
|
this.pilhaEscopos.definirInformacoesVariavel(variavelIteracao.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(variavelIteracao.lexema, 'inteiro'));
|
|
8012
8180
|
const declaracoesBlocoPara = [];
|
|
@@ -8018,14 +8186,12 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
8018
8186
|
this.avancarEDevolverAnterior(); // fim
|
|
8019
8187
|
const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
|
|
8020
8188
|
const para = new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha),
|
|
8021
|
-
// Inicialização.
|
|
8022
|
-
new declaracoes_1.
|
|
8189
|
+
// Inicialização: declara a variável de iteração.
|
|
8190
|
+
new declaracoes_1.Var(variavelIteracao, literalOuVariavelInicio, 'inteiro'),
|
|
8023
8191
|
// Condição.
|
|
8024
8192
|
new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), operadorCondicao, literalOuVariavelFim),
|
|
8025
|
-
// Incremento
|
|
8026
|
-
new construtos_1.
|
|
8027
|
-
para.blocoPosExecucao = corpo;
|
|
8028
|
-
para.resolverIncrementoEmExecucao = resolverIncrementoEmExecucao;
|
|
8193
|
+
// Incremento simples.
|
|
8194
|
+
new construtos_1.Atribuir(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao, 'inteiro'), new lexador_1.Simbolo(prisma_1.default.ADICAO, '+', null, Number(simboloPara.linha), this.hashArquivo), passo)), corpo);
|
|
8029
8195
|
return para;
|
|
8030
8196
|
}
|
|
8031
8197
|
finally {
|
|
@@ -8050,6 +8216,48 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
8050
8216
|
return null;
|
|
8051
8217
|
}
|
|
8052
8218
|
}
|
|
8219
|
+
async metodoClassePrisma(construtor) {
|
|
8220
|
+
const simbolo = construtor
|
|
8221
|
+
? new lexador_1.Simbolo(prisma_1.default.CONSTRUTOR, 'construtor', null, Number(this.simboloAnterior().linha), this.hashArquivo)
|
|
8222
|
+
: this.consumir(prisma_1.default.IDENTIFICADOR, 'Esperado nome do método.');
|
|
8223
|
+
this.consumir(prisma_1.default.PARENTESE_ESQUERDO, "Esperado '(' após nome do método.");
|
|
8224
|
+
let parametros = [];
|
|
8225
|
+
if (!this.verificarTipoSimboloAtual(prisma_1.default.PARENTESE_DIREITO)) {
|
|
8226
|
+
parametros = await this.logicaComumParametros();
|
|
8227
|
+
}
|
|
8228
|
+
this.consumir(prisma_1.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
|
|
8229
|
+
this.consumir(prisma_1.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do método.");
|
|
8230
|
+
const declaracoesCorpo = [];
|
|
8231
|
+
while (!this.estaNoFinal() && !this.verificarTipoSimboloAtual(prisma_1.default.CHAVE_DIREITA)) {
|
|
8232
|
+
declaracoesCorpo.push(await this.resolverDeclaracaoForaDeBloco());
|
|
8233
|
+
}
|
|
8234
|
+
this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após o corpo do método.");
|
|
8235
|
+
const corpoDaFuncao = new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simbolo.linha), parametros, declaracoesCorpo.filter((d) => d), 'qualquer', false);
|
|
8236
|
+
const tipoDaFuncao = `função<${corpoDaFuncao.tipo}>`;
|
|
8237
|
+
return new declaracoes_1.FuncaoDeclaracao(simbolo, corpoDaFuncao, tipoDaFuncao);
|
|
8238
|
+
}
|
|
8239
|
+
propriedadesDeclaradasEmMetodo(metodo) {
|
|
8240
|
+
const propriedades = [];
|
|
8241
|
+
const nomesPropriedades = new Set();
|
|
8242
|
+
for (const declaracao of metodo.funcao.corpo) {
|
|
8243
|
+
if (!(declaracao instanceof declaracoes_1.Expressao)) {
|
|
8244
|
+
continue;
|
|
8245
|
+
}
|
|
8246
|
+
if (!(declaracao.expressao instanceof construtos_1.DefinirValor)) {
|
|
8247
|
+
continue;
|
|
8248
|
+
}
|
|
8249
|
+
if (!(declaracao.expressao.objeto instanceof construtos_1.Isto)) {
|
|
8250
|
+
continue;
|
|
8251
|
+
}
|
|
8252
|
+
const nomePropriedade = declaracao.expressao.nome.lexema;
|
|
8253
|
+
if (nomesPropriedades.has(nomePropriedade)) {
|
|
8254
|
+
continue;
|
|
8255
|
+
}
|
|
8256
|
+
nomesPropriedades.add(nomePropriedade);
|
|
8257
|
+
propriedades.push(new declaracoes_1.PropriedadeClasse(declaracao.expressao.nome, 'qualquer'));
|
|
8258
|
+
}
|
|
8259
|
+
return propriedades;
|
|
8260
|
+
}
|
|
8053
8261
|
async declaracaoDeClasse() {
|
|
8054
8262
|
const simbolo = this.consumir(prisma_1.default.IDENTIFICADOR, 'Esperado nome da classe.');
|
|
8055
8263
|
let superClasse = null;
|
|
@@ -8065,47 +8273,71 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
8065
8273
|
(this.verificarTipoSimboloAtual(prisma_1.default.CONSTRUTOR) ||
|
|
8066
8274
|
this.verificarTipoSimboloAtual(prisma_1.default.FUNCAO) ||
|
|
8067
8275
|
this.verificarTipoSimboloAtual(prisma_1.default.FUNÇÃO))) {
|
|
8068
|
-
|
|
8069
|
-
|
|
8276
|
+
if (this.verificarSeSimboloAtualEIgualA(prisma_1.default.CONSTRUTOR)) {
|
|
8277
|
+
metodos.push(await this.metodoClassePrisma(true));
|
|
8278
|
+
continue;
|
|
8279
|
+
}
|
|
8280
|
+
this.verificarSeSimboloAtualEIgualA(prisma_1.default.FUNCAO, prisma_1.default.FUNÇÃO);
|
|
8281
|
+
metodos.push(await this.metodoClassePrisma(false));
|
|
8070
8282
|
}
|
|
8071
8283
|
this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após métodos da classe.");
|
|
8284
|
+
const propriedades = [];
|
|
8285
|
+
const nomesPropriedades = new Set();
|
|
8286
|
+
for (const metodo of metodos) {
|
|
8287
|
+
const propriedadesDoMetodo = this.propriedadesDeclaradasEmMetodo(metodo);
|
|
8288
|
+
for (const propriedade of propriedadesDoMetodo) {
|
|
8289
|
+
if (nomesPropriedades.has(propriedade.nome.lexema)) {
|
|
8290
|
+
continue;
|
|
8291
|
+
}
|
|
8292
|
+
nomesPropriedades.add(propriedade.nome.lexema);
|
|
8293
|
+
propriedades.push(propriedade);
|
|
8294
|
+
}
|
|
8295
|
+
}
|
|
8072
8296
|
this.superclasseAtual = undefined;
|
|
8073
|
-
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos);
|
|
8297
|
+
const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos, propriedades);
|
|
8074
8298
|
this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
|
|
8075
8299
|
return definicaoClasse;
|
|
8076
8300
|
}
|
|
8077
8301
|
inicializarPilhaEscopos() {
|
|
8078
8302
|
this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
|
|
8079
8303
|
this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
|
|
8080
|
-
//
|
|
8081
|
-
|
|
8082
|
-
|
|
8083
|
-
new InformacaoElementoSintatico('
|
|
8084
|
-
);
|
|
8085
|
-
this.pilhaEscopos.definirInformacoesVariavel(
|
|
8086
|
-
'
|
|
8087
|
-
|
|
8088
|
-
|
|
8089
|
-
|
|
8090
|
-
);
|
|
8091
|
-
this.pilhaEscopos.definirInformacoesVariavel(
|
|
8092
|
-
'
|
|
8093
|
-
|
|
8094
|
-
|
|
8095
|
-
|
|
8096
|
-
);
|
|
8097
|
-
this.pilhaEscopos.definirInformacoesVariavel(
|
|
8098
|
-
'
|
|
8099
|
-
|
|
8100
|
-
|
|
8101
|
-
|
|
8102
|
-
);
|
|
8103
|
-
this.pilhaEscopos.definirInformacoesVariavel(
|
|
8104
|
-
|
|
8105
|
-
new InformacaoElementoSintatico('
|
|
8106
|
-
|
|
8107
|
-
|
|
8108
|
-
|
|
8304
|
+
// Registrar funções nativas (built-ins) do Prisma no escopo do parser
|
|
8305
|
+
// para evitar erros de variável não definida durante análise semântica
|
|
8306
|
+
this.pilhaEscopos.definirInformacoesVariavel('tipo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tipo', 'função', true, [
|
|
8307
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
8308
|
+
]));
|
|
8309
|
+
this.pilhaEscopos.definirInformacoesVariavel('poe', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('poe', 'função', true, [
|
|
8310
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valores', 'qualquer'),
|
|
8311
|
+
]));
|
|
8312
|
+
this.pilhaEscopos.definirInformacoesVariavel('tamanho', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tamanho', 'número', true, [
|
|
8313
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('objeto', 'qualquer'),
|
|
8314
|
+
]));
|
|
8315
|
+
this.pilhaEscopos.definirInformacoesVariavel('pares', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('pares', 'tabela', true, [
|
|
8316
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tabela', 'tabela'),
|
|
8317
|
+
]));
|
|
8318
|
+
this.pilhaEscopos.definirInformacoesVariavel('ipares', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('ipares', 'tabela', true, [
|
|
8319
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tabela', 'tabela'),
|
|
8320
|
+
]));
|
|
8321
|
+
this.pilhaEscopos.definirInformacoesVariavel('convnumero', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('convnumero', 'número', true, [
|
|
8322
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
8323
|
+
]));
|
|
8324
|
+
this.pilhaEscopos.definirInformacoesVariavel('convstring', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('convstring', 'texto', true, [
|
|
8325
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
|
|
8326
|
+
]));
|
|
8327
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'função', true, []));
|
|
8328
|
+
this.pilhaEscopos.definirInformacoesVariavel('aleatorio_entre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio_entre', 'número', true, [
|
|
8329
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
|
|
8330
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
|
|
8331
|
+
]));
|
|
8332
|
+
this.pilhaEscopos.definirInformacoesVariavel('coletelixo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('coletelixo', 'número', true, [
|
|
8333
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('acao', 'texto'),
|
|
8334
|
+
]));
|
|
8335
|
+
this.pilhaEscopos.definirInformacoesVariavel('piso', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('piso', 'número', true, [
|
|
8336
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('n', 'número'),
|
|
8337
|
+
]));
|
|
8338
|
+
this.pilhaEscopos.definirInformacoesVariavel('teto', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('teto', 'número', true, [
|
|
8339
|
+
new informacao_elemento_sintatico_1.InformacaoElementoSintatico('n', 'número'),
|
|
8340
|
+
]));
|
|
8109
8341
|
}
|
|
8110
8342
|
async analisar(retornoLexador, hashArquivo) {
|
|
8111
8343
|
const inicioAnalise = (0, browser_process_hrtime_1.default)();
|
|
@@ -8138,7 +8370,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
|
|
|
8138
8370
|
}
|
|
8139
8371
|
exports.AvaliadorSintaticoPrisma = AvaliadorSintaticoPrisma;
|
|
8140
8372
|
|
|
8141
|
-
},{"../../bibliotecas/primitivas-dicionario":29,"../../bibliotecas/primitivas-numero":30,"../../bibliotecas/primitivas-texto":31,"../../bibliotecas/primitivas-vetor":32,"../../construtos":62,"../../declaracoes":110,"../../inferenciador":137,"../../informacao-elemento-sintatico":138,"../../lexador":207,"../../tipos-de-simbolos/prisma":228,"../avaliador-sintatico-base":9,"../comum":11,"../informacao-escopo":22,"../pilha-escopos":26,"browser-process-hrtime":415}],16:[function(require,module,exports){
|
|
8373
|
+
},{"../../bibliotecas/primitivas-dicionario":29,"../../bibliotecas/primitivas-numero":30,"../../bibliotecas/primitivas-texto":31,"../../bibliotecas/primitivas-vetor":32,"../../construtos":62,"../../declaracoes":110,"../../inferenciador":137,"../../informacao-elemento-sintatico":138,"../../lexador":207,"../../tipos-de-simbolos/prisma":228,"../avaliador-sintatico-base":9,"../comum":11,"../erro-avaliador-sintatico":20,"../informacao-escopo":22,"../pilha-escopos":26,"browser-process-hrtime":415}],16:[function(require,module,exports){
|
|
8142
8374
|
"use strict";
|
|
8143
8375
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8144
8376
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -24474,7 +24706,17 @@ class LexadorPrisma {
|
|
|
24474
24706
|
this.avancar();
|
|
24475
24707
|
break;
|
|
24476
24708
|
case '.':
|
|
24477
|
-
this.
|
|
24709
|
+
this.avancar();
|
|
24710
|
+
if (this.simboloAtual() === '.') {
|
|
24711
|
+
this.avancar();
|
|
24712
|
+
this.adicionarSimbolo(prisma_2.default.CONCATENACAO);
|
|
24713
|
+
}
|
|
24714
|
+
else {
|
|
24715
|
+
this.adicionarSimbolo(prisma_2.default.PONTO);
|
|
24716
|
+
}
|
|
24717
|
+
break;
|
|
24718
|
+
case '#':
|
|
24719
|
+
this.adicionarSimbolo(prisma_2.default.COMPRIMENTO);
|
|
24478
24720
|
this.avancar();
|
|
24479
24721
|
break;
|
|
24480
24722
|
case ';':
|
|
@@ -24485,6 +24727,10 @@ class LexadorPrisma {
|
|
|
24485
24727
|
this.adicionarSimbolo(prisma_2.default.DOIS_PONTOS);
|
|
24486
24728
|
this.avancar();
|
|
24487
24729
|
break;
|
|
24730
|
+
case '?':
|
|
24731
|
+
this.adicionarSimbolo(prisma_2.default.INTERROGACAO);
|
|
24732
|
+
this.avancar();
|
|
24733
|
+
break;
|
|
24488
24734
|
case '=':
|
|
24489
24735
|
this.avancar();
|
|
24490
24736
|
if (this.simboloAtual() === '=') {
|
|
@@ -24566,10 +24812,8 @@ class LexadorPrisma {
|
|
|
24566
24812
|
case '/':
|
|
24567
24813
|
this.avancar();
|
|
24568
24814
|
if (this.simboloAtual() === '/') {
|
|
24569
|
-
// Comentário de linha
|
|
24570
|
-
|
|
24571
|
-
this.avancar();
|
|
24572
|
-
}
|
|
24815
|
+
// Comentário de linha — ignorar até o final da linha
|
|
24816
|
+
this.atual = this.codigo[this.linha].length;
|
|
24573
24817
|
}
|
|
24574
24818
|
else if (this.simboloAtual() === '*') {
|
|
24575
24819
|
// Comentário de bloco
|
|
@@ -24604,8 +24848,14 @@ class LexadorPrisma {
|
|
|
24604
24848
|
this.avancar();
|
|
24605
24849
|
break;
|
|
24606
24850
|
case '~':
|
|
24607
|
-
this.adicionarSimbolo(prisma_2.default.BIT_NOT);
|
|
24608
24851
|
this.avancar();
|
|
24852
|
+
if (this.simboloAtual() === '=') {
|
|
24853
|
+
this.adicionarSimbolo(prisma_2.default.DIFERENTE);
|
|
24854
|
+
this.avancar();
|
|
24855
|
+
}
|
|
24856
|
+
else {
|
|
24857
|
+
this.adicionarSimbolo(prisma_2.default.BIT_XOR);
|
|
24858
|
+
}
|
|
24609
24859
|
break;
|
|
24610
24860
|
case '"':
|
|
24611
24861
|
this.avancar();
|
|
@@ -25271,6 +25521,8 @@ exports.palavrasReservadas = {
|
|
|
25271
25521
|
leia: prisma_1.default.LEIA,
|
|
25272
25522
|
local: prisma_1.default.LOCAL,
|
|
25273
25523
|
nulo: prisma_1.default.NULO,
|
|
25524
|
+
nao: prisma_1.default.NAO,
|
|
25525
|
+
não: prisma_1.default.NAO,
|
|
25274
25526
|
ou: prisma_1.default.OU,
|
|
25275
25527
|
padrao: prisma_1.default.PADRAO,
|
|
25276
25528
|
padrão: prisma_1.default.PADRAO,
|
|
@@ -25282,6 +25534,7 @@ exports.palavrasReservadas = {
|
|
|
25282
25534
|
senao: prisma_1.default.SENAO,
|
|
25283
25535
|
senão: prisma_1.default.SENÃO,
|
|
25284
25536
|
super: prisma_1.default.SUPER,
|
|
25537
|
+
quebra: prisma_1.default.QUEBRE,
|
|
25285
25538
|
quebre: prisma_1.default.QUEBRE,
|
|
25286
25539
|
tente: prisma_1.default.TENTE,
|
|
25287
25540
|
verdadeiro: prisma_1.default.VERDADEIRO,
|
|
@@ -25779,13 +26032,13 @@ class Lexador {
|
|
|
25779
26032
|
return this.codigo[this.linha].charAt(this.atual - 1);
|
|
25780
26033
|
}
|
|
25781
26034
|
analisarTexto(delimitador = '"') {
|
|
25782
|
-
let
|
|
26035
|
+
let valor = '';
|
|
25783
26036
|
this.avancar();
|
|
25784
26037
|
while (!this.eFinalDoCodigo()) {
|
|
25785
26038
|
const caractere = this.simboloAtual();
|
|
25786
26039
|
if (caractere === delimitador) {
|
|
25787
26040
|
this.avancar();
|
|
25788
|
-
this.adicionarSimbolo(delegua_1.default.TEXTO,
|
|
26041
|
+
this.adicionarSimbolo(delegua_1.default.TEXTO, valor);
|
|
25789
26042
|
return;
|
|
25790
26043
|
}
|
|
25791
26044
|
if (caractere === '\0' && this.eUltimaLinha()) {
|
|
@@ -25797,11 +26050,62 @@ class Lexador {
|
|
|
25797
26050
|
return;
|
|
25798
26051
|
}
|
|
25799
26052
|
if (caractere === '\0') {
|
|
25800
|
-
|
|
26053
|
+
valor += '\n';
|
|
25801
26054
|
this.avancar();
|
|
25802
26055
|
continue;
|
|
25803
26056
|
}
|
|
25804
|
-
|
|
26057
|
+
if (caractere === '\\') {
|
|
26058
|
+
this.avancar();
|
|
26059
|
+
const proximoCaractere = this.simboloAtual();
|
|
26060
|
+
switch (proximoCaractere) {
|
|
26061
|
+
case 'n':
|
|
26062
|
+
valor += '\n';
|
|
26063
|
+
break;
|
|
26064
|
+
case 't':
|
|
26065
|
+
valor += '\t';
|
|
26066
|
+
break;
|
|
26067
|
+
case 'r':
|
|
26068
|
+
valor += '\r';
|
|
26069
|
+
break;
|
|
26070
|
+
case 'b':
|
|
26071
|
+
valor += '\b';
|
|
26072
|
+
break;
|
|
26073
|
+
case "'":
|
|
26074
|
+
valor += "'";
|
|
26075
|
+
break;
|
|
26076
|
+
case '"':
|
|
26077
|
+
valor += '"';
|
|
26078
|
+
break;
|
|
26079
|
+
case '\\':
|
|
26080
|
+
valor += '\\';
|
|
26081
|
+
break;
|
|
26082
|
+
case 'e':
|
|
26083
|
+
valor += '\x1B';
|
|
26084
|
+
break;
|
|
26085
|
+
case 'x': {
|
|
26086
|
+
let hex = '';
|
|
26087
|
+
for (let i = 0; i < 2; i++) {
|
|
26088
|
+
const c = this.proximoSimbolo();
|
|
26089
|
+
if (/[0-9a-fA-F]/.test(c)) {
|
|
26090
|
+
this.avancar();
|
|
26091
|
+
hex += c;
|
|
26092
|
+
}
|
|
26093
|
+
else {
|
|
26094
|
+
break;
|
|
26095
|
+
}
|
|
26096
|
+
}
|
|
26097
|
+
valor += hex.length === 2 ? String.fromCharCode(parseInt(hex, 16)) : '\\x' + hex;
|
|
26098
|
+
break;
|
|
26099
|
+
}
|
|
26100
|
+
case '\0': break; // barra invertida no fim de linha: ignora e continua na próxima linha
|
|
26101
|
+
default:
|
|
26102
|
+
valor += '\\' + proximoCaractere;
|
|
26103
|
+
break;
|
|
26104
|
+
}
|
|
26105
|
+
}
|
|
26106
|
+
else {
|
|
26107
|
+
valor += caractere;
|
|
26108
|
+
}
|
|
25805
26109
|
this.avancar();
|
|
25806
26110
|
}
|
|
25807
26111
|
this.erros.push({
|
|
@@ -27597,6 +27901,7 @@ exports.default = {
|
|
|
27597
27901
|
IGUAL_IGUAL: 'IGUAL_IGUAL',
|
|
27598
27902
|
IMPORTAR: 'IMPORTAR',
|
|
27599
27903
|
INICIO: 'INICIO',
|
|
27904
|
+
INTERROGACAO: 'INTERROGACAO',
|
|
27600
27905
|
ISTO: 'ISTO',
|
|
27601
27906
|
LEIA: 'LEIA',
|
|
27602
27907
|
LOCAL: 'LOCAL',
|
|
@@ -27609,6 +27914,7 @@ exports.default = {
|
|
|
27609
27914
|
MENOR_MENOR: 'MENOR_MENOR',
|
|
27610
27915
|
MODULO: 'MODULO',
|
|
27611
27916
|
MULTIPLICACAO: 'MULTIPLICACAO',
|
|
27917
|
+
NAO: 'NAO',
|
|
27612
27918
|
NEGACAO: 'NEGACAO',
|
|
27613
27919
|
NULO: 'NULO',
|
|
27614
27920
|
NUMERO: 'NUMERO',
|
|
@@ -27620,6 +27926,8 @@ exports.default = {
|
|
|
27620
27926
|
PEGUE: 'PEGUE',
|
|
27621
27927
|
PONTO: 'PONTO',
|
|
27622
27928
|
PONTO_E_VIRGULA: 'PONTO_E_VIRGULA',
|
|
27929
|
+
COMPRIMENTO: 'COMPRIMENTO',
|
|
27930
|
+
CONCATENACAO: 'CONCATENACAO',
|
|
27623
27931
|
QUEBRA_LINHA: 'QUEBRA_LINHA',
|
|
27624
27932
|
RETORNE: 'RETORNE',
|
|
27625
27933
|
SE: 'SE',
|
|
@@ -43710,9 +44018,72 @@ class TradutorAssemblyScript {
|
|
|
43710
44018
|
traduzirConstrutoAgrupamento(agrupamento) {
|
|
43711
44019
|
return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
|
|
43712
44020
|
}
|
|
44021
|
+
detectarImportacoesNecessarias(declaracoes) {
|
|
44022
|
+
const importsNecessarios = new Set();
|
|
44023
|
+
this.varrerDeclaracoesParaImports(declaracoes, importsNecessarios);
|
|
44024
|
+
if (importsNecessarios.size === 0) {
|
|
44025
|
+
return '';
|
|
44026
|
+
}
|
|
44027
|
+
return Array.from(importsNecessarios).join('\n') + '\n\n';
|
|
44028
|
+
}
|
|
44029
|
+
varrerDeclaracoesParaImports(declaracoes, imports) {
|
|
44030
|
+
for (const declaracao of declaracoes) {
|
|
44031
|
+
const nome = declaracao.constructor.name;
|
|
44032
|
+
if (nome === 'Escreva' || nome === 'EscrevaMesmaLinha') {
|
|
44033
|
+
imports.add('import "wasi";');
|
|
44034
|
+
}
|
|
44035
|
+
else if (nome === 'Bloco') {
|
|
44036
|
+
this.varrerDeclaracoesParaImports(declaracao.declaracoes, imports);
|
|
44037
|
+
}
|
|
44038
|
+
else if (nome === 'Se') {
|
|
44039
|
+
const se = declaracao;
|
|
44040
|
+
if (se.caminhoEntao) {
|
|
44041
|
+
this.varrerDeclaracoesParaImports([se.caminhoEntao], imports);
|
|
44042
|
+
}
|
|
44043
|
+
if (se.caminhoSenao) {
|
|
44044
|
+
this.varrerDeclaracoesParaImports([se.caminhoSenao], imports);
|
|
44045
|
+
}
|
|
44046
|
+
}
|
|
44047
|
+
else if (nome === 'Enquanto') {
|
|
44048
|
+
const enquanto = declaracao;
|
|
44049
|
+
this.varrerDeclaracoesParaImports([enquanto.corpo], imports);
|
|
44050
|
+
}
|
|
44051
|
+
else if (nome === 'Para') {
|
|
44052
|
+
const para = declaracao;
|
|
44053
|
+
this.varrerDeclaracoesParaImports([para.corpo], imports);
|
|
44054
|
+
}
|
|
44055
|
+
else if (nome === 'ParaCada') {
|
|
44056
|
+
const paraCada = declaracao;
|
|
44057
|
+
this.varrerDeclaracoesParaImports([paraCada.corpo], imports);
|
|
44058
|
+
}
|
|
44059
|
+
else if (nome === 'Fazer') {
|
|
44060
|
+
const fazer = declaracao;
|
|
44061
|
+
this.varrerDeclaracoesParaImports([fazer.caminhoFazer], imports);
|
|
44062
|
+
}
|
|
44063
|
+
else if (nome === 'FuncaoDeclaracao') {
|
|
44064
|
+
const funcao = declaracao;
|
|
44065
|
+
this.varrerDeclaracoesParaImports(funcao.funcao.corpo, imports);
|
|
44066
|
+
}
|
|
44067
|
+
else if (nome === 'Classe') {
|
|
44068
|
+
const classe = declaracao;
|
|
44069
|
+
this.varrerDeclaracoesParaImports(classe.metodos, imports);
|
|
44070
|
+
}
|
|
44071
|
+
else if (nome === 'Tente') {
|
|
44072
|
+
const tente = declaracao;
|
|
44073
|
+
this.varrerDeclaracoesParaImports(tente.caminhoTente, imports);
|
|
44074
|
+
if (Array.isArray(tente.caminhoPegue)) {
|
|
44075
|
+
this.varrerDeclaracoesParaImports(tente.caminhoPegue, imports);
|
|
44076
|
+
}
|
|
44077
|
+
if (tente.caminhoFinalmente && tente.caminhoFinalmente.length > 0) {
|
|
44078
|
+
this.varrerDeclaracoesParaImports(tente.caminhoFinalmente, imports);
|
|
44079
|
+
}
|
|
44080
|
+
}
|
|
44081
|
+
}
|
|
44082
|
+
}
|
|
43713
44083
|
traduzir(declaracoes) {
|
|
43714
44084
|
let resultado = '';
|
|
43715
44085
|
this.declaracoesDeClasses = declaracoes.filter((declaracao) => declaracao instanceof declaracoes_1.Classe);
|
|
44086
|
+
resultado += this.detectarImportacoesNecessarias(declaracoes);
|
|
43716
44087
|
for (const declaracao of declaracoes) {
|
|
43717
44088
|
resultado += `${this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao)} \n`;
|
|
43718
44089
|
}
|