@designliquido/delegua 0.36.1 → 0.36.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.
- package/analisador-semantico/analisador-semantico-base.d.ts +69 -69
- package/analisador-semantico/analisador-semantico-base.js +180 -180
- package/analisador-semantico/analisador-semantico.d.ts +59 -59
- package/analisador-semantico/analisador-semantico.js +442 -442
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/index.d.ts +3 -3
- package/analisador-semantico/index.js +19 -19
- package/analisador-semantico/pilha-variaveis.d.ts +20 -20
- package/analisador-semantico/pilha-variaveis.js +25 -25
- package/avaliador-sintatico/avaliador-sintatico-base.d.ts +69 -69
- package/avaliador-sintatico/avaliador-sintatico-base.js +223 -223
- package/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +126 -126
- package/avaliador-sintatico/avaliador-sintatico.js +1093 -1093
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +73 -73
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +648 -648
- package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +21 -21
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +149 -149
- package/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +87 -87
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +770 -770
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts +34 -34
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +168 -168
- package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
- package/avaliador-sintatico/dialetos/index.d.ts +3 -3
- package/avaliador-sintatico/dialetos/index.js +19 -19
- package/avaliador-sintatico/erro-avaliador-sintatico.d.ts +5 -5
- package/avaliador-sintatico/erro-avaliador-sintatico.js +11 -11
- package/avaliador-sintatico/index.d.ts +6 -6
- package/avaliador-sintatico/index.js +22 -22
- package/avaliador-sintatico/micro-avaliador-sintatico-base.d.ts +27 -27
- package/avaliador-sintatico/micro-avaliador-sintatico-base.js +116 -116
- package/avaliador-sintatico/micro-avaliador-sintatico-base.js.map +1 -1
- package/avaliador-sintatico/micro-avaliador-sintatico.d.ts +33 -33
- package/avaliador-sintatico/micro-avaliador-sintatico.js +287 -287
- package/avaliador-sintatico/micro-avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/retornos/index.d.ts +3 -3
- package/avaliador-sintatico/retornos/index.js +19 -19
- package/avaliador-sintatico/retornos/retorno-declaracao.d.ts +3 -3
- package/avaliador-sintatico/retornos/retorno-declaracao.js +2 -2
- package/avaliador-sintatico/retornos/retorno-primario.d.ts +3 -3
- package/avaliador-sintatico/retornos/retorno-primario.js +2 -2
- package/avaliador-sintatico/retornos/retorno-resolver-declaracao.d.ts +2 -2
- package/avaliador-sintatico/retornos/retorno-resolver-declaracao.js +2 -2
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.d.ts +59 -59
- package/avaliador-sintatico/traducao/avaliador-sintatico-javascript.js +150 -150
- package/bibliotecas/biblioteca-global.d.ts +157 -157
- package/bibliotecas/biblioteca-global.js +497 -498
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/biblioteca-global.d.ts +1 -1
- package/bibliotecas/dialetos/egua-classico/biblioteca-global.js +236 -236
- package/bibliotecas/dialetos/egua-classico/biblioteca-global.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/index.d.ts +2 -2
- package/bibliotecas/dialetos/egua-classico/index.js +32 -32
- package/bibliotecas/dialetos/egua-classico/index.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/matematica.d.ts +1 -1
- package/bibliotecas/dialetos/egua-classico/matematica.js +541 -541
- package/bibliotecas/dialetos/egua-classico/matematica.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/tempo.d.ts +1 -1
- package/bibliotecas/dialetos/egua-classico/tempo.js +39 -39
- package/bibliotecas/dialetos/egua-classico/tempo.js.map +1 -1
- package/bibliotecas/dialetos/egua-classico/textos.d.ts +8 -8
- package/bibliotecas/dialetos/egua-classico/textos.js +201 -201
- package/bibliotecas/dialetos/egua-classico/textos.js.map +1 -1
- package/bibliotecas/primitivas-dicionario.d.ts +6 -6
- package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
- package/bibliotecas/primitivas-dicionario.js +10 -10
- package/bibliotecas/primitivas-numero.d.ts +6 -6
- package/bibliotecas/primitivas-numero.d.ts.map +1 -1
- package/bibliotecas/primitivas-numero.js +10 -10
- package/bibliotecas/primitivas-texto.d.ts +17 -17
- package/bibliotecas/primitivas-texto.d.ts.map +1 -1
- package/bibliotecas/primitivas-texto.js +22 -22
- package/bibliotecas/primitivas-texto.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts +21 -21
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +90 -90
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +5 -4
- package/construtos/acesso-elemento-matriz.d.ts +12 -12
- package/construtos/acesso-elemento-matriz.js +17 -17
- package/construtos/acesso-indice-variavel.d.ts +15 -15
- package/construtos/acesso-indice-variavel.js +20 -20
- package/construtos/acesso-metodo-ou-propriedade.d.ts +14 -14
- package/construtos/acesso-metodo-ou-propriedade.js +19 -19
- package/construtos/agrupamento.d.ts +14 -14
- package/construtos/agrupamento.js +19 -19
- package/construtos/atribuicao-por-indice.d.ts +11 -11
- package/construtos/atribuicao-por-indice.js +16 -16
- package/construtos/atribuicao-por-indices-matriz.d.ts +12 -12
- package/construtos/atribuicao-por-indices-matriz.js +17 -17
- package/construtos/atribuir.d.ts +15 -15
- package/construtos/atribuir.js +24 -24
- package/construtos/atribuir.js.map +1 -1
- package/construtos/binario.d.ts +33 -33
- package/construtos/binario.js +38 -38
- package/construtos/chamada.d.ts +15 -15
- package/construtos/chamada.js +21 -21
- package/construtos/comentario.d.ts +15 -15
- package/construtos/comentario.js +20 -20
- package/construtos/constante.d.ts +12 -12
- package/construtos/constante.js +17 -17
- package/construtos/construto.d.ts +7 -7
- package/construtos/construto.js +2 -2
- package/construtos/decorador.d.ts +14 -14
- package/construtos/decorador.js +19 -19
- package/construtos/definir-valor.d.ts +11 -11
- package/construtos/definir-valor.js +16 -16
- package/construtos/dicionario.d.ts +10 -10
- package/construtos/dicionario.js +15 -15
- package/construtos/expressao-regular.d.ts +10 -10
- package/construtos/expressao-regular.js +15 -15
- package/construtos/fim-para.d.ts +22 -22
- package/construtos/fim-para.js +25 -25
- package/construtos/formatacao-escrita.d.ts +16 -16
- package/construtos/formatacao-escrita.js +21 -21
- package/construtos/funcao.d.ts +12 -12
- package/construtos/funcao.js +16 -16
- package/construtos/index.d.ts +29 -29
- package/construtos/index.js +45 -45
- package/construtos/isto.d.ts +9 -9
- package/construtos/isto.js +14 -14
- package/construtos/literal.d.ts +10 -10
- package/construtos/literal.js +14 -14
- package/construtos/logico.d.ts +11 -11
- package/construtos/logico.js +16 -16
- package/construtos/qual-tipo.d.ts +11 -11
- package/construtos/qual-tipo.js +16 -16
- package/construtos/super.d.ts +10 -10
- package/construtos/super.js +15 -15
- package/construtos/tipo-de.d.ts +10 -10
- package/construtos/tipo-de.js +15 -15
- package/construtos/tuplas/deceto.d.ts +18 -18
- package/construtos/tuplas/deceto.js +32 -32
- package/construtos/tuplas/dupla.d.ts +6 -6
- package/construtos/tuplas/dupla.js +12 -12
- package/construtos/tuplas/index.d.ts +13 -13
- package/construtos/tuplas/index.js +67 -67
- package/construtos/tuplas/index.js.map +1 -1
- package/construtos/tuplas/noneto.d.ts +15 -15
- package/construtos/tuplas/noneto.js +25 -25
- package/construtos/tuplas/octeto.d.ts +14 -14
- package/construtos/tuplas/octeto.js +24 -24
- package/construtos/tuplas/quarteto.d.ts +8 -8
- package/construtos/tuplas/quarteto.js +14 -14
- package/construtos/tuplas/quinteto.d.ts +9 -9
- package/construtos/tuplas/quinteto.js +15 -15
- package/construtos/tuplas/septeto.d.ts +13 -13
- package/construtos/tuplas/septeto.js +23 -23
- package/construtos/tuplas/sexteto.d.ts +10 -10
- package/construtos/tuplas/sexteto.js +16 -16
- package/construtos/tuplas/trio.d.ts +7 -7
- package/construtos/tuplas/trio.js +13 -13
- package/construtos/tuplas/tupla.d.ts +8 -8
- package/construtos/tuplas/tupla.js +9 -9
- package/construtos/unario.d.ts +11 -11
- package/construtos/unario.js +16 -16
- package/construtos/variavel.d.ts +9 -9
- package/construtos/variavel.js +14 -14
- package/construtos/vetor.d.ts +11 -11
- package/construtos/vetor.js +21 -21
- package/construtos/vetor.js.map +1 -1
- package/declaracoes/aleatorio.d.ts +15 -15
- package/declaracoes/aleatorio.js +15 -15
- package/declaracoes/bloco.d.ts +7 -7
- package/declaracoes/bloco.js +14 -14
- package/declaracoes/cabecalho-programa.d.ts +7 -7
- package/declaracoes/cabecalho-programa.js +14 -14
- package/declaracoes/classe.d.ts +14 -14
- package/declaracoes/classe.js +18 -18
- package/declaracoes/const-multiplo.d.ts +14 -14
- package/declaracoes/const-multiplo.js +19 -19
- package/declaracoes/const.d.ts +14 -14
- package/declaracoes/const.js +19 -19
- package/declaracoes/continua.d.ts +6 -6
- package/declaracoes/continua.js +13 -13
- package/declaracoes/declaracao.d.ts +8 -8
- package/declaracoes/declaracao.js +17 -17
- package/declaracoes/enquanto.d.ts +10 -10
- package/declaracoes/enquanto.js +15 -15
- package/declaracoes/escolha.d.ts +14 -14
- package/declaracoes/escolha.js +19 -19
- package/declaracoes/escreva-mesma-linha.d.ts +8 -8
- package/declaracoes/escreva-mesma-linha.js +14 -14
- package/declaracoes/escreva.d.ts +8 -8
- package/declaracoes/escreva.js +14 -14
- package/declaracoes/expressao.d.ts +8 -8
- package/declaracoes/expressao.js +14 -14
- package/declaracoes/falhar.d.ts +8 -8
- package/declaracoes/falhar.js +15 -15
- package/declaracoes/fazer.d.ts +10 -10
- package/declaracoes/fazer.js +15 -15
- package/declaracoes/funcao.d.ts +11 -11
- package/declaracoes/funcao.js +17 -17
- package/declaracoes/importar.d.ts +9 -9
- package/declaracoes/importar.js +15 -15
- package/declaracoes/index.d.ts +31 -31
- package/declaracoes/index.js +47 -47
- package/declaracoes/inicio-algoritmo.d.ts +6 -6
- package/declaracoes/inicio-algoritmo.js +13 -13
- package/declaracoes/leia-multiplo.d.ts +14 -14
- package/declaracoes/leia-multiplo.js +21 -21
- package/declaracoes/leia.d.ts +17 -17
- package/declaracoes/leia.js +21 -21
- package/declaracoes/para-cada.d.ts +11 -11
- package/declaracoes/para-cada.js +17 -17
- package/declaracoes/para.d.ts +19 -19
- package/declaracoes/para.js +24 -24
- package/declaracoes/propriedade-classe.d.ts +10 -10
- package/declaracoes/propriedade-classe.js +16 -16
- package/declaracoes/retorna.d.ts +8 -8
- package/declaracoes/retorna.js +15 -15
- package/declaracoes/se.d.ts +11 -11
- package/declaracoes/se.js +17 -17
- package/declaracoes/sustar.d.ts +6 -6
- package/declaracoes/sustar.js +13 -13
- package/declaracoes/tendo-como.d.ts +16 -16
- package/declaracoes/tendo-como.js +21 -21
- package/declaracoes/tente.d.ts +14 -14
- package/declaracoes/tente.js +20 -20
- package/declaracoes/var-multiplo.d.ts +15 -15
- package/declaracoes/var-multiplo.js +20 -20
- package/declaracoes/var.d.ts +16 -16
- package/declaracoes/var.js +21 -21
- package/depuracao/cyrb53.d.ts +9 -9
- package/depuracao/cyrb53.js +22 -22
- package/depuracao/cyrb53.js.map +1 -1
- package/depuracao/index.d.ts +2 -2
- package/depuracao/index.js +23 -23
- package/depuracao/ponto-parada.d.ts +4 -4
- package/depuracao/ponto-parada.js +2 -2
- package/espaco-variaveis.d.ts +19 -19
- package/espaco-variaveis.js +19 -19
- package/estruturas/chamavel.d.ts +7 -7
- package/estruturas/chamavel.js +12 -12
- package/estruturas/classe-padrao.d.ts +31 -31
- package/estruturas/classe-padrao.js +39 -39
- package/estruturas/delegua-funcao.d.ts +29 -29
- package/estruturas/delegua-funcao.js +141 -141
- package/estruturas/delegua-funcao.js.map +1 -1
- package/estruturas/descritor-tipo-classe.d.ts +37 -37
- package/estruturas/descritor-tipo-classe.js +79 -79
- package/estruturas/descritor-tipo-classe.js.map +1 -1
- package/estruturas/funcao-padrao.d.ts +23 -23
- package/estruturas/funcao-padrao.js +34 -34
- package/estruturas/index.d.ts +9 -9
- package/estruturas/index.js +25 -25
- package/estruturas/metodo-primitiva.d.ts +28 -28
- package/estruturas/metodo-primitiva.js +40 -40
- package/estruturas/modulo.d.ts +18 -18
- package/estruturas/modulo.js +24 -24
- package/estruturas/objeto-delegua-classe.d.ts +26 -26
- package/estruturas/objeto-delegua-classe.js +53 -53
- package/estruturas/objeto-delegua-classe.js.map +1 -1
- package/estruturas/objeto-padrao.d.ts +18 -18
- package/estruturas/objeto-padrao.js +32 -32
- package/estruturas/objeto-padrao.js.map +1 -1
- package/excecoes/erro-em-tempo-de-execucao.d.ts +7 -7
- package/excecoes/erro-em-tempo-de-execucao.js +13 -13
- package/excecoes/index.d.ts +1 -1
- package/excecoes/index.js +17 -17
- package/formatadores/formatador-delegua.d.ts +79 -79
- package/formatadores/formatador-delegua.js +676 -676
- package/formatadores/formatador-delegua.js.map +1 -1
- package/formatadores/index.d.ts +1 -1
- package/formatadores/index.js +17 -17
- package/geracao-identificadores/index.d.ts +1 -1
- package/geracao-identificadores/index.js +22 -23
- package/geracao-identificadores/index.js.map +1 -1
- package/index.d.ts +9 -9
- package/index.js +27 -27
- package/interfaces/analisador-semantico-interface.d.ts +6 -6
- package/interfaces/analisador-semantico-interface.js +2 -2
- package/interfaces/avaliador-sintatico-interface.d.ts +55 -55
- package/interfaces/avaliador-sintatico-interface.js +2 -2
- package/interfaces/construtos/index.d.ts +4 -4
- package/interfaces/construtos/index.js +2 -2
- package/interfaces/erros/diagnostico-analisador-semantico.d.ts +14 -14
- package/interfaces/erros/diagnostico-analisador-semantico.js +10 -10
- package/interfaces/erros/diagnostico-analisador-semantico.js.map +1 -1
- package/interfaces/erros/erro-interpretador.d.ts +8 -8
- package/interfaces/erros/erro-interpretador.js +2 -2
- package/interfaces/erros/index.d.ts +1 -1
- package/interfaces/erros/index.js +17 -17
- package/interfaces/escopo-execucao.d.ts +12 -12
- package/interfaces/escopo-execucao.js +2 -2
- package/interfaces/formatador-comum-interface.d.ts +11 -11
- package/interfaces/formatador-comum-interface.js +2 -2
- package/interfaces/funcao-hipotetica-interface.d.ts +3 -3
- package/interfaces/funcao-hipotetica-interface.js +2 -2
- package/interfaces/index.d.ts +16 -16
- package/interfaces/index.js +32 -32
- package/interfaces/interpretador-com-depuracao-interface.d.ts +17 -17
- package/interfaces/interpretador-com-depuracao-interface.js +2 -2
- package/interfaces/interpretador-interface-potigol.d.ts +5 -5
- package/interfaces/interpretador-interface-potigol.js +2 -2
- package/interfaces/interpretador-interface.d.ts +20 -20
- package/interfaces/interpretador-interface.js +2 -2
- package/interfaces/lexador-interface.d.ts +23 -23
- package/interfaces/lexador-interface.js +2 -2
- package/interfaces/parametro-interface.d.ts +15 -15
- package/interfaces/parametro-interface.js +2 -2
- package/interfaces/pilha-escopos-execucao-interface.d.ts +26 -26
- package/interfaces/pilha-escopos-execucao-interface.js +2 -2
- package/interfaces/pilha-interface.d.ts +7 -7
- package/interfaces/pilha-interface.js +2 -2
- package/interfaces/resolvedor-interface.d.ts +41 -41
- package/interfaces/resolvedor-interface.js +2 -2
- package/interfaces/retornos/index.d.ts +4 -4
- package/interfaces/retornos/index.js +20 -20
- package/interfaces/retornos/retorno-analisador-semantico.d.ts +4 -4
- package/interfaces/retornos/retorno-analisador-semantico.js +2 -2
- package/interfaces/retornos/retorno-avaliador-sintatico.d.ts +5 -5
- package/interfaces/retornos/retorno-avaliador-sintatico.js +2 -2
- package/interfaces/retornos/retorno-execucao-interface.d.ts +5 -5
- package/interfaces/retornos/retorno-execucao-interface.js +2 -2
- package/interfaces/retornos/retorno-interpretador.d.ts +5 -5
- package/interfaces/retornos/retorno-interpretador.js +2 -2
- package/interfaces/retornos/retorno-lexador.d.ts +9 -9
- package/interfaces/retornos/retorno-lexador.js +2 -2
- package/interfaces/simbolo-interface.d.ts +7 -7
- package/interfaces/simbolo-interface.js +2 -2
- package/interfaces/tradutor-interface.d.ts +3 -3
- package/interfaces/tradutor-interface.js +2 -2
- package/interfaces/variavel-hipotetica-interface.d.ts +8 -8
- package/interfaces/variavel-hipotetica-interface.js +2 -2
- package/interfaces/variavel-interface.d.ts +8 -8
- package/interfaces/variavel-interface.js +2 -2
- package/interfaces/visitante-comum-interface.d.ts +58 -58
- package/interfaces/visitante-comum-interface.js +2 -2
- package/interpretador/argumento-interface.d.ts +4 -4
- package/interpretador/argumento-interface.js +2 -2
- package/interpretador/comum.d.ts +2 -2
- package/interpretador/comum.js +51 -52
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/egua-classico/index.d.ts +1 -1
- package/interpretador/dialetos/egua-classico/index.js +17 -17
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +119 -119
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +815 -815
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.d.ts +5 -5
- package/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.js +11 -11
- package/interpretador/dialetos/egua-classico/resolvedor/index.d.ts +3 -3
- package/interpretador/dialetos/egua-classico/resolvedor/index.js +19 -19
- package/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.d.ts +9 -9
- package/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.js +25 -25
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +106 -106
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +441 -441
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.d.ts +6 -6
- package/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.js +2 -2
- package/interpretador/dialetos/index.d.ts +2 -2
- package/interpretador/dialetos/index.js +18 -18
- package/interpretador/dialetos/portugol-ipt/index.d.ts +1 -1
- package/interpretador/dialetos/portugol-ipt/index.js +17 -17
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +133 -133
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +501 -501
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/index.d.ts +3 -3
- package/interpretador/index.js +19 -19
- package/interpretador/inferenciador.d.ts +15 -15
- package/interpretador/inferenciador.d.ts.map +1 -1
- package/interpretador/inferenciador.js +80 -80
- package/interpretador/inferenciador.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +268 -268
- package/interpretador/interpretador-base.js +1399 -1399
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador-com-depuracao.d.ts +190 -190
- package/interpretador/interpretador-com-depuracao.js +568 -568
- package/interpretador/interpretador-com-depuracao.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts +39 -39
- package/interpretador/pilha-escopos-execucao.js +243 -243
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/lexador/dialetos/index.d.ts +4 -4
- package/lexador/dialetos/index.js +20 -20
- package/lexador/dialetos/lexador-egua-classico.d.ts +36 -36
- package/lexador/dialetos/lexador-egua-classico.js +286 -286
- package/lexador/dialetos/lexador-egua-classico.js.map +1 -1
- package/lexador/dialetos/lexador-guarani.d.ts +10 -10
- package/lexador/dialetos/lexador-guarani.js +113 -113
- package/lexador/dialetos/lexador-guarani.js.map +1 -1
- package/lexador/dialetos/lexador-pitugues.d.ts +51 -51
- package/lexador/dialetos/lexador-pitugues.js +398 -398
- package/lexador/dialetos/lexador-pitugues.js.map +1 -1
- package/lexador/dialetos/lexador-portugol-ipt.d.ts +33 -33
- package/lexador/dialetos/lexador-portugol-ipt.js +237 -237
- package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
- package/lexador/dialetos/palavras-reservadas/egua-classico.d.ts +32 -32
- package/lexador/dialetos/palavras-reservadas/egua-classico.js +39 -39
- package/lexador/dialetos/palavras-reservadas/guarani.d.ts +3 -3
- package/lexador/dialetos/palavras-reservadas/guarani.js +10 -10
- package/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts +13 -13
- package/lexador/dialetos/palavras-reservadas/portugol-ipt.js +20 -20
- package/lexador/dialetos/palavras-reservadas/rantiaquin.d.ts +1 -1
- package/lexador/dialetos/palavras-reservadas/rantiaquin.js +4 -4
- package/lexador/dialetos/pragma.d.ts +8 -8
- package/lexador/dialetos/pragma.js +2 -2
- package/lexador/erro-lexador.d.ts +5 -5
- package/lexador/erro-lexador.js +2 -2
- package/lexador/index.d.ts +4 -4
- package/lexador/index.js +20 -20
- package/lexador/lexador-base-linha-unica.d.ts +28 -28
- package/lexador/lexador-base-linha-unica.js +82 -82
- package/lexador/lexador-base-linha-unica.js.map +1 -1
- package/lexador/lexador-base.d.ts +41 -41
- package/lexador/lexador-base.js +112 -112
- package/lexador/lexador-base.js.map +1 -1
- package/lexador/lexador.d.ts +43 -43
- package/lexador/lexador.js +440 -440
- package/lexador/lexador.js.map +1 -1
- package/lexador/micro-lexador.d.ts +29 -29
- package/lexador/micro-lexador.js +207 -207
- package/lexador/micro-lexador.js.map +1 -1
- package/lexador/palavras-reservadas.d.ts +54 -54
- package/lexador/palavras-reservadas.js +61 -61
- package/lexador/simbolo.d.ts +10 -10
- package/lexador/simbolo.js +16 -16
- package/lexador/traducao/lexador-javascript.d.ts +28 -28
- package/lexador/traducao/lexador-javascript.js +58 -58
- package/package.json +5 -4
- package/quebras/index.d.ts +10 -10
- package/quebras/index.js +19 -19
- package/tipo-dados-elementar.d.ts +1 -1
- package/tipo-dados-elementar.js +2 -2
- package/tipos-de-dados/delegua.d.ts +18 -18
- package/tipos-de-dados/delegua.js +19 -19
- package/tipos-de-dados/listas-delegua.d.ts +6 -6
- package/tipos-de-dados/listas-delegua.js +7 -7
- package/tipos-de-dados/listas-primitivos.d.ts +5 -5
- package/tipos-de-dados/listas-primitivos.js +6 -6
- package/tipos-de-dados/primitivos.d.ts +16 -16
- package/tipos-de-dados/primitivos.js +17 -17
- package/tipos-de-simbolos/comum.d.ts +23 -23
- package/tipos-de-simbolos/comum.js +24 -24
- package/tipos-de-simbolos/delegua.d.ts +91 -91
- package/tipos-de-simbolos/delegua.js +92 -92
- package/tipos-de-simbolos/egua-classico.d.ts +75 -75
- package/tipos-de-simbolos/egua-classico.js +76 -76
- package/tipos-de-simbolos/guarani.d.ts +14 -14
- package/tipos-de-simbolos/guarani.js +15 -15
- package/tipos-de-simbolos/guarani.js.map +1 -1
- package/tipos-de-simbolos/microgramaticas/delegua.d.ts +46 -46
- package/tipos-de-simbolos/microgramaticas/delegua.js +47 -47
- package/tipos-de-simbolos/pitugues.d.ts +75 -75
- package/tipos-de-simbolos/pitugues.js +76 -76
- package/tipos-de-simbolos/portugol-ipt.d.ts +36 -36
- package/tipos-de-simbolos/portugol-ipt.js +37 -37
- package/tipos-de-simbolos/rantiaquin.d.ts +2 -2
- package/tipos-de-simbolos/rantiaquin.js +3 -3
- package/tradutores/dicionarios/dicionario-delegua-javascript.d.ts +2 -2
- package/tradutores/dicionarios/dicionario-delegua-javascript.js +10 -10
- package/tradutores/dicionarios/index.d.ts +1 -1
- package/tradutores/dicionarios/index.js +17 -17
- package/tradutores/index.d.ts +6 -6
- package/tradutores/index.js +22 -22
- package/tradutores/python/python3-lexer.d.ts +152 -152
- package/tradutores/python/python3-lexer.js +1227 -1227
- package/tradutores/python/python3-lexer.js.map +1 -1
- package/tradutores/python/python3-listener.d.ts +964 -964
- package/tradutores/python/python3-listener.js +3 -3
- package/tradutores/python/python3-parser.d.ts +1342 -1342
- package/tradutores/python/python3-parser.js +11226 -11226
- package/tradutores/python/python3-parser.js.map +1 -1
- package/tradutores/python/python3-visitor.d.ts +619 -619
- package/tradutores/python/python3-visitor.js +3 -3
- package/tradutores/tradutor-assembly-x64.d.ts +19 -19
- package/tradutores/tradutor-assembly-x64.js +128 -128
- package/tradutores/tradutor-assembly-x64.js.map +1 -1
- package/tradutores/tradutor-assemblyscript.d.ts +91 -91
- package/tradutores/tradutor-assemblyscript.js +590 -590
- package/tradutores/tradutor-assemblyscript.js.map +1 -1
- package/tradutores/tradutor-javascript.d.ts +95 -95
- package/tradutores/tradutor-javascript.js +577 -577
- package/tradutores/tradutor-javascript.js.map +1 -1
- package/tradutores/tradutor-portugol-ipt.d.ts +21 -21
- package/tradutores/tradutor-portugol-ipt.js +60 -60
- package/tradutores/tradutor-portugol-ipt.js.map +1 -1
- package/tradutores/tradutor-python.d.ts +65 -65
- package/tradutores/tradutor-python.js +461 -461
- package/tradutores/tradutor-python.js.map +1 -1
- package/tradutores/tradutor-reverso-javascript.d.ts +50 -50
- package/tradutores/tradutor-reverso-javascript.js +392 -392
- package/tradutores/tradutor-reverso-javascript.js.map +1 -1
- package/tradutores/tradutor-reverso-python.d.ts +32 -32
- package/tradutores/tradutor-reverso-python.js +71 -71
- package/tradutores/tradutor-reverso-python.js.map +1 -1
- package/umd/delegua.js +26337 -26340
|
@@ -1,502 +1,502 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.InterpretadorPortugolIpt = void 0;
|
|
7
|
-
const espaco_variaveis_1 = require("../../../espaco-variaveis");
|
|
8
|
-
const estruturas_1 = require("../../../estruturas");
|
|
9
|
-
const excecoes_1 = require("../../../excecoes");
|
|
10
|
-
const quebras_1 = require("../../../quebras");
|
|
11
|
-
const pilha_escopos_execucao_1 = require("../../pilha-escopos-execucao");
|
|
12
|
-
const portugol_ipt_1 = __importDefault(require("../../../tipos-de-simbolos/portugol-ipt"));
|
|
13
|
-
const inferenciador_1 = require("../../inferenciador");
|
|
14
|
-
class InterpretadorPortugolIpt {
|
|
15
|
-
constructor(diretorioBase, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
|
|
16
|
-
this.funcaoDeRetorno = null;
|
|
17
|
-
this.funcaoDeRetornoMesmaLinha = null;
|
|
18
|
-
this.resultadoInterpretador = [];
|
|
19
|
-
this.diretorioBase = diretorioBase;
|
|
20
|
-
this.funcaoDeRetorno = funcaoDeRetorno || console.log;
|
|
21
|
-
this.funcaoDeRetornoMesmaLinha = funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
|
|
22
|
-
this.erros = [];
|
|
23
|
-
this.declaracoes = [];
|
|
24
|
-
this.pilhaEscoposExecucao = new pilha_escopos_execucao_1.PilhaEscoposExecucao();
|
|
25
|
-
const escopoExecucao = {
|
|
26
|
-
declaracoes: [],
|
|
27
|
-
declaracaoAtual: 0,
|
|
28
|
-
ambiente: new espaco_variaveis_1.EspacoVariaveis(),
|
|
29
|
-
finalizado: false,
|
|
30
|
-
tipo: 'outro',
|
|
31
|
-
emLacoRepeticao: false,
|
|
32
|
-
};
|
|
33
|
-
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
|
|
34
|
-
}
|
|
35
|
-
visitarDeclaracaoComentario(declaracao) {
|
|
36
|
-
return Promise.resolve();
|
|
37
|
-
}
|
|
38
|
-
visitarDeclaracaoTendoComo(declaracao) {
|
|
39
|
-
throw new Error('Método não implementado.');
|
|
40
|
-
}
|
|
41
|
-
visitarDeclaracaoInicioAlgoritmo(declaracao) {
|
|
42
|
-
throw new Error('Método não implementado.');
|
|
43
|
-
}
|
|
44
|
-
visitarDeclaracaoCabecalhoPrograma(declaracao) {
|
|
45
|
-
throw new Error('Método não implementado.');
|
|
46
|
-
}
|
|
47
|
-
visitarExpressaoTupla(expressao) {
|
|
48
|
-
throw new Error('Método não implementado.');
|
|
49
|
-
}
|
|
50
|
-
visitarExpressaoAcessoElementoMatriz(expressao) {
|
|
51
|
-
throw new Error('Método não implementado.');
|
|
52
|
-
}
|
|
53
|
-
visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
|
|
54
|
-
throw new Error('Método não implementado.');
|
|
55
|
-
}
|
|
56
|
-
visitarExpressaoExpressaoRegular(expressao) {
|
|
57
|
-
throw new Error('Método não implementado.');
|
|
58
|
-
}
|
|
59
|
-
visitarExpressaoTipoDe(expressao) {
|
|
60
|
-
throw new Error('Método não implementado.');
|
|
61
|
-
}
|
|
62
|
-
visitarExpressaoQualTipo(expressao) {
|
|
63
|
-
throw new Error('Método não implementado.');
|
|
64
|
-
}
|
|
65
|
-
visitarExpressaoFalhar(expressao) {
|
|
66
|
-
throw new Error('Método não implementado.');
|
|
67
|
-
}
|
|
68
|
-
visitarDeclaracaoParaCada(declaracao) {
|
|
69
|
-
throw new Error('Método não implementado.');
|
|
70
|
-
}
|
|
71
|
-
visitarExpressaoLiteral(expressao) {
|
|
72
|
-
return expressao.valor;
|
|
73
|
-
}
|
|
74
|
-
async avaliar(expressao) {
|
|
75
|
-
// Descomente o código abaixo quando precisar detectar expressões undefined ou nulas.
|
|
76
|
-
// Por algum motivo o depurador do VSCode não funciona direito aqui
|
|
77
|
-
// com breakpoint condicional.
|
|
78
|
-
if (expressao === null || expressao === undefined) {
|
|
79
|
-
console.log('Aqui');
|
|
80
|
-
}
|
|
81
|
-
return await expressao.aceitar(this);
|
|
82
|
-
}
|
|
83
|
-
visitarExpressaoAgrupamento(expressao) {
|
|
84
|
-
throw new Error('Método não implementado');
|
|
85
|
-
}
|
|
86
|
-
visitarExpressaoUnaria(expressao) {
|
|
87
|
-
throw new Error('Método não implementado');
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Verifica se operandos são números, que podem ser tanto variáveis puras do JavaScript
|
|
91
|
-
* (neste caso, `number`), ou podem ser variáveis de Delégua com inferência (`VariavelInterface`).
|
|
92
|
-
* @param operador O símbolo do operador.
|
|
93
|
-
* @param direita O operando direito.
|
|
94
|
-
* @param esquerda O operando esquerdo.
|
|
95
|
-
* @returns Se ambos os operandos são números ou não.
|
|
96
|
-
*/
|
|
97
|
-
verificarOperandosNumeros(operador, direita, esquerda) {
|
|
98
|
-
const tipoDireita = direita.tipo ? direita.tipo : typeof direita === 'number' ? 'número' : String(NaN);
|
|
99
|
-
const tipoEsquerda = esquerda.tipo
|
|
100
|
-
? esquerda.tipo
|
|
101
|
-
: typeof esquerda === 'number'
|
|
102
|
-
? 'número'
|
|
103
|
-
: String(NaN);
|
|
104
|
-
const tiposNumericos = ['inteiro', 'numero', 'número', 'real'];
|
|
105
|
-
if (tiposNumericos.includes(tipoDireita.toLowerCase()) && tiposNumericos.includes(tipoEsquerda.toLowerCase()))
|
|
106
|
-
return;
|
|
107
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
|
|
108
|
-
}
|
|
109
|
-
eIgual(esquerda, direita) {
|
|
110
|
-
if (esquerda === null && direita === null)
|
|
111
|
-
return true;
|
|
112
|
-
if (esquerda === null)
|
|
113
|
-
return false;
|
|
114
|
-
return esquerda === direita;
|
|
115
|
-
}
|
|
116
|
-
async visitarExpressaoBinaria(expressao) {
|
|
117
|
-
try {
|
|
118
|
-
const esquerda = await this.avaliar(expressao.esquerda);
|
|
119
|
-
const direita = await this.avaliar(expressao.direita);
|
|
120
|
-
const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda;
|
|
121
|
-
const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita;
|
|
122
|
-
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
|
|
123
|
-
? esquerda.tipo
|
|
124
|
-
: (0, inferenciador_1.inferirTipoVariavel)(esquerda);
|
|
125
|
-
const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo')) ? direita.tipo : (0, inferenciador_1.inferirTipoVariavel)(direita);
|
|
126
|
-
switch (expressao.operador.tipo) {
|
|
127
|
-
case portugol_ipt_1.default.EXPONENCIACAO:
|
|
128
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
129
|
-
return Math.pow(valorEsquerdo, valorDireito);
|
|
130
|
-
case portugol_ipt_1.default.MAIOR:
|
|
131
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
132
|
-
return Number(valorEsquerdo) > Number(valorDireito);
|
|
133
|
-
case portugol_ipt_1.default.MAIOR_IGUAL:
|
|
134
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
135
|
-
return Number(valorEsquerdo) >= Number(valorDireito);
|
|
136
|
-
case portugol_ipt_1.default.MENOR:
|
|
137
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
138
|
-
return Number(valorEsquerdo) < Number(valorDireito);
|
|
139
|
-
case portugol_ipt_1.default.MENOR_IGUAL:
|
|
140
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
141
|
-
return Number(valorEsquerdo) <= Number(valorDireito);
|
|
142
|
-
case portugol_ipt_1.default.SUBTRACAO:
|
|
143
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
144
|
-
return Number(valorEsquerdo) - Number(valorDireito);
|
|
145
|
-
case portugol_ipt_1.default.ADICAO:
|
|
146
|
-
if (tipoEsquerdo === 'número' && tipoDireito === 'número') {
|
|
147
|
-
return Number(valorEsquerdo) + Number(valorDireito);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
return String(valorEsquerdo) + String(valorDireito);
|
|
151
|
-
}
|
|
152
|
-
case portugol_ipt_1.default.DIVISAO:
|
|
153
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
154
|
-
return Number(valorEsquerdo) / Number(valorDireito);
|
|
155
|
-
case portugol_ipt_1.default.DIVISAO_INTEIRA:
|
|
156
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
157
|
-
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
158
|
-
case portugol_ipt_1.default.MULTIPLICACAO:
|
|
159
|
-
if (tipoEsquerdo === 'texto' || tipoDireito === 'texto') {
|
|
160
|
-
// Sem ambos os valores resolvem como texto, multiplica normal.
|
|
161
|
-
// Se apenas um resolve como texto, o outro repete o
|
|
162
|
-
// texto n vezes, sendo n o valor do outro.
|
|
163
|
-
if (tipoEsquerdo === 'texto' && tipoDireito === 'texto') {
|
|
164
|
-
return Number(valorEsquerdo) * Number(valorDireito);
|
|
165
|
-
}
|
|
166
|
-
if (tipoEsquerdo === 'texto') {
|
|
167
|
-
return valorEsquerdo.repeat(Number(valorDireito));
|
|
168
|
-
}
|
|
169
|
-
return valorDireito.repeat(Number(valorEsquerdo));
|
|
170
|
-
}
|
|
171
|
-
return Number(valorEsquerdo) * Number(valorDireito);
|
|
172
|
-
case portugol_ipt_1.default.MODULO:
|
|
173
|
-
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
174
|
-
return Number(valorEsquerdo) % Number(valorDireito);
|
|
175
|
-
case portugol_ipt_1.default.DIFERENTE:
|
|
176
|
-
return !this.eIgual(valorEsquerdo, valorDireito);
|
|
177
|
-
case portugol_ipt_1.default.IGUAL:
|
|
178
|
-
return this.eIgual(valorEsquerdo, valorDireito);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch (erro) {
|
|
182
|
-
return Promise.reject(erro);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
visitarExpressaoDeChamada(expressao) {
|
|
186
|
-
throw new Error('Método não implementado');
|
|
187
|
-
}
|
|
188
|
-
visitarExpressaoDeAtribuicao(expressao) {
|
|
189
|
-
throw new Error('Método não implementado');
|
|
190
|
-
}
|
|
191
|
-
procurarVariavel(simbolo) {
|
|
192
|
-
return this.pilhaEscoposExecucao.obterValorVariavel(simbolo);
|
|
193
|
-
}
|
|
194
|
-
visitarExpressaoDeVariavel(expressao) {
|
|
195
|
-
return this.procurarVariavel(expressao.simbolo);
|
|
196
|
-
}
|
|
197
|
-
visitarDeclaracaoDeExpressao(declaracao) {
|
|
198
|
-
throw new Error('Método não implementado');
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Execução da leitura de valores da entrada configurada no
|
|
202
|
-
* início da aplicação.
|
|
203
|
-
* @param expressao Expressão do tipo Leia
|
|
204
|
-
* @returns Promise com o resultado da leitura.
|
|
205
|
-
*/
|
|
206
|
-
async visitarExpressaoLeia(expressao) {
|
|
207
|
-
const mensagem = expressao.argumentos && expressao.argumentos[0] ? expressao.argumentos[0].valor : '> ';
|
|
208
|
-
return new Promise((resolucao) => this.interfaceEntradaSaida.question(mensagem, (resposta) => {
|
|
209
|
-
resolucao(resposta);
|
|
210
|
-
}));
|
|
211
|
-
}
|
|
212
|
-
visitarExpressaoLeiaMultiplo(expressao) {
|
|
213
|
-
throw new Error('Método não implementado');
|
|
214
|
-
}
|
|
215
|
-
visitarExpressaoLogica(expressao) {
|
|
216
|
-
throw new Error('Método não implementado');
|
|
217
|
-
}
|
|
218
|
-
eVerdadeiro(objeto) {
|
|
219
|
-
if (objeto === null)
|
|
220
|
-
return false;
|
|
221
|
-
if (typeof objeto === 'boolean')
|
|
222
|
-
return Boolean(objeto);
|
|
223
|
-
if (objeto.hasOwnProperty('valor')) {
|
|
224
|
-
return Boolean(objeto.valor);
|
|
225
|
-
}
|
|
226
|
-
return true;
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Executa uma expressão Se, que tem uma condição, pode ter um bloco
|
|
230
|
-
* Senão, e múltiplos blocos Senão-se.
|
|
231
|
-
* @param declaracao A declaração Se.
|
|
232
|
-
* @returns O resultado da avaliação do bloco cuja condição é verdadeira.
|
|
233
|
-
*/
|
|
234
|
-
async visitarDeclaracaoSe(declaracao) {
|
|
235
|
-
if (this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
236
|
-
return await this.executar(declaracao.caminhoEntao);
|
|
237
|
-
}
|
|
238
|
-
if (declaracao.caminhoSenao !== null) {
|
|
239
|
-
return await this.executar(declaracao.caminhoSenao);
|
|
240
|
-
}
|
|
241
|
-
return null;
|
|
242
|
-
}
|
|
243
|
-
visitarDeclaracaoPara(declaracao) {
|
|
244
|
-
return Promise.reject('Método não implementado');
|
|
245
|
-
}
|
|
246
|
-
visitarExpressaoFimPara(declaracao) {
|
|
247
|
-
throw new Error('Método não implementado');
|
|
248
|
-
}
|
|
249
|
-
visitarDeclaracaoFazer(declaracao) {
|
|
250
|
-
throw new Error('Método não implementado');
|
|
251
|
-
}
|
|
252
|
-
async visitarExpressaoFormatacaoEscrita(declaracao) {
|
|
253
|
-
let resultado = '';
|
|
254
|
-
const conteudo = await this.avaliar(declaracao.expressao);
|
|
255
|
-
const valorConteudo = (conteudo === null || conteudo === void 0 ? void 0 : conteudo.hasOwnProperty('valor')) ? conteudo.valor : conteudo;
|
|
256
|
-
const tipoConteudo = conteudo.hasOwnProperty('tipo') ? conteudo.tipo : typeof conteudo;
|
|
257
|
-
resultado = valorConteudo;
|
|
258
|
-
if (['número', 'number'].includes(tipoConteudo) && declaracao.casasDecimais > 0) {
|
|
259
|
-
resultado = valorConteudo.toLocaleString('pt', { maximumFractionDigits: declaracao.casasDecimais });
|
|
260
|
-
}
|
|
261
|
-
if (declaracao.espacos > 0) {
|
|
262
|
-
resultado += ' '.repeat(declaracao.espacos);
|
|
263
|
-
}
|
|
264
|
-
return resultado;
|
|
265
|
-
}
|
|
266
|
-
visitarDeclaracaoEscolha(declaracao) {
|
|
267
|
-
throw new Error('Método não implementado');
|
|
268
|
-
}
|
|
269
|
-
visitarDeclaracaoTente(declaracao) {
|
|
270
|
-
throw new Error('Método não implementado');
|
|
271
|
-
}
|
|
272
|
-
visitarDeclaracaoEnquanto(declaracao) {
|
|
273
|
-
throw new Error('Método não implementado');
|
|
274
|
-
}
|
|
275
|
-
visitarDeclaracaoImportar(declaracao) {
|
|
276
|
-
throw new Error('Método não implementado');
|
|
277
|
-
}
|
|
278
|
-
async avaliarArgumentosEscreva(argumentos) {
|
|
279
|
-
let formatoTexto = '';
|
|
280
|
-
for (const argumento of argumentos) {
|
|
281
|
-
const resultadoAvaliacao = await this.avaliar(argumento);
|
|
282
|
-
let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor')) ? resultadoAvaliacao.valor : resultadoAvaliacao;
|
|
283
|
-
formatoTexto += `${this.paraTexto(valor)} `;
|
|
284
|
-
}
|
|
285
|
-
return formatoTexto.trimEnd();
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
|
|
289
|
-
* alguma função para escrever numa página Web.
|
|
290
|
-
* @param declaracao A declaração.
|
|
291
|
-
* @returns Sempre nulo, por convenção de visita.
|
|
292
|
-
*/
|
|
293
|
-
async visitarDeclaracaoEscreva(declaracao) {
|
|
294
|
-
try {
|
|
295
|
-
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
296
|
-
this.funcaoDeRetorno(formatoTexto);
|
|
297
|
-
return null;
|
|
298
|
-
}
|
|
299
|
-
catch (erro) {
|
|
300
|
-
this.erros.push({
|
|
301
|
-
erroInterno: erro,
|
|
302
|
-
linha: declaracao.linha,
|
|
303
|
-
hashArquivo: declaracao.hashArquivo,
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
|
|
308
|
-
try {
|
|
309
|
-
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
310
|
-
this.funcaoDeRetornoMesmaLinha(formatoTexto);
|
|
311
|
-
return null;
|
|
312
|
-
}
|
|
313
|
-
catch (erro) {
|
|
314
|
-
this.erros.push({
|
|
315
|
-
erroInterno: erro,
|
|
316
|
-
linha: declaracao.linha,
|
|
317
|
-
hashArquivo: declaracao.hashArquivo,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
executarBloco(declaracoes, ambiente) {
|
|
322
|
-
throw new Error('Método não implementado');
|
|
323
|
-
}
|
|
324
|
-
visitarExpressaoBloco(declaracao) {
|
|
325
|
-
throw new Error('Método não implementado');
|
|
326
|
-
}
|
|
327
|
-
async avaliacaoDeclaracaoVar(declaracao) {
|
|
328
|
-
let valorOuOutraVariavel = null;
|
|
329
|
-
if (declaracao.inicializador !== null) {
|
|
330
|
-
valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
|
|
331
|
-
}
|
|
332
|
-
let valorFinal = null;
|
|
333
|
-
if (valorOuOutraVariavel !== null && valorOuOutraVariavel !== undefined) {
|
|
334
|
-
valorFinal = valorOuOutraVariavel.hasOwnProperty('valor')
|
|
335
|
-
? valorOuOutraVariavel.valor
|
|
336
|
-
: valorOuOutraVariavel;
|
|
337
|
-
}
|
|
338
|
-
return valorFinal;
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Executa expressão de definição de variável.
|
|
342
|
-
* @param declaracao A declaração Var
|
|
343
|
-
* @returns Sempre retorna nulo.
|
|
344
|
-
*/
|
|
345
|
-
async visitarDeclaracaoVar(declaracao) {
|
|
346
|
-
const valorFinal = await this.avaliacaoDeclaracaoVar(declaracao);
|
|
347
|
-
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, declaracao.tipo);
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
visitarDeclaracaoVarMultiplo(declaracao) {
|
|
351
|
-
throw new Error('Método não implementado');
|
|
352
|
-
}
|
|
353
|
-
visitarDeclaracaoConst(declaracao) {
|
|
354
|
-
throw new Error('Método não implementado');
|
|
355
|
-
}
|
|
356
|
-
visitarDeclaracaoConstMultiplo(declaracao) {
|
|
357
|
-
throw new Error('Método não implementado');
|
|
358
|
-
}
|
|
359
|
-
visitarExpressaoContinua(declaracao) {
|
|
360
|
-
throw new Error('Método não implementado');
|
|
361
|
-
}
|
|
362
|
-
visitarExpressaoSustar(declaracao) {
|
|
363
|
-
throw new Error('Método não implementado');
|
|
364
|
-
}
|
|
365
|
-
visitarExpressaoRetornar(declaracao) {
|
|
366
|
-
throw new Error('Método não implementado');
|
|
367
|
-
}
|
|
368
|
-
visitarExpressaoDeleguaFuncao(expressao) {
|
|
369
|
-
throw new Error('Método não implementado');
|
|
370
|
-
}
|
|
371
|
-
visitarExpressaoAtribuicaoPorIndice(expressao) {
|
|
372
|
-
throw new Error('Método não implementado');
|
|
373
|
-
}
|
|
374
|
-
visitarExpressaoAcessoIndiceVariavel(expressao) {
|
|
375
|
-
throw new Error('Método não implementado');
|
|
376
|
-
}
|
|
377
|
-
visitarExpressaoDefinirValor(expressao) {
|
|
378
|
-
throw new Error('Método não implementado');
|
|
379
|
-
}
|
|
380
|
-
visitarDeclaracaoDefinicaoFuncao(declaracao) {
|
|
381
|
-
throw new Error('Método não implementado');
|
|
382
|
-
}
|
|
383
|
-
visitarDeclaracaoClasse(declaracao) {
|
|
384
|
-
throw new Error('Método não implementado');
|
|
385
|
-
}
|
|
386
|
-
visitarExpressaoAcessoMetodo(expressao) {
|
|
387
|
-
throw new Error('Método não implementado');
|
|
388
|
-
}
|
|
389
|
-
visitarExpressaoIsto(expressao) {
|
|
390
|
-
throw new Error('Método não implementado');
|
|
391
|
-
}
|
|
392
|
-
visitarExpressaoDicionario(expressao) {
|
|
393
|
-
throw new Error('Método não implementado');
|
|
394
|
-
}
|
|
395
|
-
visitarExpressaoVetor(expressao) {
|
|
396
|
-
throw new Error('Método não implementado');
|
|
397
|
-
}
|
|
398
|
-
visitarExpressaoSuper(expressao) {
|
|
399
|
-
throw new Error('Método não implementado');
|
|
400
|
-
}
|
|
401
|
-
paraTexto(objeto) {
|
|
402
|
-
if (objeto === null || objeto === undefined)
|
|
403
|
-
return 'nulo';
|
|
404
|
-
if (typeof objeto === 'boolean') {
|
|
405
|
-
return objeto ? 'verdadeiro' : 'falso';
|
|
406
|
-
}
|
|
407
|
-
if (objeto instanceof Date) {
|
|
408
|
-
const formato = Intl.DateTimeFormat('pt', {
|
|
409
|
-
dateStyle: 'full',
|
|
410
|
-
timeStyle: 'full',
|
|
411
|
-
});
|
|
412
|
-
return formato.format(objeto);
|
|
413
|
-
}
|
|
414
|
-
if (Array.isArray(objeto))
|
|
415
|
-
return objeto;
|
|
416
|
-
if (objeto.valor instanceof estruturas_1.ObjetoPadrao)
|
|
417
|
-
return objeto.valor.paraTexto();
|
|
418
|
-
if (typeof objeto === 'object')
|
|
419
|
-
return JSON.stringify(objeto);
|
|
420
|
-
return objeto.toString();
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Efetivamente executa uma declaração.
|
|
424
|
-
* @param declaracao A declaração a ser executada.
|
|
425
|
-
* @param mostrarResultado Se resultado deve ser mostrado ou não. Normalmente usado
|
|
426
|
-
* pelo modo LAIR.
|
|
427
|
-
*/
|
|
428
|
-
async executar(declaracao, mostrarResultado = false) {
|
|
429
|
-
const resultado = await declaracao.aceitar(this);
|
|
430
|
-
if (mostrarResultado) {
|
|
431
|
-
this.funcaoDeRetorno(this.paraTexto(resultado));
|
|
432
|
-
}
|
|
433
|
-
if (resultado || typeof resultado === 'boolean') {
|
|
434
|
-
this.resultadoInterpretador.push(this.paraTexto(resultado));
|
|
435
|
-
}
|
|
436
|
-
return resultado;
|
|
437
|
-
}
|
|
438
|
-
visitarDeclaracaoAleatorio(declaracao) {
|
|
439
|
-
throw new Error('Método não implementado.');
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Executa o último escopo empilhado no topo na pilha de escopos do interpretador.
|
|
443
|
-
* Esse método pega exceções, mas apenas as devolve.
|
|
444
|
-
*
|
|
445
|
-
* O tratamento das exceções é feito de acordo com o bloco chamador.
|
|
446
|
-
* Por exemplo, em `tente ... pegue ... finalmente`, a exceção é capturada e tratada.
|
|
447
|
-
* Em outros blocos, pode ser desejável ter o erro em tela.
|
|
448
|
-
* @param manterAmbiente Se verdadeiro, ambiente do topo da pilha de escopo é copiado para o ambiente imediatamente abaixo.
|
|
449
|
-
* @returns O resultado da execução do escopo, se houver.
|
|
450
|
-
*/
|
|
451
|
-
async executarUltimoEscopo(manterAmbiente = false) {
|
|
452
|
-
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
453
|
-
try {
|
|
454
|
-
let retornoExecucao;
|
|
455
|
-
for (; !(retornoExecucao instanceof quebras_1.Quebra) && ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
|
|
456
|
-
retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
|
|
457
|
-
}
|
|
458
|
-
return retornoExecucao;
|
|
459
|
-
}
|
|
460
|
-
catch (erro) {
|
|
461
|
-
return Promise.reject(erro);
|
|
462
|
-
}
|
|
463
|
-
finally {
|
|
464
|
-
this.pilhaEscoposExecucao.removerUltimo();
|
|
465
|
-
if (manterAmbiente) {
|
|
466
|
-
const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
|
|
467
|
-
escopoAnterior.ambiente.valores = Object.assign(escopoAnterior.ambiente.valores, ultimoEscopo.ambiente.valores);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
async interpretar(declaracoes, manterAmbiente) {
|
|
472
|
-
this.erros = [];
|
|
473
|
-
const escopoExecucao = {
|
|
474
|
-
declaracoes: declaracoes,
|
|
475
|
-
declaracaoAtual: 0,
|
|
476
|
-
ambiente: new espaco_variaveis_1.EspacoVariaveis(),
|
|
477
|
-
finalizado: false,
|
|
478
|
-
tipo: 'outro',
|
|
479
|
-
emLacoRepeticao: false,
|
|
480
|
-
};
|
|
481
|
-
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
|
|
482
|
-
try {
|
|
483
|
-
const retornoOuErro = await this.executarUltimoEscopo(manterAmbiente);
|
|
484
|
-
if (retornoOuErro instanceof excecoes_1.ErroEmTempoDeExecucao) {
|
|
485
|
-
this.erros.push(retornoOuErro);
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
catch (erro) {
|
|
489
|
-
this.erros.push(erro);
|
|
490
|
-
}
|
|
491
|
-
finally {
|
|
492
|
-
const retorno = {
|
|
493
|
-
erros: this.erros,
|
|
494
|
-
resultado: this.resultadoInterpretador,
|
|
495
|
-
};
|
|
496
|
-
this.resultadoInterpretador = [];
|
|
497
|
-
return retorno;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
exports.InterpretadorPortugolIpt = InterpretadorPortugolIpt;
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InterpretadorPortugolIpt = void 0;
|
|
7
|
+
const espaco_variaveis_1 = require("../../../espaco-variaveis");
|
|
8
|
+
const estruturas_1 = require("../../../estruturas");
|
|
9
|
+
const excecoes_1 = require("../../../excecoes");
|
|
10
|
+
const quebras_1 = require("../../../quebras");
|
|
11
|
+
const pilha_escopos_execucao_1 = require("../../pilha-escopos-execucao");
|
|
12
|
+
const portugol_ipt_1 = __importDefault(require("../../../tipos-de-simbolos/portugol-ipt"));
|
|
13
|
+
const inferenciador_1 = require("../../inferenciador");
|
|
14
|
+
class InterpretadorPortugolIpt {
|
|
15
|
+
constructor(diretorioBase, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
|
|
16
|
+
this.funcaoDeRetorno = null;
|
|
17
|
+
this.funcaoDeRetornoMesmaLinha = null;
|
|
18
|
+
this.resultadoInterpretador = [];
|
|
19
|
+
this.diretorioBase = diretorioBase;
|
|
20
|
+
this.funcaoDeRetorno = funcaoDeRetorno || console.log;
|
|
21
|
+
this.funcaoDeRetornoMesmaLinha = funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
|
|
22
|
+
this.erros = [];
|
|
23
|
+
this.declaracoes = [];
|
|
24
|
+
this.pilhaEscoposExecucao = new pilha_escopos_execucao_1.PilhaEscoposExecucao();
|
|
25
|
+
const escopoExecucao = {
|
|
26
|
+
declaracoes: [],
|
|
27
|
+
declaracaoAtual: 0,
|
|
28
|
+
ambiente: new espaco_variaveis_1.EspacoVariaveis(),
|
|
29
|
+
finalizado: false,
|
|
30
|
+
tipo: 'outro',
|
|
31
|
+
emLacoRepeticao: false,
|
|
32
|
+
};
|
|
33
|
+
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
|
|
34
|
+
}
|
|
35
|
+
visitarDeclaracaoComentario(declaracao) {
|
|
36
|
+
return Promise.resolve();
|
|
37
|
+
}
|
|
38
|
+
visitarDeclaracaoTendoComo(declaracao) {
|
|
39
|
+
throw new Error('Método não implementado.');
|
|
40
|
+
}
|
|
41
|
+
visitarDeclaracaoInicioAlgoritmo(declaracao) {
|
|
42
|
+
throw new Error('Método não implementado.');
|
|
43
|
+
}
|
|
44
|
+
visitarDeclaracaoCabecalhoPrograma(declaracao) {
|
|
45
|
+
throw new Error('Método não implementado.');
|
|
46
|
+
}
|
|
47
|
+
visitarExpressaoTupla(expressao) {
|
|
48
|
+
throw new Error('Método não implementado.');
|
|
49
|
+
}
|
|
50
|
+
visitarExpressaoAcessoElementoMatriz(expressao) {
|
|
51
|
+
throw new Error('Método não implementado.');
|
|
52
|
+
}
|
|
53
|
+
visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
|
|
54
|
+
throw new Error('Método não implementado.');
|
|
55
|
+
}
|
|
56
|
+
visitarExpressaoExpressaoRegular(expressao) {
|
|
57
|
+
throw new Error('Método não implementado.');
|
|
58
|
+
}
|
|
59
|
+
visitarExpressaoTipoDe(expressao) {
|
|
60
|
+
throw new Error('Método não implementado.');
|
|
61
|
+
}
|
|
62
|
+
visitarExpressaoQualTipo(expressao) {
|
|
63
|
+
throw new Error('Método não implementado.');
|
|
64
|
+
}
|
|
65
|
+
visitarExpressaoFalhar(expressao) {
|
|
66
|
+
throw new Error('Método não implementado.');
|
|
67
|
+
}
|
|
68
|
+
visitarDeclaracaoParaCada(declaracao) {
|
|
69
|
+
throw new Error('Método não implementado.');
|
|
70
|
+
}
|
|
71
|
+
visitarExpressaoLiteral(expressao) {
|
|
72
|
+
return expressao.valor;
|
|
73
|
+
}
|
|
74
|
+
async avaliar(expressao) {
|
|
75
|
+
// Descomente o código abaixo quando precisar detectar expressões undefined ou nulas.
|
|
76
|
+
// Por algum motivo o depurador do VSCode não funciona direito aqui
|
|
77
|
+
// com breakpoint condicional.
|
|
78
|
+
if (expressao === null || expressao === undefined) {
|
|
79
|
+
console.log('Aqui');
|
|
80
|
+
}
|
|
81
|
+
return await expressao.aceitar(this);
|
|
82
|
+
}
|
|
83
|
+
visitarExpressaoAgrupamento(expressao) {
|
|
84
|
+
throw new Error('Método não implementado');
|
|
85
|
+
}
|
|
86
|
+
visitarExpressaoUnaria(expressao) {
|
|
87
|
+
throw new Error('Método não implementado');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Verifica se operandos são números, que podem ser tanto variáveis puras do JavaScript
|
|
91
|
+
* (neste caso, `number`), ou podem ser variáveis de Delégua com inferência (`VariavelInterface`).
|
|
92
|
+
* @param operador O símbolo do operador.
|
|
93
|
+
* @param direita O operando direito.
|
|
94
|
+
* @param esquerda O operando esquerdo.
|
|
95
|
+
* @returns Se ambos os operandos são números ou não.
|
|
96
|
+
*/
|
|
97
|
+
verificarOperandosNumeros(operador, direita, esquerda) {
|
|
98
|
+
const tipoDireita = direita.tipo ? direita.tipo : typeof direita === 'number' ? 'número' : String(NaN);
|
|
99
|
+
const tipoEsquerda = esquerda.tipo
|
|
100
|
+
? esquerda.tipo
|
|
101
|
+
: typeof esquerda === 'number'
|
|
102
|
+
? 'número'
|
|
103
|
+
: String(NaN);
|
|
104
|
+
const tiposNumericos = ['inteiro', 'numero', 'número', 'real'];
|
|
105
|
+
if (tiposNumericos.includes(tipoDireita.toLowerCase()) && tiposNumericos.includes(tipoEsquerda.toLowerCase()))
|
|
106
|
+
return;
|
|
107
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
|
|
108
|
+
}
|
|
109
|
+
eIgual(esquerda, direita) {
|
|
110
|
+
if (esquerda === null && direita === null)
|
|
111
|
+
return true;
|
|
112
|
+
if (esquerda === null)
|
|
113
|
+
return false;
|
|
114
|
+
return esquerda === direita;
|
|
115
|
+
}
|
|
116
|
+
async visitarExpressaoBinaria(expressao) {
|
|
117
|
+
try {
|
|
118
|
+
const esquerda = await this.avaliar(expressao.esquerda);
|
|
119
|
+
const direita = await this.avaliar(expressao.direita);
|
|
120
|
+
const valorEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('valor')) ? esquerda.valor : esquerda;
|
|
121
|
+
const valorDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('valor')) ? direita.valor : direita;
|
|
122
|
+
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
|
|
123
|
+
? esquerda.tipo
|
|
124
|
+
: (0, inferenciador_1.inferirTipoVariavel)(esquerda);
|
|
125
|
+
const tipoDireito = (direita === null || direita === void 0 ? void 0 : direita.hasOwnProperty('tipo')) ? direita.tipo : (0, inferenciador_1.inferirTipoVariavel)(direita);
|
|
126
|
+
switch (expressao.operador.tipo) {
|
|
127
|
+
case portugol_ipt_1.default.EXPONENCIACAO:
|
|
128
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
129
|
+
return Math.pow(valorEsquerdo, valorDireito);
|
|
130
|
+
case portugol_ipt_1.default.MAIOR:
|
|
131
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
132
|
+
return Number(valorEsquerdo) > Number(valorDireito);
|
|
133
|
+
case portugol_ipt_1.default.MAIOR_IGUAL:
|
|
134
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
135
|
+
return Number(valorEsquerdo) >= Number(valorDireito);
|
|
136
|
+
case portugol_ipt_1.default.MENOR:
|
|
137
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
138
|
+
return Number(valorEsquerdo) < Number(valorDireito);
|
|
139
|
+
case portugol_ipt_1.default.MENOR_IGUAL:
|
|
140
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
141
|
+
return Number(valorEsquerdo) <= Number(valorDireito);
|
|
142
|
+
case portugol_ipt_1.default.SUBTRACAO:
|
|
143
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
144
|
+
return Number(valorEsquerdo) - Number(valorDireito);
|
|
145
|
+
case portugol_ipt_1.default.ADICAO:
|
|
146
|
+
if (tipoEsquerdo === 'número' && tipoDireito === 'número') {
|
|
147
|
+
return Number(valorEsquerdo) + Number(valorDireito);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
return String(valorEsquerdo) + String(valorDireito);
|
|
151
|
+
}
|
|
152
|
+
case portugol_ipt_1.default.DIVISAO:
|
|
153
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
154
|
+
return Number(valorEsquerdo) / Number(valorDireito);
|
|
155
|
+
case portugol_ipt_1.default.DIVISAO_INTEIRA:
|
|
156
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
157
|
+
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
158
|
+
case portugol_ipt_1.default.MULTIPLICACAO:
|
|
159
|
+
if (tipoEsquerdo === 'texto' || tipoDireito === 'texto') {
|
|
160
|
+
// Sem ambos os valores resolvem como texto, multiplica normal.
|
|
161
|
+
// Se apenas um resolve como texto, o outro repete o
|
|
162
|
+
// texto n vezes, sendo n o valor do outro.
|
|
163
|
+
if (tipoEsquerdo === 'texto' && tipoDireito === 'texto') {
|
|
164
|
+
return Number(valorEsquerdo) * Number(valorDireito);
|
|
165
|
+
}
|
|
166
|
+
if (tipoEsquerdo === 'texto') {
|
|
167
|
+
return valorEsquerdo.repeat(Number(valorDireito));
|
|
168
|
+
}
|
|
169
|
+
return valorDireito.repeat(Number(valorEsquerdo));
|
|
170
|
+
}
|
|
171
|
+
return Number(valorEsquerdo) * Number(valorDireito);
|
|
172
|
+
case portugol_ipt_1.default.MODULO:
|
|
173
|
+
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
174
|
+
return Number(valorEsquerdo) % Number(valorDireito);
|
|
175
|
+
case portugol_ipt_1.default.DIFERENTE:
|
|
176
|
+
return !this.eIgual(valorEsquerdo, valorDireito);
|
|
177
|
+
case portugol_ipt_1.default.IGUAL:
|
|
178
|
+
return this.eIgual(valorEsquerdo, valorDireito);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (erro) {
|
|
182
|
+
return Promise.reject(erro);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
visitarExpressaoDeChamada(expressao) {
|
|
186
|
+
throw new Error('Método não implementado');
|
|
187
|
+
}
|
|
188
|
+
visitarExpressaoDeAtribuicao(expressao) {
|
|
189
|
+
throw new Error('Método não implementado');
|
|
190
|
+
}
|
|
191
|
+
procurarVariavel(simbolo) {
|
|
192
|
+
return this.pilhaEscoposExecucao.obterValorVariavel(simbolo);
|
|
193
|
+
}
|
|
194
|
+
visitarExpressaoDeVariavel(expressao) {
|
|
195
|
+
return this.procurarVariavel(expressao.simbolo);
|
|
196
|
+
}
|
|
197
|
+
visitarDeclaracaoDeExpressao(declaracao) {
|
|
198
|
+
throw new Error('Método não implementado');
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Execução da leitura de valores da entrada configurada no
|
|
202
|
+
* início da aplicação.
|
|
203
|
+
* @param expressao Expressão do tipo Leia
|
|
204
|
+
* @returns Promise com o resultado da leitura.
|
|
205
|
+
*/
|
|
206
|
+
async visitarExpressaoLeia(expressao) {
|
|
207
|
+
const mensagem = expressao.argumentos && expressao.argumentos[0] ? expressao.argumentos[0].valor : '> ';
|
|
208
|
+
return new Promise((resolucao) => this.interfaceEntradaSaida.question(mensagem, (resposta) => {
|
|
209
|
+
resolucao(resposta);
|
|
210
|
+
}));
|
|
211
|
+
}
|
|
212
|
+
visitarExpressaoLeiaMultiplo(expressao) {
|
|
213
|
+
throw new Error('Método não implementado');
|
|
214
|
+
}
|
|
215
|
+
visitarExpressaoLogica(expressao) {
|
|
216
|
+
throw new Error('Método não implementado');
|
|
217
|
+
}
|
|
218
|
+
eVerdadeiro(objeto) {
|
|
219
|
+
if (objeto === null)
|
|
220
|
+
return false;
|
|
221
|
+
if (typeof objeto === 'boolean')
|
|
222
|
+
return Boolean(objeto);
|
|
223
|
+
if (objeto.hasOwnProperty('valor')) {
|
|
224
|
+
return Boolean(objeto.valor);
|
|
225
|
+
}
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Executa uma expressão Se, que tem uma condição, pode ter um bloco
|
|
230
|
+
* Senão, e múltiplos blocos Senão-se.
|
|
231
|
+
* @param declaracao A declaração Se.
|
|
232
|
+
* @returns O resultado da avaliação do bloco cuja condição é verdadeira.
|
|
233
|
+
*/
|
|
234
|
+
async visitarDeclaracaoSe(declaracao) {
|
|
235
|
+
if (this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
236
|
+
return await this.executar(declaracao.caminhoEntao);
|
|
237
|
+
}
|
|
238
|
+
if (declaracao.caminhoSenao !== null) {
|
|
239
|
+
return await this.executar(declaracao.caminhoSenao);
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
visitarDeclaracaoPara(declaracao) {
|
|
244
|
+
return Promise.reject('Método não implementado');
|
|
245
|
+
}
|
|
246
|
+
visitarExpressaoFimPara(declaracao) {
|
|
247
|
+
throw new Error('Método não implementado');
|
|
248
|
+
}
|
|
249
|
+
visitarDeclaracaoFazer(declaracao) {
|
|
250
|
+
throw new Error('Método não implementado');
|
|
251
|
+
}
|
|
252
|
+
async visitarExpressaoFormatacaoEscrita(declaracao) {
|
|
253
|
+
let resultado = '';
|
|
254
|
+
const conteudo = await this.avaliar(declaracao.expressao);
|
|
255
|
+
const valorConteudo = (conteudo === null || conteudo === void 0 ? void 0 : conteudo.hasOwnProperty('valor')) ? conteudo.valor : conteudo;
|
|
256
|
+
const tipoConteudo = conteudo.hasOwnProperty('tipo') ? conteudo.tipo : typeof conteudo;
|
|
257
|
+
resultado = valorConteudo;
|
|
258
|
+
if (['número', 'number'].includes(tipoConteudo) && declaracao.casasDecimais > 0) {
|
|
259
|
+
resultado = valorConteudo.toLocaleString('pt', { maximumFractionDigits: declaracao.casasDecimais });
|
|
260
|
+
}
|
|
261
|
+
if (declaracao.espacos > 0) {
|
|
262
|
+
resultado += ' '.repeat(declaracao.espacos);
|
|
263
|
+
}
|
|
264
|
+
return resultado;
|
|
265
|
+
}
|
|
266
|
+
visitarDeclaracaoEscolha(declaracao) {
|
|
267
|
+
throw new Error('Método não implementado');
|
|
268
|
+
}
|
|
269
|
+
visitarDeclaracaoTente(declaracao) {
|
|
270
|
+
throw new Error('Método não implementado');
|
|
271
|
+
}
|
|
272
|
+
visitarDeclaracaoEnquanto(declaracao) {
|
|
273
|
+
throw new Error('Método não implementado');
|
|
274
|
+
}
|
|
275
|
+
visitarDeclaracaoImportar(declaracao) {
|
|
276
|
+
throw new Error('Método não implementado');
|
|
277
|
+
}
|
|
278
|
+
async avaliarArgumentosEscreva(argumentos) {
|
|
279
|
+
let formatoTexto = '';
|
|
280
|
+
for (const argumento of argumentos) {
|
|
281
|
+
const resultadoAvaliacao = await this.avaliar(argumento);
|
|
282
|
+
let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor')) ? resultadoAvaliacao.valor : resultadoAvaliacao;
|
|
283
|
+
formatoTexto += `${this.paraTexto(valor)} `;
|
|
284
|
+
}
|
|
285
|
+
return formatoTexto.trimEnd();
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
|
|
289
|
+
* alguma função para escrever numa página Web.
|
|
290
|
+
* @param declaracao A declaração.
|
|
291
|
+
* @returns Sempre nulo, por convenção de visita.
|
|
292
|
+
*/
|
|
293
|
+
async visitarDeclaracaoEscreva(declaracao) {
|
|
294
|
+
try {
|
|
295
|
+
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
296
|
+
this.funcaoDeRetorno(formatoTexto);
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
catch (erro) {
|
|
300
|
+
this.erros.push({
|
|
301
|
+
erroInterno: erro,
|
|
302
|
+
linha: declaracao.linha,
|
|
303
|
+
hashArquivo: declaracao.hashArquivo,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
|
|
308
|
+
try {
|
|
309
|
+
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
310
|
+
this.funcaoDeRetornoMesmaLinha(formatoTexto);
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
catch (erro) {
|
|
314
|
+
this.erros.push({
|
|
315
|
+
erroInterno: erro,
|
|
316
|
+
linha: declaracao.linha,
|
|
317
|
+
hashArquivo: declaracao.hashArquivo,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
executarBloco(declaracoes, ambiente) {
|
|
322
|
+
throw new Error('Método não implementado');
|
|
323
|
+
}
|
|
324
|
+
visitarExpressaoBloco(declaracao) {
|
|
325
|
+
throw new Error('Método não implementado');
|
|
326
|
+
}
|
|
327
|
+
async avaliacaoDeclaracaoVar(declaracao) {
|
|
328
|
+
let valorOuOutraVariavel = null;
|
|
329
|
+
if (declaracao.inicializador !== null) {
|
|
330
|
+
valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
|
|
331
|
+
}
|
|
332
|
+
let valorFinal = null;
|
|
333
|
+
if (valorOuOutraVariavel !== null && valorOuOutraVariavel !== undefined) {
|
|
334
|
+
valorFinal = valorOuOutraVariavel.hasOwnProperty('valor')
|
|
335
|
+
? valorOuOutraVariavel.valor
|
|
336
|
+
: valorOuOutraVariavel;
|
|
337
|
+
}
|
|
338
|
+
return valorFinal;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Executa expressão de definição de variável.
|
|
342
|
+
* @param declaracao A declaração Var
|
|
343
|
+
* @returns Sempre retorna nulo.
|
|
344
|
+
*/
|
|
345
|
+
async visitarDeclaracaoVar(declaracao) {
|
|
346
|
+
const valorFinal = await this.avaliacaoDeclaracaoVar(declaracao);
|
|
347
|
+
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, valorFinal, declaracao.tipo);
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
visitarDeclaracaoVarMultiplo(declaracao) {
|
|
351
|
+
throw new Error('Método não implementado');
|
|
352
|
+
}
|
|
353
|
+
visitarDeclaracaoConst(declaracao) {
|
|
354
|
+
throw new Error('Método não implementado');
|
|
355
|
+
}
|
|
356
|
+
visitarDeclaracaoConstMultiplo(declaracao) {
|
|
357
|
+
throw new Error('Método não implementado');
|
|
358
|
+
}
|
|
359
|
+
visitarExpressaoContinua(declaracao) {
|
|
360
|
+
throw new Error('Método não implementado');
|
|
361
|
+
}
|
|
362
|
+
visitarExpressaoSustar(declaracao) {
|
|
363
|
+
throw new Error('Método não implementado');
|
|
364
|
+
}
|
|
365
|
+
visitarExpressaoRetornar(declaracao) {
|
|
366
|
+
throw new Error('Método não implementado');
|
|
367
|
+
}
|
|
368
|
+
visitarExpressaoDeleguaFuncao(expressao) {
|
|
369
|
+
throw new Error('Método não implementado');
|
|
370
|
+
}
|
|
371
|
+
visitarExpressaoAtribuicaoPorIndice(expressao) {
|
|
372
|
+
throw new Error('Método não implementado');
|
|
373
|
+
}
|
|
374
|
+
visitarExpressaoAcessoIndiceVariavel(expressao) {
|
|
375
|
+
throw new Error('Método não implementado');
|
|
376
|
+
}
|
|
377
|
+
visitarExpressaoDefinirValor(expressao) {
|
|
378
|
+
throw new Error('Método não implementado');
|
|
379
|
+
}
|
|
380
|
+
visitarDeclaracaoDefinicaoFuncao(declaracao) {
|
|
381
|
+
throw new Error('Método não implementado');
|
|
382
|
+
}
|
|
383
|
+
visitarDeclaracaoClasse(declaracao) {
|
|
384
|
+
throw new Error('Método não implementado');
|
|
385
|
+
}
|
|
386
|
+
visitarExpressaoAcessoMetodo(expressao) {
|
|
387
|
+
throw new Error('Método não implementado');
|
|
388
|
+
}
|
|
389
|
+
visitarExpressaoIsto(expressao) {
|
|
390
|
+
throw new Error('Método não implementado');
|
|
391
|
+
}
|
|
392
|
+
visitarExpressaoDicionario(expressao) {
|
|
393
|
+
throw new Error('Método não implementado');
|
|
394
|
+
}
|
|
395
|
+
visitarExpressaoVetor(expressao) {
|
|
396
|
+
throw new Error('Método não implementado');
|
|
397
|
+
}
|
|
398
|
+
visitarExpressaoSuper(expressao) {
|
|
399
|
+
throw new Error('Método não implementado');
|
|
400
|
+
}
|
|
401
|
+
paraTexto(objeto) {
|
|
402
|
+
if (objeto === null || objeto === undefined)
|
|
403
|
+
return 'nulo';
|
|
404
|
+
if (typeof objeto === 'boolean') {
|
|
405
|
+
return objeto ? 'verdadeiro' : 'falso';
|
|
406
|
+
}
|
|
407
|
+
if (objeto instanceof Date) {
|
|
408
|
+
const formato = Intl.DateTimeFormat('pt', {
|
|
409
|
+
dateStyle: 'full',
|
|
410
|
+
timeStyle: 'full',
|
|
411
|
+
});
|
|
412
|
+
return formato.format(objeto);
|
|
413
|
+
}
|
|
414
|
+
if (Array.isArray(objeto))
|
|
415
|
+
return objeto;
|
|
416
|
+
if (objeto.valor instanceof estruturas_1.ObjetoPadrao)
|
|
417
|
+
return objeto.valor.paraTexto();
|
|
418
|
+
if (typeof objeto === 'object')
|
|
419
|
+
return JSON.stringify(objeto);
|
|
420
|
+
return objeto.toString();
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Efetivamente executa uma declaração.
|
|
424
|
+
* @param declaracao A declaração a ser executada.
|
|
425
|
+
* @param mostrarResultado Se resultado deve ser mostrado ou não. Normalmente usado
|
|
426
|
+
* pelo modo LAIR.
|
|
427
|
+
*/
|
|
428
|
+
async executar(declaracao, mostrarResultado = false) {
|
|
429
|
+
const resultado = await declaracao.aceitar(this);
|
|
430
|
+
if (mostrarResultado) {
|
|
431
|
+
this.funcaoDeRetorno(this.paraTexto(resultado));
|
|
432
|
+
}
|
|
433
|
+
if (resultado || typeof resultado === 'boolean') {
|
|
434
|
+
this.resultadoInterpretador.push(this.paraTexto(resultado));
|
|
435
|
+
}
|
|
436
|
+
return resultado;
|
|
437
|
+
}
|
|
438
|
+
visitarDeclaracaoAleatorio(declaracao) {
|
|
439
|
+
throw new Error('Método não implementado.');
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Executa o último escopo empilhado no topo na pilha de escopos do interpretador.
|
|
443
|
+
* Esse método pega exceções, mas apenas as devolve.
|
|
444
|
+
*
|
|
445
|
+
* O tratamento das exceções é feito de acordo com o bloco chamador.
|
|
446
|
+
* Por exemplo, em `tente ... pegue ... finalmente`, a exceção é capturada e tratada.
|
|
447
|
+
* Em outros blocos, pode ser desejável ter o erro em tela.
|
|
448
|
+
* @param manterAmbiente Se verdadeiro, ambiente do topo da pilha de escopo é copiado para o ambiente imediatamente abaixo.
|
|
449
|
+
* @returns O resultado da execução do escopo, se houver.
|
|
450
|
+
*/
|
|
451
|
+
async executarUltimoEscopo(manterAmbiente = false) {
|
|
452
|
+
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
453
|
+
try {
|
|
454
|
+
let retornoExecucao;
|
|
455
|
+
for (; !(retornoExecucao instanceof quebras_1.Quebra) && ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
|
|
456
|
+
retornoExecucao = await this.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
|
|
457
|
+
}
|
|
458
|
+
return retornoExecucao;
|
|
459
|
+
}
|
|
460
|
+
catch (erro) {
|
|
461
|
+
return Promise.reject(erro);
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
this.pilhaEscoposExecucao.removerUltimo();
|
|
465
|
+
if (manterAmbiente) {
|
|
466
|
+
const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
|
|
467
|
+
escopoAnterior.ambiente.valores = Object.assign(escopoAnterior.ambiente.valores, ultimoEscopo.ambiente.valores);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
async interpretar(declaracoes, manterAmbiente) {
|
|
472
|
+
this.erros = [];
|
|
473
|
+
const escopoExecucao = {
|
|
474
|
+
declaracoes: declaracoes,
|
|
475
|
+
declaracaoAtual: 0,
|
|
476
|
+
ambiente: new espaco_variaveis_1.EspacoVariaveis(),
|
|
477
|
+
finalizado: false,
|
|
478
|
+
tipo: 'outro',
|
|
479
|
+
emLacoRepeticao: false,
|
|
480
|
+
};
|
|
481
|
+
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
|
|
482
|
+
try {
|
|
483
|
+
const retornoOuErro = await this.executarUltimoEscopo(manterAmbiente);
|
|
484
|
+
if (retornoOuErro instanceof excecoes_1.ErroEmTempoDeExecucao) {
|
|
485
|
+
this.erros.push(retornoOuErro);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
catch (erro) {
|
|
489
|
+
this.erros.push(erro);
|
|
490
|
+
}
|
|
491
|
+
finally {
|
|
492
|
+
const retorno = {
|
|
493
|
+
erros: this.erros,
|
|
494
|
+
resultado: this.resultadoInterpretador,
|
|
495
|
+
};
|
|
496
|
+
this.resultadoInterpretador = [];
|
|
497
|
+
return retorno;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
exports.InterpretadorPortugolIpt = InterpretadorPortugolIpt;
|
|
502
502
|
//# sourceMappingURL=interpretador-portugol-ipt.js.map
|