@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,443 +1,443 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AnalisadorSemantico = void 0;
|
|
4
|
-
const construtos_1 = require("../construtos");
|
|
5
|
-
const declaracoes_1 = require("../declaracoes");
|
|
6
|
-
const erros_1 = require("../interfaces/erros");
|
|
7
|
-
const analisador_semantico_base_1 = require("./analisador-semantico-base");
|
|
8
|
-
const pilha_variaveis_1 = require("./pilha-variaveis");
|
|
9
|
-
class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemanticoBase {
|
|
10
|
-
constructor() {
|
|
11
|
-
super();
|
|
12
|
-
this.pilhaVariaveis = new pilha_variaveis_1.PilhaVariaveis();
|
|
13
|
-
this.variaveis = {};
|
|
14
|
-
this.funcoes = {};
|
|
15
|
-
this.atual = 0;
|
|
16
|
-
this.diagnosticos = [];
|
|
17
|
-
}
|
|
18
|
-
erro(simbolo, mensagem) {
|
|
19
|
-
this.diagnosticos.push({
|
|
20
|
-
simbolo: simbolo,
|
|
21
|
-
mensagem: mensagem,
|
|
22
|
-
hashArquivo: simbolo.hashArquivo,
|
|
23
|
-
linha: simbolo.linha,
|
|
24
|
-
severidade: erros_1.DiagnosticoSeveridade.ERRO,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
aviso(simbolo, mensagem) {
|
|
28
|
-
this.diagnosticos.push({
|
|
29
|
-
simbolo: simbolo,
|
|
30
|
-
mensagem: mensagem,
|
|
31
|
-
hashArquivo: simbolo.hashArquivo,
|
|
32
|
-
linha: simbolo.linha,
|
|
33
|
-
severidade: erros_1.DiagnosticoSeveridade.AVISO,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
verificarTipoAtribuido(declaracao) {
|
|
37
|
-
if (declaracao.tipo) {
|
|
38
|
-
if (['vetor', 'qualquer[]', 'inteiro[]', 'texto[]'].includes(declaracao.tipo)) {
|
|
39
|
-
if (declaracao.inicializador instanceof construtos_1.Vetor) {
|
|
40
|
-
const vetor = declaracao.inicializador;
|
|
41
|
-
if (declaracao.tipo === 'inteiro[]') {
|
|
42
|
-
const v = vetor.valores.find((v) => typeof (v === null || v === void 0 ? void 0 : v.valor) !== 'number');
|
|
43
|
-
if (v) {
|
|
44
|
-
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um vetor de 'inteiros' ou 'real'.`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
if (declaracao.tipo === 'texto[]') {
|
|
48
|
-
const v = vetor.valores.find((v) => typeof (v === null || v === void 0 ? void 0 : v.valor) !== 'string');
|
|
49
|
-
if (v) {
|
|
50
|
-
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um vetor de 'texto'.`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um vetor de elementos.`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (declaracao.inicializador instanceof construtos_1.Literal) {
|
|
59
|
-
const literal = declaracao.inicializador;
|
|
60
|
-
if (declaracao.tipo === 'texto') {
|
|
61
|
-
if (typeof literal.valor !== 'string') {
|
|
62
|
-
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um 'texto'.`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if (['inteiro', 'real'].includes(declaracao.tipo)) {
|
|
66
|
-
if (typeof literal.valor !== 'number') {
|
|
67
|
-
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um 'número'.`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (declaracao.inicializador instanceof declaracoes_1.Leia) {
|
|
72
|
-
if (declaracao.tipo !== 'texto') {
|
|
73
|
-
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', Leia só pode receber tipo 'texto'.`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
visitarExpressaoTipoDe(expressao) {
|
|
79
|
-
return this.verificarTipoDe(expressao.valor);
|
|
80
|
-
}
|
|
81
|
-
verificarTipoDe(valor) {
|
|
82
|
-
if (valor instanceof construtos_1.Binario) {
|
|
83
|
-
this.verificarTipoDe(valor.direita);
|
|
84
|
-
this.verificarTipoDe(valor.esquerda);
|
|
85
|
-
}
|
|
86
|
-
if (valor instanceof construtos_1.Agrupamento) {
|
|
87
|
-
return this.verificarTipoDe(valor.expressao);
|
|
88
|
-
}
|
|
89
|
-
if (valor instanceof construtos_1.Variavel) {
|
|
90
|
-
return this.verificarVariavel(valor);
|
|
91
|
-
}
|
|
92
|
-
return Promise.resolve();
|
|
93
|
-
}
|
|
94
|
-
visitarExpressaoFalhar(expressao) {
|
|
95
|
-
return this.verificarFalhar(expressao.explicacao);
|
|
96
|
-
}
|
|
97
|
-
verificarFalhar(valor) {
|
|
98
|
-
if (valor instanceof construtos_1.Binario) {
|
|
99
|
-
this.verificarFalhar(valor.direita);
|
|
100
|
-
this.verificarFalhar(valor.esquerda);
|
|
101
|
-
}
|
|
102
|
-
if (valor instanceof construtos_1.Agrupamento) {
|
|
103
|
-
return this.verificarFalhar(valor.expressao);
|
|
104
|
-
}
|
|
105
|
-
if (valor instanceof construtos_1.Variavel) {
|
|
106
|
-
return this.verificarVariavel(valor);
|
|
107
|
-
}
|
|
108
|
-
return Promise.resolve();
|
|
109
|
-
}
|
|
110
|
-
visitarExpressaoDeChamada(expressao) {
|
|
111
|
-
var _a, _b;
|
|
112
|
-
if (expressao.entidadeChamada instanceof construtos_1.Variavel) {
|
|
113
|
-
const variavel = expressao.entidadeChamada;
|
|
114
|
-
const funcaoChamada = this.variaveis[variavel.simbolo.lexema] || this.funcoes[variavel.simbolo.lexema];
|
|
115
|
-
if (!funcaoChamada) {
|
|
116
|
-
this.erro(expressao.entidadeChamada.simbolo, `Chamada da função '${expressao.entidadeChamada.simbolo.lexema}' não existe.`);
|
|
117
|
-
return Promise.resolve();
|
|
118
|
-
}
|
|
119
|
-
const funcao = funcaoChamada.valor;
|
|
120
|
-
if (funcao.parametros.length !== expressao.argumentos.length) {
|
|
121
|
-
this.erro(expressao.entidadeChamada.simbolo, `Função '${expressao.entidadeChamada.simbolo.lexema}' espera ${funcao.parametros.length} parametros.`);
|
|
122
|
-
}
|
|
123
|
-
for (let [indice, arg0] of funcao.parametros.entries()) {
|
|
124
|
-
const arg1 = expressao.argumentos[indice];
|
|
125
|
-
if (arg1) {
|
|
126
|
-
if (((_a = arg0.tipoDado) === null || _a === void 0 ? void 0 : _a.tipo) === 'texto' && typeof arg1.valor !== 'string') {
|
|
127
|
-
this.erro(expressao.entidadeChamada.simbolo, `O valor passado para o parâmetro '${arg0.tipoDado.nome}' é diferente do esperado pela função.`);
|
|
128
|
-
}
|
|
129
|
-
else if (['inteiro', 'real'].includes((_b = arg0.tipoDado) === null || _b === void 0 ? void 0 : _b.tipo) && typeof arg1.valor !== 'number') {
|
|
130
|
-
this.erro(expressao.entidadeChamada.simbolo, `O valor passado para o parâmetro '${arg0.tipoDado.nome}' é diferente do esperado pela função.`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return Promise.resolve();
|
|
136
|
-
}
|
|
137
|
-
visitarExpressaoDeAtribuicao(expressao) {
|
|
138
|
-
let valor = this.variaveis[expressao.simbolo.lexema];
|
|
139
|
-
if (!valor) {
|
|
140
|
-
this.erro(expressao.simbolo, `Variável ${expressao.simbolo.lexema} ainda não foi declarada até este ponto.`);
|
|
141
|
-
return Promise.resolve();
|
|
142
|
-
}
|
|
143
|
-
if (valor.tipo) {
|
|
144
|
-
if (expressao.valor instanceof construtos_1.Literal && valor.tipo.includes('[]')) {
|
|
145
|
-
this.erro(expressao.simbolo, `Atribuição inválida, esperado tipo '${valor.tipo}' na atribuição.`);
|
|
146
|
-
return Promise.resolve();
|
|
147
|
-
}
|
|
148
|
-
if (expressao.valor instanceof construtos_1.Vetor && !valor.tipo.includes('[]')) {
|
|
149
|
-
this.erro(expressao.simbolo, `Atribuição inválida, esperado tipo '${valor.tipo}' na atribuição.`);
|
|
150
|
-
return Promise.resolve();
|
|
151
|
-
}
|
|
152
|
-
if (expressao.valor instanceof construtos_1.Literal) {
|
|
153
|
-
let valorLiteral = typeof expressao.valor.valor;
|
|
154
|
-
if (!['qualquer'].includes(valor.tipo)) {
|
|
155
|
-
if (valorLiteral === 'string') {
|
|
156
|
-
if (valor.tipo != 'texto') {
|
|
157
|
-
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
158
|
-
return Promise.resolve();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
if (valorLiteral === 'number') {
|
|
162
|
-
if (!['inteiro', 'real'].includes(valor.tipo)) {
|
|
163
|
-
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
164
|
-
return Promise.resolve();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
if (expressao.valor instanceof construtos_1.Vetor) {
|
|
170
|
-
let valores = expressao.valor.valores;
|
|
171
|
-
if (!['qualquer[]'].includes(valor.tipo)) {
|
|
172
|
-
if (valor.tipo === 'texto[]') {
|
|
173
|
-
if (!valores.every((v) => typeof v.valor === 'string')) {
|
|
174
|
-
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
175
|
-
return Promise.resolve();
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
if (['inteiro[]', 'numero[]'].includes(valor.tipo)) {
|
|
179
|
-
if (!valores.every((v) => typeof v.valor === 'number')) {
|
|
180
|
-
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
181
|
-
return Promise.resolve();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
if (valor.imutavel) {
|
|
188
|
-
this.erro(expressao.simbolo, `Constante ${expressao.simbolo.lexema} não pode ser modificada.`);
|
|
189
|
-
return Promise.resolve();
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
if (this.variaveis[expressao.simbolo.lexema]) {
|
|
193
|
-
this.variaveis[expressao.simbolo.lexema].valor = expressao.valor;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
async visitarDeclaracaoDeExpressao(declaracao) {
|
|
198
|
-
return await declaracao.expressao.aceitar(this);
|
|
199
|
-
}
|
|
200
|
-
visitarDeclaracaoEscolha(declaracao) {
|
|
201
|
-
var _a, _b;
|
|
202
|
-
const identificadorOuLiteral = declaracao.identificadorOuLiteral;
|
|
203
|
-
const valor = (_b = this.variaveis[(_a = identificadorOuLiteral.simbolo) === null || _a === void 0 ? void 0 : _a.lexema]) === null || _b === void 0 ? void 0 : _b.valor;
|
|
204
|
-
const tipo = typeof valor;
|
|
205
|
-
for (let caminho of declaracao.caminhos) {
|
|
206
|
-
for (let condicao of caminho.condicoes) {
|
|
207
|
-
if (valor instanceof declaracoes_1.Leia && typeof (condicao === null || condicao === void 0 ? void 0 : condicao.valor) !== 'string') {
|
|
208
|
-
this.erro(condicao, `'caso ${condicao.valor}:' não é do mesmo tipo esperado em 'escolha'`);
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
if (!(valor instanceof declaracoes_1.Leia) && typeof (condicao === null || condicao === void 0 ? void 0 : condicao.valor) !== tipo) {
|
|
212
|
-
this.erro(condicao, `'caso ${condicao.valor}:' não é do mesmo tipo esperado em 'escolha'`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return Promise.resolve();
|
|
217
|
-
}
|
|
218
|
-
visitarDeclaracaoEnquanto(declaracao) {
|
|
219
|
-
return this.verificarCondicao(declaracao.condicao);
|
|
220
|
-
}
|
|
221
|
-
verificarCondicao(condicao) {
|
|
222
|
-
if (condicao instanceof construtos_1.Agrupamento) {
|
|
223
|
-
return this.verificarCondicao(condicao.expressao);
|
|
224
|
-
}
|
|
225
|
-
if (condicao instanceof construtos_1.Variavel) {
|
|
226
|
-
return this.verificarVariavelBinaria(condicao);
|
|
227
|
-
}
|
|
228
|
-
if (condicao instanceof construtos_1.Binario) {
|
|
229
|
-
return this.verificarBinario(condicao);
|
|
230
|
-
}
|
|
231
|
-
if (condicao instanceof construtos_1.Logico) {
|
|
232
|
-
return this.verificarLogico(condicao);
|
|
233
|
-
}
|
|
234
|
-
if (condicao instanceof construtos_1.Chamada) {
|
|
235
|
-
return this.verificarChamada(condicao);
|
|
236
|
-
}
|
|
237
|
-
return Promise.resolve();
|
|
238
|
-
}
|
|
239
|
-
verificarVariavelBinaria(variavel) {
|
|
240
|
-
this.verificarVariavel(variavel);
|
|
241
|
-
const variavelHipotetica = this.variaveis[variavel.simbolo.lexema];
|
|
242
|
-
if (variavelHipotetica &&
|
|
243
|
-
!(variavelHipotetica.valor instanceof construtos_1.Binario) &&
|
|
244
|
-
typeof variavelHipotetica.valor !== 'boolean') {
|
|
245
|
-
this.erro(variavel.simbolo, `Esperado tipo 'lógico' na condição do 'enquanto'.`);
|
|
246
|
-
}
|
|
247
|
-
return Promise.resolve();
|
|
248
|
-
}
|
|
249
|
-
verificarVariavel(variavel) {
|
|
250
|
-
const variavelHipotetica = this.variaveis[variavel.simbolo.lexema];
|
|
251
|
-
if (!variavelHipotetica) {
|
|
252
|
-
this.erro(variavel.simbolo, `Variável ${variavel.simbolo.lexema} ainda não foi declarada até este ponto.`);
|
|
253
|
-
}
|
|
254
|
-
return Promise.resolve();
|
|
255
|
-
}
|
|
256
|
-
verificarBinario(binario) {
|
|
257
|
-
this.verificarLadoBinario(binario.direita);
|
|
258
|
-
this.verificarLadoBinario(binario.esquerda);
|
|
259
|
-
this.verificarOperadorBinario(binario);
|
|
260
|
-
return Promise.resolve();
|
|
261
|
-
}
|
|
262
|
-
verificarOperadorBinario(binario) {
|
|
263
|
-
var _a, _b, _c;
|
|
264
|
-
const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
|
|
265
|
-
if (operadoresMatematicos.includes(binario.operador.tipo)) {
|
|
266
|
-
if (binario.direita instanceof construtos_1.Variavel && binario.esquerda instanceof construtos_1.Variavel) {
|
|
267
|
-
const tipoDireita = typeof ((_a = this.variaveis[binario.direita.simbolo.lexema]) === null || _a === void 0 ? void 0 : _a.valor);
|
|
268
|
-
const tipoEsquerda = typeof ((_b = this.variaveis[binario.esquerda.simbolo.lexema]) === null || _b === void 0 ? void 0 : _b.valor);
|
|
269
|
-
if (tipoDireita !== tipoEsquerda) {
|
|
270
|
-
this.erro(binario.operador, `Operação inválida, tipos diferentes.`);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
if (binario.operador.tipo === 'DIVISAO') {
|
|
275
|
-
switch (binario.direita.constructor.name) {
|
|
276
|
-
case 'Variavel':
|
|
277
|
-
const operadorDireitoLiteral = binario.direita;
|
|
278
|
-
if (((_c = this.variaveis[operadorDireitoLiteral.simbolo.lexema]) === null || _c === void 0 ? void 0 : _c.valor) === 0) {
|
|
279
|
-
this.erro(binario.operador, `Divisão por zero.`);
|
|
280
|
-
}
|
|
281
|
-
break;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
verificarLadoBinario(lado) {
|
|
286
|
-
if (lado instanceof construtos_1.Variavel && !this.variaveis[lado.simbolo.lexema]) {
|
|
287
|
-
this.erro(lado.simbolo, `Variável ${lado.simbolo.lexema} ainda não foi declarada até este ponto.`);
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
if (lado instanceof construtos_1.Binario) {
|
|
291
|
-
this.verificarBinario(lado);
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
verificarLogico(logio) {
|
|
296
|
-
this.verificarLadoLogico(logio.direita);
|
|
297
|
-
this.verificarLadoLogico(logio.esquerda);
|
|
298
|
-
return Promise.resolve();
|
|
299
|
-
}
|
|
300
|
-
verificarChamada(chamada) {
|
|
301
|
-
let funcaoChamada = chamada.entidadeChamada;
|
|
302
|
-
if (!this.funcoes[funcaoChamada.simbolo.lexema]) {
|
|
303
|
-
this.erro(funcaoChamada.simbolo, `Chamada da função '${funcaoChamada.simbolo.lexema}' não existe.`);
|
|
304
|
-
}
|
|
305
|
-
return Promise.resolve();
|
|
306
|
-
}
|
|
307
|
-
verificarLadoLogico(lado) {
|
|
308
|
-
if (lado instanceof construtos_1.Variavel) {
|
|
309
|
-
let variavel = lado;
|
|
310
|
-
this.verificarVariavelBinaria(variavel);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
visitarDeclaracaoEscreva(declaracao) {
|
|
314
|
-
var _a;
|
|
315
|
-
if (declaracao.argumentos.length === 0) {
|
|
316
|
-
const { linha, hashArquivo } = declaracao;
|
|
317
|
-
const simbolo = { literal: '', tipo: '', lexema: 'escreva', linha, hashArquivo };
|
|
318
|
-
this.erro(simbolo, `É preciso ter um ou mais parametros para 'escreva(...)'`);
|
|
319
|
-
return Promise.resolve();
|
|
320
|
-
}
|
|
321
|
-
const variaveis = declaracao.argumentos.filter((arg) => arg instanceof construtos_1.Variavel);
|
|
322
|
-
for (let variavel of variaveis) {
|
|
323
|
-
if (!this.variaveis[variavel.simbolo.lexema]) {
|
|
324
|
-
this.erro(variavel.simbolo, `Variável '${variavel.simbolo.lexema}' não existe.`);
|
|
325
|
-
}
|
|
326
|
-
if (((_a = this.variaveis[variavel.simbolo.lexema]) === null || _a === void 0 ? void 0 : _a.valor) === undefined) {
|
|
327
|
-
this.aviso(variavel.simbolo, `Variável '${variavel.simbolo.lexema}' não foi inicializada.`);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
return Promise.resolve();
|
|
331
|
-
}
|
|
332
|
-
visitarDeclaracaoConst(declaracao) {
|
|
333
|
-
this.verificarTipoAtribuido(declaracao);
|
|
334
|
-
if (this.variaveis.hasOwnProperty(declaracao.simbolo.lexema)) {
|
|
335
|
-
this.erro(declaracao.simbolo, 'Declaração de constante já feita.');
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
this.variaveis[declaracao.simbolo.lexema] = {
|
|
339
|
-
imutavel: true,
|
|
340
|
-
tipo: declaracao.tipo,
|
|
341
|
-
valor: declaracao.inicializador.valor,
|
|
342
|
-
};
|
|
343
|
-
}
|
|
344
|
-
this.virificarTipoDeclaracaoConst(declaracao);
|
|
345
|
-
return Promise.resolve();
|
|
346
|
-
}
|
|
347
|
-
virificarTipoDeclaracaoConst(declaracao) {
|
|
348
|
-
if (declaracao.inicializador instanceof construtos_1.Binario) {
|
|
349
|
-
// verificar tipos iguais no lado esquerdo e direito
|
|
350
|
-
const binario = declaracao.inicializador;
|
|
351
|
-
this.verificarLadoBinario(binario.direita);
|
|
352
|
-
this.verificarLadoBinario(binario.esquerda);
|
|
353
|
-
const tipoDireita = typeof binario.direita.valor;
|
|
354
|
-
const tipoEsquerda = typeof binario.esquerda.valor;
|
|
355
|
-
if (tipoDireita !== tipoEsquerda) {
|
|
356
|
-
this.aviso(declaracao.simbolo, 'Declaração de constante com tipos diferentes.');
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
return Promise.resolve();
|
|
360
|
-
}
|
|
361
|
-
visitarDeclaracaoVar(declaracao) {
|
|
362
|
-
this.verificarTipoAtribuido(declaracao);
|
|
363
|
-
if (declaracao.inicializador instanceof construtos_1.FuncaoConstruto) {
|
|
364
|
-
const funcao = declaracao.inicializador;
|
|
365
|
-
if (funcao.parametros.length >= 255) {
|
|
366
|
-
this.erro(declaracao.simbolo, 'Não pode haver mais de 255 parâmetros');
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
this.variaveis[declaracao.simbolo.lexema] = {
|
|
370
|
-
imutavel: false,
|
|
371
|
-
tipo: declaracao.tipo,
|
|
372
|
-
valor: declaracao.inicializador !== null
|
|
373
|
-
? declaracao.inicializador.valor !== undefined
|
|
374
|
-
? declaracao.inicializador.valor
|
|
375
|
-
: declaracao.inicializador
|
|
376
|
-
: undefined,
|
|
377
|
-
};
|
|
378
|
-
return Promise.resolve();
|
|
379
|
-
}
|
|
380
|
-
visitarExpressaoRetornar(declaracao) {
|
|
381
|
-
return Promise.resolve(null);
|
|
382
|
-
}
|
|
383
|
-
visitarDeclaracaoDefinicaoFuncao(declaracao) {
|
|
384
|
-
for (let parametro of declaracao.funcao.parametros) {
|
|
385
|
-
if (parametro.hasOwnProperty('tipoDado') && !parametro.tipoDado.tipo) {
|
|
386
|
-
this.erro(declaracao.simbolo, `O tipo '${parametro.tipoDado.tipoInvalido}' não é válido.`);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
if (declaracao.funcao.tipoRetorno === undefined) {
|
|
390
|
-
this.erro(declaracao.simbolo, `Declaração de retorno da função é inválido.`);
|
|
391
|
-
}
|
|
392
|
-
if (declaracao.funcao.parametros.length >= 255) {
|
|
393
|
-
this.erro(declaracao.simbolo, 'Não pode haver mais de 255 parâmetros');
|
|
394
|
-
}
|
|
395
|
-
let tipoRetornoFuncao = declaracao.funcao.tipoRetorno;
|
|
396
|
-
if (tipoRetornoFuncao) {
|
|
397
|
-
let funcaoContemRetorno = declaracao.funcao.corpo.find((c) => c instanceof declaracoes_1.Retorna);
|
|
398
|
-
if (funcaoContemRetorno) {
|
|
399
|
-
if (tipoRetornoFuncao === 'vazio') {
|
|
400
|
-
this.erro(declaracao.simbolo, `A função não pode ter nenhum tipo de retorno.`);
|
|
401
|
-
}
|
|
402
|
-
const tipoValor = typeof funcaoContemRetorno.valor.valor;
|
|
403
|
-
if (!['qualquer'].includes(tipoRetornoFuncao)) {
|
|
404
|
-
if (tipoValor === 'string') {
|
|
405
|
-
if (tipoRetornoFuncao != 'texto') {
|
|
406
|
-
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
if (tipoValor === 'number') {
|
|
410
|
-
if (!['inteiro', 'real'].includes(tipoRetornoFuncao)) {
|
|
411
|
-
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
if (tipoRetornoFuncao !== 'vazio') {
|
|
418
|
-
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
this.funcoes[declaracao.simbolo.lexema] = {
|
|
423
|
-
valor: declaracao.funcao,
|
|
424
|
-
};
|
|
425
|
-
return Promise.resolve();
|
|
426
|
-
}
|
|
427
|
-
analisar(declaracoes) {
|
|
428
|
-
// this.pilhaVariaveis = new PilhaVariaveis();
|
|
429
|
-
// this.pilhaVariaveis.empilhar()
|
|
430
|
-
this.variaveis = {};
|
|
431
|
-
this.atual = 0;
|
|
432
|
-
this.diagnosticos = [];
|
|
433
|
-
while (this.atual < declaracoes.length) {
|
|
434
|
-
declaracoes[this.atual].aceitar(this);
|
|
435
|
-
this.atual++;
|
|
436
|
-
}
|
|
437
|
-
return {
|
|
438
|
-
diagnosticos: this.diagnosticos,
|
|
439
|
-
};
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
exports.AnalisadorSemantico = AnalisadorSemantico;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AnalisadorSemantico = void 0;
|
|
4
|
+
const construtos_1 = require("../construtos");
|
|
5
|
+
const declaracoes_1 = require("../declaracoes");
|
|
6
|
+
const erros_1 = require("../interfaces/erros");
|
|
7
|
+
const analisador_semantico_base_1 = require("./analisador-semantico-base");
|
|
8
|
+
const pilha_variaveis_1 = require("./pilha-variaveis");
|
|
9
|
+
class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemanticoBase {
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
this.pilhaVariaveis = new pilha_variaveis_1.PilhaVariaveis();
|
|
13
|
+
this.variaveis = {};
|
|
14
|
+
this.funcoes = {};
|
|
15
|
+
this.atual = 0;
|
|
16
|
+
this.diagnosticos = [];
|
|
17
|
+
}
|
|
18
|
+
erro(simbolo, mensagem) {
|
|
19
|
+
this.diagnosticos.push({
|
|
20
|
+
simbolo: simbolo,
|
|
21
|
+
mensagem: mensagem,
|
|
22
|
+
hashArquivo: simbolo.hashArquivo,
|
|
23
|
+
linha: simbolo.linha,
|
|
24
|
+
severidade: erros_1.DiagnosticoSeveridade.ERRO,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
aviso(simbolo, mensagem) {
|
|
28
|
+
this.diagnosticos.push({
|
|
29
|
+
simbolo: simbolo,
|
|
30
|
+
mensagem: mensagem,
|
|
31
|
+
hashArquivo: simbolo.hashArquivo,
|
|
32
|
+
linha: simbolo.linha,
|
|
33
|
+
severidade: erros_1.DiagnosticoSeveridade.AVISO,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
verificarTipoAtribuido(declaracao) {
|
|
37
|
+
if (declaracao.tipo) {
|
|
38
|
+
if (['vetor', 'qualquer[]', 'inteiro[]', 'texto[]'].includes(declaracao.tipo)) {
|
|
39
|
+
if (declaracao.inicializador instanceof construtos_1.Vetor) {
|
|
40
|
+
const vetor = declaracao.inicializador;
|
|
41
|
+
if (declaracao.tipo === 'inteiro[]') {
|
|
42
|
+
const v = vetor.valores.find((v) => typeof (v === null || v === void 0 ? void 0 : v.valor) !== 'number');
|
|
43
|
+
if (v) {
|
|
44
|
+
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um vetor de 'inteiros' ou 'real'.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (declaracao.tipo === 'texto[]') {
|
|
48
|
+
const v = vetor.valores.find((v) => typeof (v === null || v === void 0 ? void 0 : v.valor) !== 'string');
|
|
49
|
+
if (v) {
|
|
50
|
+
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um vetor de 'texto'.`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um vetor de elementos.`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (declaracao.inicializador instanceof construtos_1.Literal) {
|
|
59
|
+
const literal = declaracao.inicializador;
|
|
60
|
+
if (declaracao.tipo === 'texto') {
|
|
61
|
+
if (typeof literal.valor !== 'string') {
|
|
62
|
+
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um 'texto'.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (['inteiro', 'real'].includes(declaracao.tipo)) {
|
|
66
|
+
if (typeof literal.valor !== 'number') {
|
|
67
|
+
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', é esperado um 'número'.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (declaracao.inicializador instanceof declaracoes_1.Leia) {
|
|
72
|
+
if (declaracao.tipo !== 'texto') {
|
|
73
|
+
this.erro(declaracao.simbolo, `Atribuição inválida para '${declaracao.simbolo.lexema}', Leia só pode receber tipo 'texto'.`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
visitarExpressaoTipoDe(expressao) {
|
|
79
|
+
return this.verificarTipoDe(expressao.valor);
|
|
80
|
+
}
|
|
81
|
+
verificarTipoDe(valor) {
|
|
82
|
+
if (valor instanceof construtos_1.Binario) {
|
|
83
|
+
this.verificarTipoDe(valor.direita);
|
|
84
|
+
this.verificarTipoDe(valor.esquerda);
|
|
85
|
+
}
|
|
86
|
+
if (valor instanceof construtos_1.Agrupamento) {
|
|
87
|
+
return this.verificarTipoDe(valor.expressao);
|
|
88
|
+
}
|
|
89
|
+
if (valor instanceof construtos_1.Variavel) {
|
|
90
|
+
return this.verificarVariavel(valor);
|
|
91
|
+
}
|
|
92
|
+
return Promise.resolve();
|
|
93
|
+
}
|
|
94
|
+
visitarExpressaoFalhar(expressao) {
|
|
95
|
+
return this.verificarFalhar(expressao.explicacao);
|
|
96
|
+
}
|
|
97
|
+
verificarFalhar(valor) {
|
|
98
|
+
if (valor instanceof construtos_1.Binario) {
|
|
99
|
+
this.verificarFalhar(valor.direita);
|
|
100
|
+
this.verificarFalhar(valor.esquerda);
|
|
101
|
+
}
|
|
102
|
+
if (valor instanceof construtos_1.Agrupamento) {
|
|
103
|
+
return this.verificarFalhar(valor.expressao);
|
|
104
|
+
}
|
|
105
|
+
if (valor instanceof construtos_1.Variavel) {
|
|
106
|
+
return this.verificarVariavel(valor);
|
|
107
|
+
}
|
|
108
|
+
return Promise.resolve();
|
|
109
|
+
}
|
|
110
|
+
visitarExpressaoDeChamada(expressao) {
|
|
111
|
+
var _a, _b;
|
|
112
|
+
if (expressao.entidadeChamada instanceof construtos_1.Variavel) {
|
|
113
|
+
const variavel = expressao.entidadeChamada;
|
|
114
|
+
const funcaoChamada = this.variaveis[variavel.simbolo.lexema] || this.funcoes[variavel.simbolo.lexema];
|
|
115
|
+
if (!funcaoChamada) {
|
|
116
|
+
this.erro(expressao.entidadeChamada.simbolo, `Chamada da função '${expressao.entidadeChamada.simbolo.lexema}' não existe.`);
|
|
117
|
+
return Promise.resolve();
|
|
118
|
+
}
|
|
119
|
+
const funcao = funcaoChamada.valor;
|
|
120
|
+
if (funcao.parametros.length !== expressao.argumentos.length) {
|
|
121
|
+
this.erro(expressao.entidadeChamada.simbolo, `Função '${expressao.entidadeChamada.simbolo.lexema}' espera ${funcao.parametros.length} parametros.`);
|
|
122
|
+
}
|
|
123
|
+
for (let [indice, arg0] of funcao.parametros.entries()) {
|
|
124
|
+
const arg1 = expressao.argumentos[indice];
|
|
125
|
+
if (arg1) {
|
|
126
|
+
if (((_a = arg0.tipoDado) === null || _a === void 0 ? void 0 : _a.tipo) === 'texto' && typeof arg1.valor !== 'string') {
|
|
127
|
+
this.erro(expressao.entidadeChamada.simbolo, `O valor passado para o parâmetro '${arg0.tipoDado.nome}' é diferente do esperado pela função.`);
|
|
128
|
+
}
|
|
129
|
+
else if (['inteiro', 'real'].includes((_b = arg0.tipoDado) === null || _b === void 0 ? void 0 : _b.tipo) && typeof arg1.valor !== 'number') {
|
|
130
|
+
this.erro(expressao.entidadeChamada.simbolo, `O valor passado para o parâmetro '${arg0.tipoDado.nome}' é diferente do esperado pela função.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return Promise.resolve();
|
|
136
|
+
}
|
|
137
|
+
visitarExpressaoDeAtribuicao(expressao) {
|
|
138
|
+
let valor = this.variaveis[expressao.simbolo.lexema];
|
|
139
|
+
if (!valor) {
|
|
140
|
+
this.erro(expressao.simbolo, `Variável ${expressao.simbolo.lexema} ainda não foi declarada até este ponto.`);
|
|
141
|
+
return Promise.resolve();
|
|
142
|
+
}
|
|
143
|
+
if (valor.tipo) {
|
|
144
|
+
if (expressao.valor instanceof construtos_1.Literal && valor.tipo.includes('[]')) {
|
|
145
|
+
this.erro(expressao.simbolo, `Atribuição inválida, esperado tipo '${valor.tipo}' na atribuição.`);
|
|
146
|
+
return Promise.resolve();
|
|
147
|
+
}
|
|
148
|
+
if (expressao.valor instanceof construtos_1.Vetor && !valor.tipo.includes('[]')) {
|
|
149
|
+
this.erro(expressao.simbolo, `Atribuição inválida, esperado tipo '${valor.tipo}' na atribuição.`);
|
|
150
|
+
return Promise.resolve();
|
|
151
|
+
}
|
|
152
|
+
if (expressao.valor instanceof construtos_1.Literal) {
|
|
153
|
+
let valorLiteral = typeof expressao.valor.valor;
|
|
154
|
+
if (!['qualquer'].includes(valor.tipo)) {
|
|
155
|
+
if (valorLiteral === 'string') {
|
|
156
|
+
if (valor.tipo != 'texto') {
|
|
157
|
+
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
158
|
+
return Promise.resolve();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (valorLiteral === 'number') {
|
|
162
|
+
if (!['inteiro', 'real'].includes(valor.tipo)) {
|
|
163
|
+
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
164
|
+
return Promise.resolve();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (expressao.valor instanceof construtos_1.Vetor) {
|
|
170
|
+
let valores = expressao.valor.valores;
|
|
171
|
+
if (!['qualquer[]'].includes(valor.tipo)) {
|
|
172
|
+
if (valor.tipo === 'texto[]') {
|
|
173
|
+
if (!valores.every((v) => typeof v.valor === 'string')) {
|
|
174
|
+
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
175
|
+
return Promise.resolve();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (['inteiro[]', 'numero[]'].includes(valor.tipo)) {
|
|
179
|
+
if (!valores.every((v) => typeof v.valor === 'number')) {
|
|
180
|
+
this.erro(expressao.simbolo, `Esperado tipo '${valor.tipo}' na atribuição.`);
|
|
181
|
+
return Promise.resolve();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (valor.imutavel) {
|
|
188
|
+
this.erro(expressao.simbolo, `Constante ${expressao.simbolo.lexema} não pode ser modificada.`);
|
|
189
|
+
return Promise.resolve();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
if (this.variaveis[expressao.simbolo.lexema]) {
|
|
193
|
+
this.variaveis[expressao.simbolo.lexema].valor = expressao.valor;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async visitarDeclaracaoDeExpressao(declaracao) {
|
|
198
|
+
return await declaracao.expressao.aceitar(this);
|
|
199
|
+
}
|
|
200
|
+
visitarDeclaracaoEscolha(declaracao) {
|
|
201
|
+
var _a, _b;
|
|
202
|
+
const identificadorOuLiteral = declaracao.identificadorOuLiteral;
|
|
203
|
+
const valor = (_b = this.variaveis[(_a = identificadorOuLiteral.simbolo) === null || _a === void 0 ? void 0 : _a.lexema]) === null || _b === void 0 ? void 0 : _b.valor;
|
|
204
|
+
const tipo = typeof valor;
|
|
205
|
+
for (let caminho of declaracao.caminhos) {
|
|
206
|
+
for (let condicao of caminho.condicoes) {
|
|
207
|
+
if (valor instanceof declaracoes_1.Leia && typeof (condicao === null || condicao === void 0 ? void 0 : condicao.valor) !== 'string') {
|
|
208
|
+
this.erro(condicao, `'caso ${condicao.valor}:' não é do mesmo tipo esperado em 'escolha'`);
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (!(valor instanceof declaracoes_1.Leia) && typeof (condicao === null || condicao === void 0 ? void 0 : condicao.valor) !== tipo) {
|
|
212
|
+
this.erro(condicao, `'caso ${condicao.valor}:' não é do mesmo tipo esperado em 'escolha'`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return Promise.resolve();
|
|
217
|
+
}
|
|
218
|
+
visitarDeclaracaoEnquanto(declaracao) {
|
|
219
|
+
return this.verificarCondicao(declaracao.condicao);
|
|
220
|
+
}
|
|
221
|
+
verificarCondicao(condicao) {
|
|
222
|
+
if (condicao instanceof construtos_1.Agrupamento) {
|
|
223
|
+
return this.verificarCondicao(condicao.expressao);
|
|
224
|
+
}
|
|
225
|
+
if (condicao instanceof construtos_1.Variavel) {
|
|
226
|
+
return this.verificarVariavelBinaria(condicao);
|
|
227
|
+
}
|
|
228
|
+
if (condicao instanceof construtos_1.Binario) {
|
|
229
|
+
return this.verificarBinario(condicao);
|
|
230
|
+
}
|
|
231
|
+
if (condicao instanceof construtos_1.Logico) {
|
|
232
|
+
return this.verificarLogico(condicao);
|
|
233
|
+
}
|
|
234
|
+
if (condicao instanceof construtos_1.Chamada) {
|
|
235
|
+
return this.verificarChamada(condicao);
|
|
236
|
+
}
|
|
237
|
+
return Promise.resolve();
|
|
238
|
+
}
|
|
239
|
+
verificarVariavelBinaria(variavel) {
|
|
240
|
+
this.verificarVariavel(variavel);
|
|
241
|
+
const variavelHipotetica = this.variaveis[variavel.simbolo.lexema];
|
|
242
|
+
if (variavelHipotetica &&
|
|
243
|
+
!(variavelHipotetica.valor instanceof construtos_1.Binario) &&
|
|
244
|
+
typeof variavelHipotetica.valor !== 'boolean') {
|
|
245
|
+
this.erro(variavel.simbolo, `Esperado tipo 'lógico' na condição do 'enquanto'.`);
|
|
246
|
+
}
|
|
247
|
+
return Promise.resolve();
|
|
248
|
+
}
|
|
249
|
+
verificarVariavel(variavel) {
|
|
250
|
+
const variavelHipotetica = this.variaveis[variavel.simbolo.lexema];
|
|
251
|
+
if (!variavelHipotetica) {
|
|
252
|
+
this.erro(variavel.simbolo, `Variável ${variavel.simbolo.lexema} ainda não foi declarada até este ponto.`);
|
|
253
|
+
}
|
|
254
|
+
return Promise.resolve();
|
|
255
|
+
}
|
|
256
|
+
verificarBinario(binario) {
|
|
257
|
+
this.verificarLadoBinario(binario.direita);
|
|
258
|
+
this.verificarLadoBinario(binario.esquerda);
|
|
259
|
+
this.verificarOperadorBinario(binario);
|
|
260
|
+
return Promise.resolve();
|
|
261
|
+
}
|
|
262
|
+
verificarOperadorBinario(binario) {
|
|
263
|
+
var _a, _b, _c;
|
|
264
|
+
const operadoresMatematicos = ['ADICAO', 'SUBTRACAO', 'MULTIPLICACAO', 'DIVISAO', 'MODULO'];
|
|
265
|
+
if (operadoresMatematicos.includes(binario.operador.tipo)) {
|
|
266
|
+
if (binario.direita instanceof construtos_1.Variavel && binario.esquerda instanceof construtos_1.Variavel) {
|
|
267
|
+
const tipoDireita = typeof ((_a = this.variaveis[binario.direita.simbolo.lexema]) === null || _a === void 0 ? void 0 : _a.valor);
|
|
268
|
+
const tipoEsquerda = typeof ((_b = this.variaveis[binario.esquerda.simbolo.lexema]) === null || _b === void 0 ? void 0 : _b.valor);
|
|
269
|
+
if (tipoDireita !== tipoEsquerda) {
|
|
270
|
+
this.erro(binario.operador, `Operação inválida, tipos diferentes.`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (binario.operador.tipo === 'DIVISAO') {
|
|
275
|
+
switch (binario.direita.constructor.name) {
|
|
276
|
+
case 'Variavel':
|
|
277
|
+
const operadorDireitoLiteral = binario.direita;
|
|
278
|
+
if (((_c = this.variaveis[operadorDireitoLiteral.simbolo.lexema]) === null || _c === void 0 ? void 0 : _c.valor) === 0) {
|
|
279
|
+
this.erro(binario.operador, `Divisão por zero.`);
|
|
280
|
+
}
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
verificarLadoBinario(lado) {
|
|
286
|
+
if (lado instanceof construtos_1.Variavel && !this.variaveis[lado.simbolo.lexema]) {
|
|
287
|
+
this.erro(lado.simbolo, `Variável ${lado.simbolo.lexema} ainda não foi declarada até este ponto.`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (lado instanceof construtos_1.Binario) {
|
|
291
|
+
this.verificarBinario(lado);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
verificarLogico(logio) {
|
|
296
|
+
this.verificarLadoLogico(logio.direita);
|
|
297
|
+
this.verificarLadoLogico(logio.esquerda);
|
|
298
|
+
return Promise.resolve();
|
|
299
|
+
}
|
|
300
|
+
verificarChamada(chamada) {
|
|
301
|
+
let funcaoChamada = chamada.entidadeChamada;
|
|
302
|
+
if (!this.funcoes[funcaoChamada.simbolo.lexema]) {
|
|
303
|
+
this.erro(funcaoChamada.simbolo, `Chamada da função '${funcaoChamada.simbolo.lexema}' não existe.`);
|
|
304
|
+
}
|
|
305
|
+
return Promise.resolve();
|
|
306
|
+
}
|
|
307
|
+
verificarLadoLogico(lado) {
|
|
308
|
+
if (lado instanceof construtos_1.Variavel) {
|
|
309
|
+
let variavel = lado;
|
|
310
|
+
this.verificarVariavelBinaria(variavel);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
visitarDeclaracaoEscreva(declaracao) {
|
|
314
|
+
var _a;
|
|
315
|
+
if (declaracao.argumentos.length === 0) {
|
|
316
|
+
const { linha, hashArquivo } = declaracao;
|
|
317
|
+
const simbolo = { literal: '', tipo: '', lexema: 'escreva', linha, hashArquivo };
|
|
318
|
+
this.erro(simbolo, `É preciso ter um ou mais parametros para 'escreva(...)'`);
|
|
319
|
+
return Promise.resolve();
|
|
320
|
+
}
|
|
321
|
+
const variaveis = declaracao.argumentos.filter((arg) => arg instanceof construtos_1.Variavel);
|
|
322
|
+
for (let variavel of variaveis) {
|
|
323
|
+
if (!this.variaveis[variavel.simbolo.lexema]) {
|
|
324
|
+
this.erro(variavel.simbolo, `Variável '${variavel.simbolo.lexema}' não existe.`);
|
|
325
|
+
}
|
|
326
|
+
if (((_a = this.variaveis[variavel.simbolo.lexema]) === null || _a === void 0 ? void 0 : _a.valor) === undefined) {
|
|
327
|
+
this.aviso(variavel.simbolo, `Variável '${variavel.simbolo.lexema}' não foi inicializada.`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return Promise.resolve();
|
|
331
|
+
}
|
|
332
|
+
visitarDeclaracaoConst(declaracao) {
|
|
333
|
+
this.verificarTipoAtribuido(declaracao);
|
|
334
|
+
if (this.variaveis.hasOwnProperty(declaracao.simbolo.lexema)) {
|
|
335
|
+
this.erro(declaracao.simbolo, 'Declaração de constante já feita.');
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
this.variaveis[declaracao.simbolo.lexema] = {
|
|
339
|
+
imutavel: true,
|
|
340
|
+
tipo: declaracao.tipo,
|
|
341
|
+
valor: declaracao.inicializador.valor,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
this.virificarTipoDeclaracaoConst(declaracao);
|
|
345
|
+
return Promise.resolve();
|
|
346
|
+
}
|
|
347
|
+
virificarTipoDeclaracaoConst(declaracao) {
|
|
348
|
+
if (declaracao.inicializador instanceof construtos_1.Binario) {
|
|
349
|
+
// verificar tipos iguais no lado esquerdo e direito
|
|
350
|
+
const binario = declaracao.inicializador;
|
|
351
|
+
this.verificarLadoBinario(binario.direita);
|
|
352
|
+
this.verificarLadoBinario(binario.esquerda);
|
|
353
|
+
const tipoDireita = typeof binario.direita.valor;
|
|
354
|
+
const tipoEsquerda = typeof binario.esquerda.valor;
|
|
355
|
+
if (tipoDireita !== tipoEsquerda) {
|
|
356
|
+
this.aviso(declaracao.simbolo, 'Declaração de constante com tipos diferentes.');
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return Promise.resolve();
|
|
360
|
+
}
|
|
361
|
+
visitarDeclaracaoVar(declaracao) {
|
|
362
|
+
this.verificarTipoAtribuido(declaracao);
|
|
363
|
+
if (declaracao.inicializador instanceof construtos_1.FuncaoConstruto) {
|
|
364
|
+
const funcao = declaracao.inicializador;
|
|
365
|
+
if (funcao.parametros.length >= 255) {
|
|
366
|
+
this.erro(declaracao.simbolo, 'Não pode haver mais de 255 parâmetros');
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
this.variaveis[declaracao.simbolo.lexema] = {
|
|
370
|
+
imutavel: false,
|
|
371
|
+
tipo: declaracao.tipo,
|
|
372
|
+
valor: declaracao.inicializador !== null
|
|
373
|
+
? declaracao.inicializador.valor !== undefined
|
|
374
|
+
? declaracao.inicializador.valor
|
|
375
|
+
: declaracao.inicializador
|
|
376
|
+
: undefined,
|
|
377
|
+
};
|
|
378
|
+
return Promise.resolve();
|
|
379
|
+
}
|
|
380
|
+
visitarExpressaoRetornar(declaracao) {
|
|
381
|
+
return Promise.resolve(null);
|
|
382
|
+
}
|
|
383
|
+
visitarDeclaracaoDefinicaoFuncao(declaracao) {
|
|
384
|
+
for (let parametro of declaracao.funcao.parametros) {
|
|
385
|
+
if (parametro.hasOwnProperty('tipoDado') && !parametro.tipoDado.tipo) {
|
|
386
|
+
this.erro(declaracao.simbolo, `O tipo '${parametro.tipoDado.tipoInvalido}' não é válido.`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (declaracao.funcao.tipoRetorno === undefined) {
|
|
390
|
+
this.erro(declaracao.simbolo, `Declaração de retorno da função é inválido.`);
|
|
391
|
+
}
|
|
392
|
+
if (declaracao.funcao.parametros.length >= 255) {
|
|
393
|
+
this.erro(declaracao.simbolo, 'Não pode haver mais de 255 parâmetros');
|
|
394
|
+
}
|
|
395
|
+
let tipoRetornoFuncao = declaracao.funcao.tipoRetorno;
|
|
396
|
+
if (tipoRetornoFuncao) {
|
|
397
|
+
let funcaoContemRetorno = declaracao.funcao.corpo.find((c) => c instanceof declaracoes_1.Retorna);
|
|
398
|
+
if (funcaoContemRetorno) {
|
|
399
|
+
if (tipoRetornoFuncao === 'vazio') {
|
|
400
|
+
this.erro(declaracao.simbolo, `A função não pode ter nenhum tipo de retorno.`);
|
|
401
|
+
}
|
|
402
|
+
const tipoValor = typeof funcaoContemRetorno.valor.valor;
|
|
403
|
+
if (!['qualquer'].includes(tipoRetornoFuncao)) {
|
|
404
|
+
if (tipoValor === 'string') {
|
|
405
|
+
if (tipoRetornoFuncao != 'texto') {
|
|
406
|
+
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (tipoValor === 'number') {
|
|
410
|
+
if (!['inteiro', 'real'].includes(tipoRetornoFuncao)) {
|
|
411
|
+
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
if (tipoRetornoFuncao !== 'vazio') {
|
|
418
|
+
this.erro(declaracao.simbolo, `Esperado retorno do tipo '${tipoRetornoFuncao}' dentro da função.`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
this.funcoes[declaracao.simbolo.lexema] = {
|
|
423
|
+
valor: declaracao.funcao,
|
|
424
|
+
};
|
|
425
|
+
return Promise.resolve();
|
|
426
|
+
}
|
|
427
|
+
analisar(declaracoes) {
|
|
428
|
+
// this.pilhaVariaveis = new PilhaVariaveis();
|
|
429
|
+
// this.pilhaVariaveis.empilhar()
|
|
430
|
+
this.variaveis = {};
|
|
431
|
+
this.atual = 0;
|
|
432
|
+
this.diagnosticos = [];
|
|
433
|
+
while (this.atual < declaracoes.length) {
|
|
434
|
+
declaracoes[this.atual].aceitar(this);
|
|
435
|
+
this.atual++;
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
diagnosticos: this.diagnosticos,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
exports.AnalisadorSemantico = AnalisadorSemantico;
|
|
443
443
|
//# sourceMappingURL=analisador-semantico.js.map
|