@designliquido/delegua 0.14.6 → 0.15.0
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/README.md +85 -85
- package/bin/delegua +2 -2
- package/bin/package.json +88 -88
- package/fontes/avaliador-sintatico/avaliador-sintatico-base.d.ts +67 -67
- package/fontes/avaliador-sintatico/avaliador-sintatico-base.js +215 -215
- package/fontes/avaliador-sintatico/avaliador-sintatico-base.js.map +1 -1
- package/fontes/avaliador-sintatico/avaliador-sintatico.d.ts +92 -92
- package/fontes/avaliador-sintatico/avaliador-sintatico.js +857 -727
- package/fontes/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.d.ts +22 -22
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.js +145 -145
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.d.ts +69 -69
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +640 -640
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.d.ts +84 -84
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.js +714 -714
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-eguap.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.d.ts +20 -20
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-guarani.js +149 -149
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.d.ts +49 -32
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.js +419 -192
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-studio.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.d.ts +73 -73
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.js +534 -534
- package/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-visualg.js.map +1 -1
- package/fontes/avaliador-sintatico/dialetos/index.d.ts +5 -5
- package/fontes/avaliador-sintatico/dialetos/index.js +21 -21
- package/fontes/avaliador-sintatico/erro-avaliador-sintatico.d.ts +5 -5
- package/fontes/avaliador-sintatico/erro-avaliador-sintatico.js +11 -11
- package/fontes/avaliador-sintatico/index.d.ts +2 -2
- package/fontes/avaliador-sintatico/index.js +18 -18
- package/fontes/avaliador-sintatico/retornos/index.d.ts +3 -3
- package/fontes/avaliador-sintatico/retornos/index.js +19 -19
- package/fontes/avaliador-sintatico/retornos/retorno-declaracao.d.ts +3 -3
- package/fontes/avaliador-sintatico/retornos/retorno-declaracao.js +2 -2
- package/fontes/avaliador-sintatico/retornos/retorno-primario.d.ts +3 -3
- package/fontes/avaliador-sintatico/retornos/retorno-primario.js +2 -2
- package/fontes/avaliador-sintatico/retornos/retorno-resolver-declaracao.d.ts +2 -2
- package/fontes/avaliador-sintatico/retornos/retorno-resolver-declaracao.js +2 -2
- package/fontes/bibliotecas/biblioteca-global.d.ts +3 -3
- package/fontes/bibliotecas/biblioteca-global.js +315 -315
- package/fontes/bibliotecas/dialetos/egua-classico/biblioteca-global.d.ts +1 -1
- package/fontes/bibliotecas/dialetos/egua-classico/biblioteca-global.js +230 -230
- package/fontes/bibliotecas/dialetos/egua-classico/index.d.ts +2 -2
- package/fontes/bibliotecas/dialetos/egua-classico/index.js +32 -32
- package/fontes/bibliotecas/dialetos/egua-classico/matematica.d.ts +1 -1
- package/fontes/bibliotecas/dialetos/egua-classico/matematica.js +478 -478
- package/fontes/bibliotecas/dialetos/egua-classico/tempo.d.ts +1 -1
- package/fontes/bibliotecas/dialetos/egua-classico/tempo.js +39 -39
- package/fontes/bibliotecas/dialetos/egua-classico/textos.d.ts +8 -8
- package/fontes/bibliotecas/dialetos/egua-classico/textos.js +201 -201
- package/fontes/bibliotecas/primitivas-texto.d.ts +11 -11
- package/fontes/bibliotecas/primitivas-texto.js +12 -12
- package/fontes/bibliotecas/primitivas-vetor.d.ts +15 -15
- package/fontes/bibliotecas/primitivas-vetor.js +33 -33
- package/fontes/construtos/acesso-indice-variavel.d.ts +15 -15
- package/fontes/construtos/acesso-indice-variavel.js +20 -20
- package/fontes/construtos/acesso-metodo.d.ts +14 -14
- package/fontes/construtos/acesso-metodo.js +19 -19
- package/fontes/construtos/agrupamento.d.ts +14 -14
- package/fontes/construtos/agrupamento.js +19 -19
- package/fontes/construtos/atribuicao-sobrescrita.d.ts +11 -11
- package/fontes/construtos/atribuicao-sobrescrita.js +16 -16
- package/fontes/construtos/atribuir.d.ts +10 -10
- package/fontes/construtos/atribuir.js +15 -15
- package/fontes/construtos/binario.d.ts +22 -22
- package/fontes/construtos/binario.js +27 -27
- package/fontes/construtos/chamada.d.ts +13 -13
- package/fontes/construtos/chamada.js +36 -36
- package/fontes/construtos/construto.d.ts +7 -7
- package/fontes/construtos/construto.js +2 -2
- package/fontes/construtos/definir-valor.d.ts +11 -11
- package/fontes/construtos/definir-valor.js +16 -16
- package/fontes/construtos/dicionario.d.ts +10 -10
- package/fontes/construtos/dicionario.js +15 -15
- package/fontes/construtos/formatacao-escrita.d.ts +16 -16
- package/fontes/construtos/formatacao-escrita.js +21 -21
- package/fontes/construtos/funcao.d.ts +10 -10
- package/fontes/construtos/funcao.js +15 -15
- package/fontes/construtos/index.d.ts +19 -19
- package/fontes/construtos/index.js +35 -35
- package/fontes/construtos/isto.d.ts +9 -9
- package/fontes/construtos/isto.js +14 -14
- package/fontes/construtos/literal.d.ts +10 -10
- package/fontes/construtos/literal.js +14 -14
- package/fontes/construtos/logico.d.ts +11 -11
- package/fontes/construtos/logico.js +16 -16
- package/fontes/construtos/super.d.ts +10 -10
- package/fontes/construtos/super.js +15 -15
- package/fontes/construtos/unario.d.ts +11 -10
- package/fontes/construtos/unario.js +16 -15
- package/fontes/construtos/unario.js.map +1 -1
- package/fontes/construtos/variavel.d.ts +9 -9
- package/fontes/construtos/variavel.js +14 -14
- package/fontes/construtos/vetor.d.ts +9 -9
- package/fontes/construtos/vetor.js +14 -14
- package/fontes/declaracoes/bloco.d.ts +7 -7
- package/fontes/declaracoes/bloco.js +14 -14
- package/fontes/declaracoes/classe.d.ts +9 -9
- package/fontes/declaracoes/classe.js +16 -16
- package/fontes/declaracoes/continua.d.ts +6 -6
- package/fontes/declaracoes/continua.js +13 -13
- package/fontes/declaracoes/declaracao.d.ts +8 -8
- package/fontes/declaracoes/declaracao.js +17 -17
- package/fontes/declaracoes/enquanto.d.ts +9 -9
- package/fontes/declaracoes/enquanto.js +15 -15
- package/fontes/declaracoes/escolha.d.ts +14 -14
- package/fontes/declaracoes/escolha.js +19 -19
- package/fontes/declaracoes/escreva-mesma-linha.d.ts +8 -8
- package/fontes/declaracoes/escreva-mesma-linha.js +14 -14
- package/fontes/declaracoes/escreva.d.ts +8 -8
- package/fontes/declaracoes/escreva.js +14 -14
- package/fontes/declaracoes/expressao.d.ts +8 -8
- package/fontes/declaracoes/expressao.js +14 -14
- package/fontes/declaracoes/fazer.d.ts +8 -8
- package/fontes/declaracoes/fazer.js +15 -15
- package/fontes/declaracoes/funcao.d.ts +9 -9
- package/fontes/declaracoes/funcao.js +15 -15
- package/fontes/declaracoes/importar.d.ts +9 -9
- package/fontes/declaracoes/importar.js +15 -15
- package/fontes/declaracoes/index.d.ts +19 -19
- package/fontes/declaracoes/index.js +35 -35
- package/fontes/declaracoes/leia.d.ts +12 -12
- package/fontes/declaracoes/leia.js +18 -18
- package/fontes/declaracoes/para.d.ts +10 -10
- package/fontes/declaracoes/para.js +17 -17
- package/fontes/declaracoes/retorna.d.ts +8 -8
- package/fontes/declaracoes/retorna.js +15 -15
- package/fontes/declaracoes/se.d.ts +11 -11
- package/fontes/declaracoes/se.js +17 -17
- package/fontes/declaracoes/sustar.d.ts +6 -6
- package/fontes/declaracoes/sustar.js +13 -13
- package/fontes/declaracoes/tente.d.ts +14 -14
- package/fontes/declaracoes/tente.js +20 -20
- package/fontes/declaracoes/var.d.ts +9 -9
- package/fontes/declaracoes/var.js +15 -15
- package/fontes/depuracao/cyrb53.d.ts +9 -9
- package/fontes/depuracao/cyrb53.js +22 -22
- package/fontes/depuracao/index.d.ts +2 -2
- package/fontes/depuracao/index.js +23 -23
- package/fontes/depuracao/ponto-parada.d.ts +4 -4
- package/fontes/depuracao/ponto-parada.js +2 -2
- package/fontes/espaco-variaveis.d.ts +19 -19
- package/fontes/espaco-variaveis.js +19 -19
- package/fontes/estruturas/chamavel.d.ts +5 -5
- package/fontes/estruturas/chamavel.js +12 -12
- package/fontes/estruturas/classe-padrao.d.ts +17 -17
- package/fontes/estruturas/classe-padrao.js +28 -28
- package/fontes/estruturas/delegua-classe.d.ts +16 -16
- package/fontes/estruturas/delegua-classe.js +38 -38
- package/fontes/estruturas/delegua-funcao.d.ts +18 -18
- package/fontes/estruturas/delegua-funcao.js +60 -60
- package/fontes/estruturas/funcao-padrao.d.ts +12 -12
- package/fontes/estruturas/funcao-padrao.js +22 -22
- package/fontes/estruturas/index.d.ts +9 -9
- package/fontes/estruturas/index.js +25 -25
- package/fontes/estruturas/metodo-primitiva.d.ts +17 -17
- package/fontes/estruturas/metodo-primitiva.js +26 -26
- package/fontes/estruturas/modulo.d.ts +9 -9
- package/fontes/estruturas/modulo.js +13 -13
- package/fontes/estruturas/objeto-delegua-classe.d.ts +10 -10
- package/fontes/estruturas/objeto-delegua-classe.js +26 -26
- package/fontes/estruturas/objeto-padrao.d.ts +9 -9
- package/fontes/estruturas/objeto-padrao.js +21 -21
- package/fontes/excecoes/erro-em-tempo-de-execucao.d.ts +7 -7
- package/fontes/excecoes/erro-em-tempo-de-execucao.js +13 -13
- package/fontes/excecoes/index.d.ts +1 -1
- package/fontes/excecoes/index.js +17 -17
- package/fontes/formatadores/delegua.d.ts +18 -11
- package/fontes/formatadores/delegua.js +82 -99
- package/fontes/formatadores/delegua.js.map +1 -1
- package/fontes/formatadores/index.d.ts +1 -1
- package/fontes/formatadores/index.js +17 -17
- package/fontes/interfaces/avaliador-sintatico-interface.d.ts +57 -57
- package/fontes/interfaces/avaliador-sintatico-interface.js +2 -2
- package/fontes/interfaces/construtos/index.d.ts +4 -4
- package/fontes/interfaces/construtos/index.js +2 -2
- package/fontes/interfaces/escopo-execucao.d.ts +11 -11
- package/fontes/interfaces/escopo-execucao.js +2 -2
- package/fontes/interfaces/index.d.ts +11 -11
- package/fontes/interfaces/index.js +27 -27
- package/fontes/interfaces/interpretador-com-depuracao-interface.d.ts +17 -17
- package/fontes/interfaces/interpretador-com-depuracao-interface.js +2 -2
- package/fontes/interfaces/interpretador-interface.d.ts +55 -55
- package/fontes/interfaces/interpretador-interface.js +2 -2
- package/fontes/interfaces/lexador-interface.d.ts +23 -23
- package/fontes/interfaces/lexador-interface.js +2 -2
- package/fontes/interfaces/parametro-interface.d.ts +6 -6
- package/fontes/interfaces/parametro-interface.js +2 -2
- package/fontes/interfaces/pilha-escopos-execucao-interface.d.ts +25 -25
- package/fontes/interfaces/pilha-escopos-execucao-interface.js +2 -2
- package/fontes/interfaces/pilha-interface.d.ts +7 -7
- package/fontes/interfaces/pilha-interface.js +2 -2
- package/fontes/interfaces/resolvedor-interface.d.ts +41 -41
- package/fontes/interfaces/resolvedor-interface.js +2 -2
- package/fontes/interfaces/retornos/index.d.ts +4 -4
- package/fontes/interfaces/retornos/index.js +20 -20
- package/fontes/interfaces/retornos/retorno-avaliador-sintatico.d.ts +6 -6
- package/fontes/interfaces/retornos/retorno-avaliador-sintatico.js +2 -2
- package/fontes/interfaces/retornos/retorno-execucao-interface.d.ts +5 -5
- package/fontes/interfaces/retornos/retorno-execucao-interface.js +2 -2
- package/fontes/interfaces/retornos/retorno-interpretador.d.ts +5 -5
- package/fontes/interfaces/retornos/retorno-interpretador.js +2 -2
- package/fontes/interfaces/retornos/retorno-lexador.d.ts +10 -10
- package/fontes/interfaces/retornos/retorno-lexador.js +2 -2
- package/fontes/interfaces/simbolo-interface.d.ts +7 -7
- package/fontes/interfaces/simbolo-interface.js +2 -2
- package/fontes/interfaces/tradutor-interface.d.ts +4 -4
- package/fontes/interfaces/tradutor-interface.js +2 -2
- package/fontes/interfaces/variavel-interface.d.ts +4 -4
- package/fontes/interfaces/variavel-interface.js +2 -2
- package/fontes/interpretador/dialetos/egua-classico/index.d.ts +1 -1
- package/fontes/interpretador/dialetos/egua-classico/index.js +17 -17
- package/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +99 -99
- package/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +743 -743
- package/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.d.ts +5 -5
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/erro-resolvedor.js +11 -11
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/index.d.ts +3 -3
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/index.js +19 -19
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.d.ts +9 -9
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/pilha-escopos.js +25 -25
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +87 -87
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +387 -387
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.d.ts +6 -6
- package/fontes/interpretador/dialetos/egua-classico/resolvedor/retorno-resolvedor.js +2 -2
- package/fontes/interpretador/dialetos/index.d.ts +4 -4
- package/fontes/interpretador/dialetos/index.js +20 -20
- package/fontes/interpretador/dialetos/portugol-studio/interpretador-portugol-studio.d.ts +12 -12
- package/fontes/interpretador/dialetos/portugol-studio/interpretador-portugol-studio.js +26 -26
- package/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.d.ts +40 -40
- package/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.js +96 -96
- package/fontes/interpretador/dialetos/visualg/interpretador-visualg.d.ts +46 -46
- package/fontes/interpretador/dialetos/visualg/interpretador-visualg.js +102 -102
- package/fontes/interpretador/erro-interpretador.d.ts +8 -8
- package/fontes/interpretador/erro-interpretador.js +2 -2
- package/fontes/interpretador/index.d.ts +4 -4
- package/fontes/interpretador/index.js +20 -20
- package/fontes/interpretador/inferenciador.d.ts +1 -1
- package/fontes/interpretador/inferenciador.js +31 -31
- package/fontes/interpretador/interpretador-base.d.ts +187 -187
- package/fontes/interpretador/interpretador-base.js +998 -972
- package/fontes/interpretador/interpretador-base.js.map +1 -1
- package/fontes/interpretador/interpretador-com-depuracao.d.ts +199 -199
- package/fontes/interpretador/interpretador-com-depuracao.js +516 -516
- package/fontes/interpretador/pilha-escopos-execucao.d.ts +38 -38
- package/fontes/interpretador/pilha-escopos-execucao.js +158 -158
- package/fontes/lexador/dialetos/index.d.ts +6 -6
- package/fontes/lexador/dialetos/index.js +22 -22
- package/fontes/lexador/dialetos/lexador-birl.d.ts +12 -12
- package/fontes/lexador/dialetos/lexador-birl.js +165 -165
- package/fontes/lexador/dialetos/lexador-egua-classico.d.ts +36 -36
- package/fontes/lexador/dialetos/lexador-egua-classico.js +286 -286
- package/fontes/lexador/dialetos/lexador-eguap.d.ts +51 -51
- package/fontes/lexador/dialetos/lexador-eguap.js +398 -398
- package/fontes/lexador/dialetos/lexador-guarani.d.ts +9 -9
- package/fontes/lexador/dialetos/lexador-guarani.js +113 -113
- package/fontes/lexador/dialetos/lexador-portugol-ipt.d.ts +33 -33
- package/fontes/lexador/dialetos/lexador-portugol-ipt.js +195 -195
- package/fontes/lexador/dialetos/lexador-portugol-studio.d.ts +21 -15
- package/fontes/lexador/dialetos/lexador-portugol-studio.js +280 -242
- package/fontes/lexador/dialetos/lexador-portugol-studio.js.map +1 -1
- package/fontes/lexador/dialetos/lexador-visualg.d.ts +18 -18
- package/fontes/lexador/dialetos/lexador-visualg.js +218 -218
- package/fontes/lexador/dialetos/palavras-reservadas/birl.d.ts +41 -41
- package/fontes/lexador/dialetos/palavras-reservadas/birl.js +58 -58
- package/fontes/lexador/dialetos/palavras-reservadas/egua-classico.d.ts +36 -36
- package/fontes/lexador/dialetos/palavras-reservadas/egua-classico.js +41 -41
- package/fontes/lexador/dialetos/palavras-reservadas/guarani.d.ts +4 -4
- package/fontes/lexador/dialetos/palavras-reservadas/guarani.js +9 -9
- package/fontes/lexador/dialetos/palavras-reservadas/index.d.ts +3 -3
- package/fontes/lexador/dialetos/palavras-reservadas/index.js +19 -19
- package/fontes/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts +6 -6
- package/fontes/lexador/dialetos/palavras-reservadas/portugol-ipt.js +11 -11
- package/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.d.ts +23 -8
- package/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.js +28 -13
- package/fontes/lexador/dialetos/palavras-reservadas/portugol-studio.js.map +1 -1
- package/fontes/lexador/dialetos/palavras-reservadas/rantiaquin.d.ts +2 -2
- package/fontes/lexador/dialetos/palavras-reservadas/rantiaquin.js +3 -3
- package/fontes/lexador/dialetos/palavras-reservadas/visualg.d.ts +60 -60
- package/fontes/lexador/dialetos/palavras-reservadas/visualg.js +65 -65
- package/fontes/lexador/dialetos/pragma.d.ts +8 -8
- package/fontes/lexador/dialetos/pragma.js +2 -2
- package/fontes/lexador/erro-lexador.d.ts +5 -5
- package/fontes/lexador/erro-lexador.js +2 -2
- package/fontes/lexador/index.d.ts +2 -2
- package/fontes/lexador/index.js +18 -18
- package/fontes/lexador/lexador-base-linha-unica.d.ts +28 -28
- package/fontes/lexador/lexador-base-linha-unica.js +82 -82
- package/fontes/lexador/lexador-base.d.ts +41 -41
- package/fontes/lexador/lexador-base.js +112 -112
- package/fontes/lexador/lexador-base.js.map +1 -1
- package/fontes/lexador/lexador.d.ts +43 -43
- package/fontes/lexador/lexador.js +412 -408
- package/fontes/lexador/lexador.js.map +1 -1
- package/fontes/lexador/palavras-reservadas.d.ts +36 -36
- package/fontes/lexador/palavras-reservadas.js +41 -41
- package/fontes/lexador/simbolo.d.ts +10 -10
- package/fontes/lexador/simbolo.js +16 -16
- package/fontes/quebras/index.d.ts +10 -10
- package/fontes/quebras/index.js +19 -19
- package/fontes/tipos-de-simbolos/birl.d.ts +57 -57
- package/fontes/tipos-de-simbolos/birl.js +61 -61
- package/fontes/tipos-de-simbolos/comum.d.ts +22 -22
- package/fontes/tipos-de-simbolos/comum.js +23 -23
- package/fontes/tipos-de-simbolos/delegua.d.ts +80 -80
- package/fontes/tipos-de-simbolos/delegua.js +81 -81
- package/fontes/tipos-de-simbolos/egua-classico.d.ts +77 -77
- package/fontes/tipos-de-simbolos/egua-classico.js +78 -78
- package/fontes/tipos-de-simbolos/eguap.d.ts +73 -73
- package/fontes/tipos-de-simbolos/eguap.js +74 -74
- package/fontes/tipos-de-simbolos/guarani.d.ts +14 -14
- package/fontes/tipos-de-simbolos/guarani.js +15 -15
- package/fontes/tipos-de-simbolos/portugol-ipt.d.ts +28 -28
- package/fontes/tipos-de-simbolos/portugol-ipt.js +29 -29
- package/fontes/tipos-de-simbolos/portugol-studio.d.ts +53 -35
- package/fontes/tipos-de-simbolos/portugol-studio.js +54 -36
- package/fontes/tipos-de-simbolos/portugol-studio.js.map +1 -1
- package/fontes/tipos-de-simbolos/rantiaquin.d.ts +2 -2
- package/fontes/tipos-de-simbolos/rantiaquin.js +3 -3
- package/fontes/tipos-de-simbolos/visualg.d.ts +68 -68
- package/fontes/tipos-de-simbolos/visualg.js +69 -69
- package/fontes/tradutores/dicionarios/dicionario-delegua-javascript.d.ts +2 -2
- package/fontes/tradutores/dicionarios/dicionario-delegua-javascript.js +10 -10
- package/fontes/tradutores/dicionarios/index.d.ts +1 -1
- package/fontes/tradutores/dicionarios/index.js +17 -17
- package/fontes/tradutores/index.d.ts +2 -2
- package/fontes/tradutores/index.js +18 -18
- package/fontes/tradutores/python/python3-lexer.d.ts +152 -152
- package/fontes/tradutores/python/python3-lexer.js +1226 -1226
- package/fontes/tradutores/python/python3-listener.d.ts +953 -953
- package/fontes/tradutores/python/python3-listener.js +2 -2
- package/fontes/tradutores/python/python3-parser.d.ts +1330 -1330
- package/fontes/tradutores/python/python3-parser.js +11156 -11156
- package/fontes/tradutores/python/python3-visitor.d.ts +612 -612
- package/fontes/tradutores/python/python3-visitor.js +2 -2
- package/fontes/tradutores/tradutor-javascript.d.ts +83 -83
- package/fontes/tradutores/tradutor-javascript.js +470 -470
- package/fontes/tradutores/tradutor-javascript.js.map +1 -1
- package/fontes/tradutores/tradutor-python.d.ts +1 -1
- package/fontes/tradutores/tradutor-python.js +34 -34
- package/fontes/tradutores/tradutor-reverso-javascript.d.ts +47 -47
- package/fontes/tradutores/tradutor-reverso-javascript.js +342 -342
- package/index.d.ts +5 -5
- package/index.js +23 -23
- package/package.json +88 -88
|
@@ -1,535 +1,535 @@
|
|
|
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.AvaliadorSintaticoVisuAlg = void 0;
|
|
7
|
-
const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
|
|
8
|
-
const declaracoes_1 = require("../../declaracoes");
|
|
9
|
-
const construtos_1 = require("../../construtos");
|
|
10
|
-
const lexador_1 = require("../../lexador");
|
|
11
|
-
const visualg_1 = __importDefault(require("../../tipos-de-simbolos/visualg"));
|
|
12
|
-
class AvaliadorSintaticoVisuAlg extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
|
|
13
|
-
validarSegmentoAlgoritmo() {
|
|
14
|
-
this.consumir(visualg_1.default.ALGORITMO, "Esperada expressão 'algoritmo' para inicializar programa.");
|
|
15
|
-
this.consumir(visualg_1.default.CARACTERE, "Esperad cadeia de caracteres após palavra-chave 'algoritmo'.");
|
|
16
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após definição do segmento 'algoritmo'.");
|
|
17
|
-
}
|
|
18
|
-
criarVetorNDimensional(dimensoes) {
|
|
19
|
-
if (dimensoes.length > 0) {
|
|
20
|
-
const dimensao = dimensoes[0] + 1;
|
|
21
|
-
const resto = dimensoes.slice(1);
|
|
22
|
-
const novoArray = Array(dimensao);
|
|
23
|
-
for (let i = 0; i < dimensao; i++) {
|
|
24
|
-
novoArray[i] = this.criarVetorNDimensional(resto);
|
|
25
|
-
}
|
|
26
|
-
return novoArray;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
validarDimensoesVetor() {
|
|
33
|
-
let dimensoes = [];
|
|
34
|
-
do {
|
|
35
|
-
const numeroInicial = this.consumir(visualg_1.default.NUMERO, 'Esperado índice inicial para inicialização de dimensão de vetor.');
|
|
36
|
-
this.consumir(visualg_1.default.PONTO, 'Esperado primeiro ponto após índice inicial para inicialização de dimensão de vetor.');
|
|
37
|
-
this.consumir(visualg_1.default.PONTO, 'Esperado segundo ponto após índice inicial para inicialização de dimensão de vetor.');
|
|
38
|
-
const numeroFinal = this.consumir(visualg_1.default.NUMERO, 'Esperado índice final para inicialização de dimensão de vetor.');
|
|
39
|
-
dimensoes.push(Number(numeroFinal.literal) - Number(numeroInicial.literal));
|
|
40
|
-
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
41
|
-
return dimensoes;
|
|
42
|
-
}
|
|
43
|
-
logicaComumParametroVisuAlg() {
|
|
44
|
-
const identificadores = [];
|
|
45
|
-
do {
|
|
46
|
-
identificadores.push(this.consumir(visualg_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
|
|
47
|
-
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
48
|
-
this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de variável.');
|
|
49
|
-
if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
|
|
50
|
-
throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido.');
|
|
51
|
-
}
|
|
52
|
-
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
53
|
-
const tipoVariavel = simboloAnterior.tipo;
|
|
54
|
-
return {
|
|
55
|
-
identificadores,
|
|
56
|
-
tipo: tipoVariavel,
|
|
57
|
-
simbolo: simboloAnterior
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Validação do segmento de declaração de variáveis (opcional).
|
|
62
|
-
* @returns Vetor de Construtos para inicialização de variáveis.
|
|
63
|
-
*/
|
|
64
|
-
validarSegmentoVar() {
|
|
65
|
-
// Podem haver linhas de comentários acima de `var`, que geram
|
|
66
|
-
// quebras de linha.
|
|
67
|
-
while (this.simbolos[this.atual].tipo === visualg_1.default.QUEBRA_LINHA) {
|
|
68
|
-
this.avancarEDevolverAnterior();
|
|
69
|
-
}
|
|
70
|
-
if (!this.verificarTipoSimboloAtual(visualg_1.default.VAR)) {
|
|
71
|
-
return [];
|
|
72
|
-
}
|
|
73
|
-
const inicializacoes = [];
|
|
74
|
-
this.avancarEDevolverAnterior(); // Var
|
|
75
|
-
// Quebra de linha é opcional aqui.
|
|
76
|
-
// this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.QUEBRA_LINHA);
|
|
77
|
-
while (!this.verificarTipoSimboloAtual(visualg_1.default.INICIO)) {
|
|
78
|
-
// Se ainda houver quebras de linha, volta para o começo do `while`.
|
|
79
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.QUEBRA_LINHA)) {
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
const simboloAtual = this.simbolos[this.atual];
|
|
83
|
-
switch (simboloAtual.tipo) {
|
|
84
|
-
case visualg_1.default.PROCEDIMENTO:
|
|
85
|
-
const dadosProcedimento = this.declaracaoProcedimento();
|
|
86
|
-
inicializacoes.push(dadosProcedimento);
|
|
87
|
-
break;
|
|
88
|
-
default:
|
|
89
|
-
const dadosVariaveis = this.logicaComumParametroVisuAlg();
|
|
90
|
-
// Se chegou até aqui, variáveis são válidas.
|
|
91
|
-
// Devem ser declaradas com um valor inicial padrão.
|
|
92
|
-
for (let identificador of dadosVariaveis.identificadores) {
|
|
93
|
-
switch (dadosVariaveis.tipo) {
|
|
94
|
-
case visualg_1.default.CARACTERE:
|
|
95
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), '')));
|
|
96
|
-
break;
|
|
97
|
-
case visualg_1.default.INTEIRO:
|
|
98
|
-
case visualg_1.default.REAL:
|
|
99
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), 0)));
|
|
100
|
-
break;
|
|
101
|
-
case visualg_1.default.LOGICO:
|
|
102
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), false)));
|
|
103
|
-
break;
|
|
104
|
-
case visualg_1.default.VETOR:
|
|
105
|
-
// TODO: Validar vetor
|
|
106
|
-
this.consumir(visualg_1.default.COLCHETE_ESQUERDO, 'Esperado colchete esquerdo após palavra reservada "vetor".');
|
|
107
|
-
const dimensoes = this.validarDimensoesVetor();
|
|
108
|
-
this.consumir(visualg_1.default.COLCHETE_DIREITO, 'Esperado colchete direito após declaração de dimensões de vetor.');
|
|
109
|
-
this.consumir(visualg_1.default.DE, 'Esperado palavra reservada "de" após declaração de dimensões de vetor.');
|
|
110
|
-
if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
|
|
111
|
-
throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido para inicialização de vetor.');
|
|
112
|
-
}
|
|
113
|
-
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes))));
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após declaração de variável.');
|
|
120
|
-
}
|
|
121
|
-
return inicializacoes;
|
|
122
|
-
}
|
|
123
|
-
validarSegmentoInicio(algoritmoOuFuncao) {
|
|
124
|
-
this.consumir(visualg_1.default.INICIO, `Esperada expressão 'inicio' para marcar escopo de ${algoritmoOuFuncao}.`);
|
|
125
|
-
}
|
|
126
|
-
estaNoFinal() {
|
|
127
|
-
return this.atual === this.simbolos.length;
|
|
128
|
-
}
|
|
129
|
-
metodoBibliotecaGlobal() {
|
|
130
|
-
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
131
|
-
switch (simboloAnterior.lexema) {
|
|
132
|
-
case 'int':
|
|
133
|
-
return new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(visualg_1.default.IDENTIFICADOR, 'inteiro', null, Number(simboloAnterior.linha), this.hashArquivo)), null, []);
|
|
134
|
-
default:
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
primario() {
|
|
139
|
-
const simboloAtual = this.simbolos[this.atual];
|
|
140
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.FALSO))
|
|
141
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
|
|
142
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VERDADEIRO))
|
|
143
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
|
|
144
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.IDENTIFICADOR, visualg_1.default.METODO_BIBLIOTECA_GLOBAL)) {
|
|
145
|
-
return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
|
|
146
|
-
}
|
|
147
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.NUMERO, visualg_1.default.CARACTERE)) {
|
|
148
|
-
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
149
|
-
return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
|
|
150
|
-
}
|
|
151
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
|
|
152
|
-
const expressao = this.expressao();
|
|
153
|
-
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
154
|
-
return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
comparacaoIgualdade() {
|
|
158
|
-
let expressao = this.comparar();
|
|
159
|
-
while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DIFERENTE, visualg_1.default.IGUAL)) {
|
|
160
|
-
// TODO: Este é um caso que o interpretador não deveria ter conhecimento
|
|
161
|
-
// do que é um símbolo.
|
|
162
|
-
// Em VisuAlg não existe '==', apenas '=', já que o símbolo de atribuição
|
|
163
|
-
// é uma seta: '<-'.
|
|
164
|
-
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
165
|
-
let operador = new lexador_1.Simbolo('IGUAL_IGUAL', '=', null, this.hashArquivo, Number(simboloAnterior.linha));
|
|
166
|
-
if (simboloAnterior.tipo === visualg_1.default.DIFERENTE) {
|
|
167
|
-
operador = simboloAnterior;
|
|
168
|
-
}
|
|
169
|
-
const direito = this.comparar();
|
|
170
|
-
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
171
|
-
}
|
|
172
|
-
return expressao;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Método que resolve atribuições.
|
|
176
|
-
* @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoSobrescrita`.
|
|
177
|
-
*/
|
|
178
|
-
atribuir() {
|
|
179
|
-
const expressao = this.ou();
|
|
180
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SETA_ATRIBUICAO)) {
|
|
181
|
-
const setaAtribuicao = this.simbolos[this.atual - 1];
|
|
182
|
-
const valor = this.atribuir();
|
|
183
|
-
if (expressao instanceof construtos_1.Variavel) {
|
|
184
|
-
const simbolo = expressao.simbolo;
|
|
185
|
-
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
186
|
-
}
|
|
187
|
-
else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
|
|
188
|
-
return new construtos_1.AtribuicaoSobrescrita(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
|
|
189
|
-
}
|
|
190
|
-
this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
|
|
191
|
-
}
|
|
192
|
-
return expressao;
|
|
193
|
-
}
|
|
194
|
-
expressao() {
|
|
195
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.LEIA))
|
|
196
|
-
return this.declaracaoLeia();
|
|
197
|
-
return this.atribuir();
|
|
198
|
-
}
|
|
199
|
-
blocoEscopo() {
|
|
200
|
-
const declaracoes = [];
|
|
201
|
-
while (![
|
|
202
|
-
visualg_1.default.FIM_FUNCAO,
|
|
203
|
-
visualg_1.default.FIM_PROCEDIMENTO
|
|
204
|
-
].includes(this.simbolos[this.atual].tipo) && !this.estaNoFinal()) {
|
|
205
|
-
declaracoes.push(this.declaracao());
|
|
206
|
-
}
|
|
207
|
-
// Se chegou até aqui, simplesmente consome o símbolo.
|
|
208
|
-
this.avancarEDevolverAnterior();
|
|
209
|
-
// this.consumir(tiposDeSimbolos.FIM_FUNCAO, "Esperado palavra-chave 'fimfuncao' após o bloco.");
|
|
210
|
-
return declaracoes;
|
|
211
|
-
}
|
|
212
|
-
chamar() {
|
|
213
|
-
let expressao = this.primario();
|
|
214
|
-
while (true) {
|
|
215
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
|
|
216
|
-
expressao = this.finalizarChamada(expressao);
|
|
217
|
-
}
|
|
218
|
-
else if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.COLCHETE_ESQUERDO)) {
|
|
219
|
-
const indices = [];
|
|
220
|
-
do {
|
|
221
|
-
indices.push(this.expressao());
|
|
222
|
-
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
223
|
-
const indice = indices[0];
|
|
224
|
-
const simboloFechamento = this.consumir(visualg_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
225
|
-
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
break;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return expressao;
|
|
232
|
-
}
|
|
233
|
-
corpoDaFuncao(tipo) {
|
|
234
|
-
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
235
|
-
this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de função.');
|
|
236
|
-
// Tipo retornado pela função.
|
|
237
|
-
if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.INTEIRO, visualg_1.default.CARACTERE)) {
|
|
238
|
-
throw this.erro(this.simbolos[this.atual], 'Esperado um tipo válido para retorno de função');
|
|
239
|
-
}
|
|
240
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após tipo retornado por 'funcao'.");
|
|
241
|
-
this.validarSegmentoVar();
|
|
242
|
-
this.validarSegmentoInicio('função');
|
|
243
|
-
const corpo = this.blocoEscopo();
|
|
244
|
-
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloAnterior.linha), null, corpo);
|
|
245
|
-
}
|
|
246
|
-
declaracaoEnquanto() {
|
|
247
|
-
const simboloAtual = this.avancarEDevolverAnterior();
|
|
248
|
-
const condicao = this.expressao();
|
|
249
|
-
this.consumir(visualg_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
|
|
250
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' em declaracão 'enquanto'.");
|
|
251
|
-
const declaracoes = [];
|
|
252
|
-
do {
|
|
253
|
-
declaracoes.push(this.declaracao());
|
|
254
|
-
} while (![visualg_1.default.FIM_ENQUANTO].includes(this.simbolos[this.atual].tipo));
|
|
255
|
-
this.consumir(visualg_1.default.FIM_ENQUANTO, "Esperado palavra-chave 'fimenquanto' para fechamento de declaração 'enquanto'.");
|
|
256
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimenquanto'.");
|
|
257
|
-
return new declaracoes_1.Enquanto(condicao, declaracoes);
|
|
258
|
-
}
|
|
259
|
-
logicaCasosEscolha() {
|
|
260
|
-
const literais = [];
|
|
261
|
-
// let simboloAtualCaso: SimboloInterface = this.avancarEDevolverAnterior();
|
|
262
|
-
let simboloAtualCaso = this.simbolos[this.atual];
|
|
263
|
-
while (simboloAtualCaso.tipo !== visualg_1.default.QUEBRA_LINHA) {
|
|
264
|
-
literais.push(this.primario());
|
|
265
|
-
this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA);
|
|
266
|
-
simboloAtualCaso = this.avancarEDevolverAnterior();
|
|
267
|
-
}
|
|
268
|
-
return literais;
|
|
269
|
-
}
|
|
270
|
-
declaracaoEscolha() {
|
|
271
|
-
const simboloAtual = this.avancarEDevolverAnterior();
|
|
272
|
-
// Parênteses são opcionais para delimitar o identificador.
|
|
273
|
-
this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO);
|
|
274
|
-
const identificador = this.primario();
|
|
275
|
-
this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_DIREITO);
|
|
276
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após variável ou literal de declaração 'caso'.");
|
|
277
|
-
// Blocos de caso
|
|
278
|
-
const caminhos = [];
|
|
279
|
-
let simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
|
|
280
|
-
while (![visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(simboloAtualBlocoCaso.tipo)) {
|
|
281
|
-
const caminhoCondicoes = this.logicaCasosEscolha();
|
|
282
|
-
/* this.consumir(
|
|
283
|
-
tiposDeSimbolos.QUEBRA_LINHA,
|
|
284
|
-
"Esperado quebra de linha após último valor de declaração 'caso'."
|
|
285
|
-
); */
|
|
286
|
-
const declaracoes = [];
|
|
287
|
-
do {
|
|
288
|
-
declaracoes.push(this.declaracao());
|
|
289
|
-
} while (![visualg_1.default.CASO, visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(this.simbolos[this.atual].tipo));
|
|
290
|
-
caminhos.push({
|
|
291
|
-
condicoes: caminhoCondicoes.filter((c) => c),
|
|
292
|
-
declaracoes: declaracoes.filter((d) => d),
|
|
293
|
-
});
|
|
294
|
-
simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
|
|
295
|
-
}
|
|
296
|
-
let caminhoPadrao = null;
|
|
297
|
-
if (simboloAtualBlocoCaso.tipo === visualg_1.default.OUTRO_CASO) {
|
|
298
|
-
const declaracoes = [];
|
|
299
|
-
do {
|
|
300
|
-
declaracoes.push(this.declaracao());
|
|
301
|
-
} while (!this.verificarTipoSimboloAtual(visualg_1.default.FIM_ESCOLHA));
|
|
302
|
-
caminhoPadrao = {
|
|
303
|
-
declaracoes: declaracoes.filter((d) => d),
|
|
304
|
-
};
|
|
305
|
-
simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
|
|
306
|
-
}
|
|
307
|
-
if (simboloAtualBlocoCaso.tipo !== visualg_1.default.FIM_ESCOLHA) {
|
|
308
|
-
throw this.erro(this.simbolos[this.atual], "Esperado palavra-chave 'fimescolha' para fechamento de declaração 'escolha'.");
|
|
309
|
-
}
|
|
310
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimescolha'.");
|
|
311
|
-
return new declaracoes_1.Escolha(identificador, caminhos, caminhoPadrao);
|
|
312
|
-
}
|
|
313
|
-
logicaComumEscreva() {
|
|
314
|
-
const simboloParenteses = this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
|
|
315
|
-
const argumentos = [];
|
|
316
|
-
// Sem não houver parâmetros, retorna vetor com literal vazio.
|
|
317
|
-
if (this.simbolos[this.atual].tipo === visualg_1.default.PARENTESE_DIREITO) {
|
|
318
|
-
this.avancarEDevolverAnterior();
|
|
319
|
-
return [new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), new construtos_1.Literal(this.hashArquivo, Number(simboloParenteses.linha), ''))
|
|
320
|
-
];
|
|
321
|
-
}
|
|
322
|
-
do {
|
|
323
|
-
const valor = this.declaracao();
|
|
324
|
-
let espacos = 0;
|
|
325
|
-
let casasDecimais = 0;
|
|
326
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
|
|
327
|
-
// Espaços
|
|
328
|
-
const simboloEspacos = this.consumir(visualg_1.default.NUMERO, 'Esperado número após sinal de dois-pontos após identificador como argumento.');
|
|
329
|
-
espacos = Number(simboloEspacos.lexema) - 1;
|
|
330
|
-
}
|
|
331
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
|
|
332
|
-
// Casas decimais
|
|
333
|
-
const simboloCasasDecimais = this.consumir(visualg_1.default.NUMERO, 'Esperado número após segundo sinal de dois-pontos após identificador como argumento.');
|
|
334
|
-
casasDecimais = Number(simboloCasasDecimais.lexema);
|
|
335
|
-
}
|
|
336
|
-
argumentos.push(new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), valor, espacos, casasDecimais));
|
|
337
|
-
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
338
|
-
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
|
|
339
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após fechamento de parênteses pós instrução 'escreva'.");
|
|
340
|
-
return argumentos;
|
|
341
|
-
}
|
|
342
|
-
declaracaoEscreva() {
|
|
343
|
-
const simboloAtual = this.avancarEDevolverAnterior();
|
|
344
|
-
const argumentos = this.logicaComumEscreva();
|
|
345
|
-
return new declaracoes_1.Escreva(Number(simboloAtual.linha), this.hashArquivo, argumentos);
|
|
346
|
-
}
|
|
347
|
-
declaracaoEscrevaMesmaLinha() {
|
|
348
|
-
const simboloAtual = this.avancarEDevolverAnterior();
|
|
349
|
-
const argumentos = this.logicaComumEscreva();
|
|
350
|
-
return new declaracoes_1.EscrevaMesmaLinha(Number(simboloAtual.linha), this.hashArquivo, argumentos);
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Criação de declaração "repita".
|
|
354
|
-
* @returns Um construto do tipo Fazer
|
|
355
|
-
*/
|
|
356
|
-
declaracaoFazer() {
|
|
357
|
-
const simboloAtual = this.avancarEDevolverAnterior();
|
|
358
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após instrução 'repita'.");
|
|
359
|
-
const declaracoes = [];
|
|
360
|
-
do {
|
|
361
|
-
declaracoes.push(this.declaracao());
|
|
362
|
-
} while (![visualg_1.default.ATE].includes(this.simbolos[this.atual].tipo));
|
|
363
|
-
this.consumir(visualg_1.default.ATE, "Esperado palavra-chave 'ate' após declaração de bloco em instrução 'repita'.");
|
|
364
|
-
const condicao = this.expressao();
|
|
365
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após condição de continuidade em instrução 'repita'.");
|
|
366
|
-
return new declaracoes_1.Fazer(this.hashArquivo, Number(simboloAtual.linha), new declaracoes_1.Bloco(this.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)), condicao);
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Criação de declaração "interrompa".
|
|
370
|
-
* Em VisuAlg, "sustar" é chamada de "interrompa".
|
|
371
|
-
* @returns Uma declaração do tipo Sustar.
|
|
372
|
-
*/
|
|
373
|
-
declaracaoInterrompa() {
|
|
374
|
-
const simboloAtual = this.avancarEDevolverAnterior();
|
|
375
|
-
// TODO: Contar blocos para colocar esta condição de erro.
|
|
376
|
-
/* if (this.blocos < 1) {
|
|
377
|
-
this.erro(this.simbolos[this.atual - 1], "'interrompa' deve estar dentro de um laço de repetição.");
|
|
378
|
-
} */
|
|
379
|
-
return new declaracoes_1.Sustar(simboloAtual);
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* Análise de uma declaração `leia()`. No VisuAlg, `leia()` aceita 1..N argumentos.
|
|
383
|
-
* @returns Uma declaração `Leia`.
|
|
384
|
-
*/
|
|
385
|
-
declaracaoLeia() {
|
|
386
|
-
const simboloAtual = this.avancarEDevolverAnterior();
|
|
387
|
-
this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes do argumento em instrução `leia`.");
|
|
388
|
-
const argumentos = [];
|
|
389
|
-
do {
|
|
390
|
-
argumentos.push(this.declaracao());
|
|
391
|
-
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
392
|
-
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após o argumento em instrução `leia`.");
|
|
393
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após fechamento de parênteses pós instrução `leia`.');
|
|
394
|
-
return new declaracoes_1.Leia(simboloAtual.hashArquivo, Number(simboloAtual.linha), argumentos);
|
|
395
|
-
}
|
|
396
|
-
declaracaoPara() {
|
|
397
|
-
const simboloPara = this.avancarEDevolverAnterior();
|
|
398
|
-
const variavelIteracao = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
|
|
399
|
-
this.consumir(visualg_1.default.DE, "Esperado palavra reservada 'de' após variáve de controle de 'para'.");
|
|
400
|
-
const numeroInicio = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
|
|
401
|
-
this.consumir(visualg_1.default.ATE, "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'.");
|
|
402
|
-
const numeroFim = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
|
|
403
|
-
this.consumir(visualg_1.default.FACA, "Esperado palavra reservada 'faca' após valor final do laço de repetição 'para'.");
|
|
404
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' do laço de repetição 'para'.");
|
|
405
|
-
const declaracoesBlocoPara = [];
|
|
406
|
-
let simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
407
|
-
while (simboloAtualBlocoPara.tipo !== visualg_1.default.FIM_PARA) {
|
|
408
|
-
declaracoesBlocoPara.push(this.declaracao());
|
|
409
|
-
simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
410
|
-
}
|
|
411
|
-
this.consumir(visualg_1.default.FIM_PARA,
|
|
412
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'fimpara'.");
|
|
413
|
-
const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
|
|
414
|
-
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroInicio.literal)), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroFim.literal)), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1))), corpo);
|
|
415
|
-
}
|
|
416
|
-
logicaComumParametros() {
|
|
417
|
-
const parametros = [];
|
|
418
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
|
|
419
|
-
while (!this.verificarTipoSimboloAtual(visualg_1.default.PARENTESE_DIREITO)) {
|
|
420
|
-
const dadosParametros = this.logicaComumParametroVisuAlg();
|
|
421
|
-
for (let parametro of dadosParametros.identificadores) {
|
|
422
|
-
parametros.push({
|
|
423
|
-
|
|
424
|
-
nome: parametro
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
// Consumir parêntese direito
|
|
429
|
-
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado parêntese direito para finalização da leitura de parâmetros.");
|
|
430
|
-
}
|
|
431
|
-
return parametros;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Procedimentos nada mais são do que funções que não retornam valor.
|
|
435
|
-
*/
|
|
436
|
-
declaracaoProcedimento() {
|
|
437
|
-
const simboloProcedimento = this.avancarEDevolverAnterior();
|
|
438
|
-
const nomeProcedimento = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado nome do procedimento após palavra-chave `procedimento`.");
|
|
439
|
-
// Parâmetros
|
|
440
|
-
const parametros = this.logicaComumParametros();
|
|
441
|
-
this.validarSegmentoVar();
|
|
442
|
-
this.validarSegmentoInicio('procedimento');
|
|
443
|
-
const corpo = this.blocoEscopo();
|
|
444
|
-
return new declaracoes_1.FuncaoDeclaracao(nomeProcedimento, new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloProcedimento.linha), parametros, corpo.filter(d => d)));
|
|
445
|
-
}
|
|
446
|
-
declaracaoSe() {
|
|
447
|
-
const simboloSe = this.avancarEDevolverAnterior();
|
|
448
|
-
const condicao = this.expressao();
|
|
449
|
-
this.consumir(visualg_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
|
|
450
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'entao' em declaração 'se'.");
|
|
451
|
-
const declaracoes = [];
|
|
452
|
-
do {
|
|
453
|
-
declaracoes.push(this.declaracao());
|
|
454
|
-
} while (![visualg_1.default.SENAO, visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
|
|
455
|
-
let caminhoSenao = null;
|
|
456
|
-
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SENAO)) {
|
|
457
|
-
const simboloSenao = this.simbolos[this.atual - 1];
|
|
458
|
-
const declaracoesSenao = [];
|
|
459
|
-
do {
|
|
460
|
-
declaracoesSenao.push(this.declaracao());
|
|
461
|
-
} while (![visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
|
|
462
|
-
caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
|
|
463
|
-
}
|
|
464
|
-
this.consumir(visualg_1.default.FIM_SE, "Esperado palavra-chave 'fimse' para fechamento de declaração 'se'.");
|
|
465
|
-
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimse'.");
|
|
466
|
-
return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
|
|
467
|
-
}
|
|
468
|
-
declaracao() {
|
|
469
|
-
// Refatorar isso no futuro.
|
|
470
|
-
const simboloAtual = this.simbolos[this.atual];
|
|
471
|
-
switch (simboloAtual.tipo) {
|
|
472
|
-
case visualg_1.default.ENQUANTO:
|
|
473
|
-
return this.declaracaoEnquanto();
|
|
474
|
-
case visualg_1.default.ESCOLHA:
|
|
475
|
-
return this.declaracaoEscolha();
|
|
476
|
-
case visualg_1.default.ESCREVA:
|
|
477
|
-
return this.declaracaoEscrevaMesmaLinha();
|
|
478
|
-
case visualg_1.default.ESCREVA_LINHA:
|
|
479
|
-
return this.declaracaoEscreva();
|
|
480
|
-
case visualg_1.default.FUNCAO:
|
|
481
|
-
return this.funcao('funcao');
|
|
482
|
-
case visualg_1.default.INTERROMPA:
|
|
483
|
-
return this.declaracaoInterrompa();
|
|
484
|
-
case visualg_1.default.LEIA:
|
|
485
|
-
return this.declaracaoLeia();
|
|
486
|
-
case visualg_1.default.PARA:
|
|
487
|
-
return this.declaracaoPara();
|
|
488
|
-
case visualg_1.default.PARENTESE_DIREITO:
|
|
489
|
-
throw new Error('Não deveria estar caindo aqui.');
|
|
490
|
-
case visualg_1.default.PROCEDIMENTO:
|
|
491
|
-
return this.declaracaoProcedimento();
|
|
492
|
-
case visualg_1.default.QUEBRA_LINHA:
|
|
493
|
-
this.avancarEDevolverAnterior();
|
|
494
|
-
return null;
|
|
495
|
-
case visualg_1.default.REPITA:
|
|
496
|
-
return this.declaracaoFazer();
|
|
497
|
-
case visualg_1.default.SE:
|
|
498
|
-
return this.declaracaoSe();
|
|
499
|
-
default:
|
|
500
|
-
return this.expressao();
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
/**
|
|
504
|
-
* No VisuAlg, há uma determinada cadência de validação de símbolos.
|
|
505
|
-
* - O primeiro símbolo é `algoritmo`, seguido por um identificador e
|
|
506
|
-
* uma quebra de linha.
|
|
507
|
-
* - O segundo símbolo é `var`, que pode ser seguido por uma série de
|
|
508
|
-
* declarações de variáveis e finalizado por uma quebra de linha.
|
|
509
|
-
* - O terceiro símbolo é `inicio`, seguido por uma quebra de linha.
|
|
510
|
-
* - O último símbolo deve ser `fimalgoritmo`, que também é usado para
|
|
511
|
-
* definir quando não existem mais construtos a serem adicionados.
|
|
512
|
-
* @param retornoLexador Os símbolos entendidos pelo Lexador.
|
|
513
|
-
* @param hashArquivo Obrigatório por interface mas não usado aqui.
|
|
514
|
-
*/
|
|
515
|
-
analisar(retornoLexador, hashArquivo) {
|
|
516
|
-
this.erros = [];
|
|
517
|
-
this.atual = 0;
|
|
518
|
-
this.blocos = 0;
|
|
519
|
-
this.hashArquivo = hashArquivo || 0;
|
|
520
|
-
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
521
|
-
let declaracoes = [];
|
|
522
|
-
this.validarSegmentoAlgoritmo();
|
|
523
|
-
declaracoes = declaracoes.concat(this.validarSegmentoVar());
|
|
524
|
-
this.validarSegmentoInicio('algoritmo');
|
|
525
|
-
while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== visualg_1.default.FIM_ALGORITMO) {
|
|
526
|
-
declaracoes.push(this.declaracao());
|
|
527
|
-
}
|
|
528
|
-
return {
|
|
529
|
-
declaracoes: declaracoes.filter((d) => d),
|
|
530
|
-
erros: this.erros,
|
|
531
|
-
};
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
exports.AvaliadorSintaticoVisuAlg = AvaliadorSintaticoVisuAlg;
|
|
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.AvaliadorSintaticoVisuAlg = void 0;
|
|
7
|
+
const avaliador_sintatico_base_1 = require("../avaliador-sintatico-base");
|
|
8
|
+
const declaracoes_1 = require("../../declaracoes");
|
|
9
|
+
const construtos_1 = require("../../construtos");
|
|
10
|
+
const lexador_1 = require("../../lexador");
|
|
11
|
+
const visualg_1 = __importDefault(require("../../tipos-de-simbolos/visualg"));
|
|
12
|
+
class AvaliadorSintaticoVisuAlg extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
|
|
13
|
+
validarSegmentoAlgoritmo() {
|
|
14
|
+
this.consumir(visualg_1.default.ALGORITMO, "Esperada expressão 'algoritmo' para inicializar programa.");
|
|
15
|
+
this.consumir(visualg_1.default.CARACTERE, "Esperad cadeia de caracteres após palavra-chave 'algoritmo'.");
|
|
16
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após definição do segmento 'algoritmo'.");
|
|
17
|
+
}
|
|
18
|
+
criarVetorNDimensional(dimensoes) {
|
|
19
|
+
if (dimensoes.length > 0) {
|
|
20
|
+
const dimensao = dimensoes[0] + 1;
|
|
21
|
+
const resto = dimensoes.slice(1);
|
|
22
|
+
const novoArray = Array(dimensao);
|
|
23
|
+
for (let i = 0; i < dimensao; i++) {
|
|
24
|
+
novoArray[i] = this.criarVetorNDimensional(resto);
|
|
25
|
+
}
|
|
26
|
+
return novoArray;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
validarDimensoesVetor() {
|
|
33
|
+
let dimensoes = [];
|
|
34
|
+
do {
|
|
35
|
+
const numeroInicial = this.consumir(visualg_1.default.NUMERO, 'Esperado índice inicial para inicialização de dimensão de vetor.');
|
|
36
|
+
this.consumir(visualg_1.default.PONTO, 'Esperado primeiro ponto após índice inicial para inicialização de dimensão de vetor.');
|
|
37
|
+
this.consumir(visualg_1.default.PONTO, 'Esperado segundo ponto após índice inicial para inicialização de dimensão de vetor.');
|
|
38
|
+
const numeroFinal = this.consumir(visualg_1.default.NUMERO, 'Esperado índice final para inicialização de dimensão de vetor.');
|
|
39
|
+
dimensoes.push(Number(numeroFinal.literal) - Number(numeroInicial.literal));
|
|
40
|
+
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
41
|
+
return dimensoes;
|
|
42
|
+
}
|
|
43
|
+
logicaComumParametroVisuAlg() {
|
|
44
|
+
const identificadores = [];
|
|
45
|
+
do {
|
|
46
|
+
identificadores.push(this.consumir(visualg_1.default.IDENTIFICADOR, 'Esperado nome de variável.'));
|
|
47
|
+
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
48
|
+
this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de variável.');
|
|
49
|
+
if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
|
|
50
|
+
throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido.');
|
|
51
|
+
}
|
|
52
|
+
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
53
|
+
const tipoVariavel = simboloAnterior.tipo;
|
|
54
|
+
return {
|
|
55
|
+
identificadores,
|
|
56
|
+
tipo: tipoVariavel,
|
|
57
|
+
simbolo: simboloAnterior
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Validação do segmento de declaração de variáveis (opcional).
|
|
62
|
+
* @returns Vetor de Construtos para inicialização de variáveis.
|
|
63
|
+
*/
|
|
64
|
+
validarSegmentoVar() {
|
|
65
|
+
// Podem haver linhas de comentários acima de `var`, que geram
|
|
66
|
+
// quebras de linha.
|
|
67
|
+
while (this.simbolos[this.atual].tipo === visualg_1.default.QUEBRA_LINHA) {
|
|
68
|
+
this.avancarEDevolverAnterior();
|
|
69
|
+
}
|
|
70
|
+
if (!this.verificarTipoSimboloAtual(visualg_1.default.VAR)) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const inicializacoes = [];
|
|
74
|
+
this.avancarEDevolverAnterior(); // Var
|
|
75
|
+
// Quebra de linha é opcional aqui.
|
|
76
|
+
// this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.QUEBRA_LINHA);
|
|
77
|
+
while (!this.verificarTipoSimboloAtual(visualg_1.default.INICIO)) {
|
|
78
|
+
// Se ainda houver quebras de linha, volta para o começo do `while`.
|
|
79
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.QUEBRA_LINHA)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
83
|
+
switch (simboloAtual.tipo) {
|
|
84
|
+
case visualg_1.default.PROCEDIMENTO:
|
|
85
|
+
const dadosProcedimento = this.declaracaoProcedimento();
|
|
86
|
+
inicializacoes.push(dadosProcedimento);
|
|
87
|
+
break;
|
|
88
|
+
default:
|
|
89
|
+
const dadosVariaveis = this.logicaComumParametroVisuAlg();
|
|
90
|
+
// Se chegou até aqui, variáveis são válidas.
|
|
91
|
+
// Devem ser declaradas com um valor inicial padrão.
|
|
92
|
+
for (let identificador of dadosVariaveis.identificadores) {
|
|
93
|
+
switch (dadosVariaveis.tipo) {
|
|
94
|
+
case visualg_1.default.CARACTERE:
|
|
95
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), '')));
|
|
96
|
+
break;
|
|
97
|
+
case visualg_1.default.INTEIRO:
|
|
98
|
+
case visualg_1.default.REAL:
|
|
99
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), 0)));
|
|
100
|
+
break;
|
|
101
|
+
case visualg_1.default.LOGICO:
|
|
102
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), false)));
|
|
103
|
+
break;
|
|
104
|
+
case visualg_1.default.VETOR:
|
|
105
|
+
// TODO: Validar vetor
|
|
106
|
+
this.consumir(visualg_1.default.COLCHETE_ESQUERDO, 'Esperado colchete esquerdo após palavra reservada "vetor".');
|
|
107
|
+
const dimensoes = this.validarDimensoesVetor();
|
|
108
|
+
this.consumir(visualg_1.default.COLCHETE_DIREITO, 'Esperado colchete direito após declaração de dimensões de vetor.');
|
|
109
|
+
this.consumir(visualg_1.default.DE, 'Esperado palavra reservada "de" após declaração de dimensões de vetor.');
|
|
110
|
+
if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.CARACTERE, visualg_1.default.INTEIRO, visualg_1.default.LOGICO, visualg_1.default.REAL, visualg_1.default.VETOR)) {
|
|
111
|
+
throw this.erro(this.simbolos[this.atual], 'Tipo de variável não conhecido para inicialização de vetor.');
|
|
112
|
+
}
|
|
113
|
+
inicializacoes.push(new declaracoes_1.Var(identificador, new construtos_1.Literal(this.hashArquivo, Number(dadosVariaveis.simbolo.linha), this.criarVetorNDimensional(dimensoes))));
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após declaração de variável.');
|
|
120
|
+
}
|
|
121
|
+
return inicializacoes;
|
|
122
|
+
}
|
|
123
|
+
validarSegmentoInicio(algoritmoOuFuncao) {
|
|
124
|
+
this.consumir(visualg_1.default.INICIO, `Esperada expressão 'inicio' para marcar escopo de ${algoritmoOuFuncao}.`);
|
|
125
|
+
}
|
|
126
|
+
estaNoFinal() {
|
|
127
|
+
return this.atual === this.simbolos.length;
|
|
128
|
+
}
|
|
129
|
+
metodoBibliotecaGlobal() {
|
|
130
|
+
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
131
|
+
switch (simboloAnterior.lexema) {
|
|
132
|
+
case 'int':
|
|
133
|
+
return new construtos_1.Chamada(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, new lexador_1.Simbolo(visualg_1.default.IDENTIFICADOR, 'inteiro', null, Number(simboloAnterior.linha), this.hashArquivo)), null, []);
|
|
134
|
+
default:
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
primario() {
|
|
139
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
140
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.FALSO))
|
|
141
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), false);
|
|
142
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VERDADEIRO))
|
|
143
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloAtual.linha), true);
|
|
144
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.IDENTIFICADOR, visualg_1.default.METODO_BIBLIOTECA_GLOBAL)) {
|
|
145
|
+
return new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1]);
|
|
146
|
+
}
|
|
147
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.NUMERO, visualg_1.default.CARACTERE)) {
|
|
148
|
+
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
149
|
+
return new construtos_1.Literal(this.hashArquivo, Number(simboloAnterior.linha), simboloAnterior.literal);
|
|
150
|
+
}
|
|
151
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
|
|
152
|
+
const expressao = this.expressao();
|
|
153
|
+
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após a expressão.");
|
|
154
|
+
return new construtos_1.Agrupamento(this.hashArquivo, Number(simboloAtual.linha), expressao);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
comparacaoIgualdade() {
|
|
158
|
+
let expressao = this.comparar();
|
|
159
|
+
while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DIFERENTE, visualg_1.default.IGUAL)) {
|
|
160
|
+
// TODO: Este é um caso que o interpretador não deveria ter conhecimento
|
|
161
|
+
// do que é um símbolo.
|
|
162
|
+
// Em VisuAlg não existe '==', apenas '=', já que o símbolo de atribuição
|
|
163
|
+
// é uma seta: '<-'.
|
|
164
|
+
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
165
|
+
let operador = new lexador_1.Simbolo('IGUAL_IGUAL', '=', null, this.hashArquivo, Number(simboloAnterior.linha));
|
|
166
|
+
if (simboloAnterior.tipo === visualg_1.default.DIFERENTE) {
|
|
167
|
+
operador = simboloAnterior;
|
|
168
|
+
}
|
|
169
|
+
const direito = this.comparar();
|
|
170
|
+
expressao = new construtos_1.Binario(this.hashArquivo, expressao, operador, direito);
|
|
171
|
+
}
|
|
172
|
+
return expressao;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Método que resolve atribuições.
|
|
176
|
+
* @returns Um construto do tipo `Atribuir`, `Conjunto` ou `AtribuicaoSobrescrita`.
|
|
177
|
+
*/
|
|
178
|
+
atribuir() {
|
|
179
|
+
const expressao = this.ou();
|
|
180
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SETA_ATRIBUICAO)) {
|
|
181
|
+
const setaAtribuicao = this.simbolos[this.atual - 1];
|
|
182
|
+
const valor = this.atribuir();
|
|
183
|
+
if (expressao instanceof construtos_1.Variavel) {
|
|
184
|
+
const simbolo = expressao.simbolo;
|
|
185
|
+
return new construtos_1.Atribuir(this.hashArquivo, simbolo, valor);
|
|
186
|
+
}
|
|
187
|
+
else if (expressao instanceof construtos_1.AcessoIndiceVariavel) {
|
|
188
|
+
return new construtos_1.AtribuicaoSobrescrita(this.hashArquivo, expressao.linha, expressao.entidadeChamada, expressao.indice, valor);
|
|
189
|
+
}
|
|
190
|
+
this.erro(setaAtribuicao, 'Tarefa de atribuição inválida');
|
|
191
|
+
}
|
|
192
|
+
return expressao;
|
|
193
|
+
}
|
|
194
|
+
expressao() {
|
|
195
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.LEIA))
|
|
196
|
+
return this.declaracaoLeia();
|
|
197
|
+
return this.atribuir();
|
|
198
|
+
}
|
|
199
|
+
blocoEscopo() {
|
|
200
|
+
const declaracoes = [];
|
|
201
|
+
while (![
|
|
202
|
+
visualg_1.default.FIM_FUNCAO,
|
|
203
|
+
visualg_1.default.FIM_PROCEDIMENTO
|
|
204
|
+
].includes(this.simbolos[this.atual].tipo) && !this.estaNoFinal()) {
|
|
205
|
+
declaracoes.push(this.declaracao());
|
|
206
|
+
}
|
|
207
|
+
// Se chegou até aqui, simplesmente consome o símbolo.
|
|
208
|
+
this.avancarEDevolverAnterior();
|
|
209
|
+
// this.consumir(tiposDeSimbolos.FIM_FUNCAO, "Esperado palavra-chave 'fimfuncao' após o bloco.");
|
|
210
|
+
return declaracoes;
|
|
211
|
+
}
|
|
212
|
+
chamar() {
|
|
213
|
+
let expressao = this.primario();
|
|
214
|
+
while (true) {
|
|
215
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
|
|
216
|
+
expressao = this.finalizarChamada(expressao);
|
|
217
|
+
}
|
|
218
|
+
else if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.COLCHETE_ESQUERDO)) {
|
|
219
|
+
const indices = [];
|
|
220
|
+
do {
|
|
221
|
+
indices.push(this.expressao());
|
|
222
|
+
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
223
|
+
const indice = indices[0];
|
|
224
|
+
const simboloFechamento = this.consumir(visualg_1.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
|
|
225
|
+
expressao = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressao, indice, simboloFechamento);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return expressao;
|
|
232
|
+
}
|
|
233
|
+
corpoDaFuncao(tipo) {
|
|
234
|
+
const simboloAnterior = this.simbolos[this.atual - 1];
|
|
235
|
+
this.consumir(visualg_1.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de função.');
|
|
236
|
+
// Tipo retornado pela função.
|
|
237
|
+
if (!this.verificarSeSimboloAtualEIgualA(visualg_1.default.INTEIRO, visualg_1.default.CARACTERE)) {
|
|
238
|
+
throw this.erro(this.simbolos[this.atual], 'Esperado um tipo válido para retorno de função');
|
|
239
|
+
}
|
|
240
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após tipo retornado por 'funcao'.");
|
|
241
|
+
this.validarSegmentoVar();
|
|
242
|
+
this.validarSegmentoInicio('função');
|
|
243
|
+
const corpo = this.blocoEscopo();
|
|
244
|
+
return new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloAnterior.linha), null, corpo);
|
|
245
|
+
}
|
|
246
|
+
declaracaoEnquanto() {
|
|
247
|
+
const simboloAtual = this.avancarEDevolverAnterior();
|
|
248
|
+
const condicao = this.expressao();
|
|
249
|
+
this.consumir(visualg_1.default.FACA, "Esperado paravra reservada 'faca' após condição de continuidade em declaracão 'enquanto'.");
|
|
250
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' em declaracão 'enquanto'.");
|
|
251
|
+
const declaracoes = [];
|
|
252
|
+
do {
|
|
253
|
+
declaracoes.push(this.declaracao());
|
|
254
|
+
} while (![visualg_1.default.FIM_ENQUANTO].includes(this.simbolos[this.atual].tipo));
|
|
255
|
+
this.consumir(visualg_1.default.FIM_ENQUANTO, "Esperado palavra-chave 'fimenquanto' para fechamento de declaração 'enquanto'.");
|
|
256
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimenquanto'.");
|
|
257
|
+
return new declaracoes_1.Enquanto(condicao, declaracoes);
|
|
258
|
+
}
|
|
259
|
+
logicaCasosEscolha() {
|
|
260
|
+
const literais = [];
|
|
261
|
+
// let simboloAtualCaso: SimboloInterface = this.avancarEDevolverAnterior();
|
|
262
|
+
let simboloAtualCaso = this.simbolos[this.atual];
|
|
263
|
+
while (simboloAtualCaso.tipo !== visualg_1.default.QUEBRA_LINHA) {
|
|
264
|
+
literais.push(this.primario());
|
|
265
|
+
this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA);
|
|
266
|
+
simboloAtualCaso = this.avancarEDevolverAnterior();
|
|
267
|
+
}
|
|
268
|
+
return literais;
|
|
269
|
+
}
|
|
270
|
+
declaracaoEscolha() {
|
|
271
|
+
const simboloAtual = this.avancarEDevolverAnterior();
|
|
272
|
+
// Parênteses são opcionais para delimitar o identificador.
|
|
273
|
+
this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO);
|
|
274
|
+
const identificador = this.primario();
|
|
275
|
+
this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_DIREITO);
|
|
276
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após variável ou literal de declaração 'caso'.");
|
|
277
|
+
// Blocos de caso
|
|
278
|
+
const caminhos = [];
|
|
279
|
+
let simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
|
|
280
|
+
while (![visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(simboloAtualBlocoCaso.tipo)) {
|
|
281
|
+
const caminhoCondicoes = this.logicaCasosEscolha();
|
|
282
|
+
/* this.consumir(
|
|
283
|
+
tiposDeSimbolos.QUEBRA_LINHA,
|
|
284
|
+
"Esperado quebra de linha após último valor de declaração 'caso'."
|
|
285
|
+
); */
|
|
286
|
+
const declaracoes = [];
|
|
287
|
+
do {
|
|
288
|
+
declaracoes.push(this.declaracao());
|
|
289
|
+
} while (![visualg_1.default.CASO, visualg_1.default.OUTRO_CASO, visualg_1.default.FIM_ESCOLHA].includes(this.simbolos[this.atual].tipo));
|
|
290
|
+
caminhos.push({
|
|
291
|
+
condicoes: caminhoCondicoes.filter((c) => c),
|
|
292
|
+
declaracoes: declaracoes.filter((d) => d),
|
|
293
|
+
});
|
|
294
|
+
simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
|
|
295
|
+
}
|
|
296
|
+
let caminhoPadrao = null;
|
|
297
|
+
if (simboloAtualBlocoCaso.tipo === visualg_1.default.OUTRO_CASO) {
|
|
298
|
+
const declaracoes = [];
|
|
299
|
+
do {
|
|
300
|
+
declaracoes.push(this.declaracao());
|
|
301
|
+
} while (!this.verificarTipoSimboloAtual(visualg_1.default.FIM_ESCOLHA));
|
|
302
|
+
caminhoPadrao = {
|
|
303
|
+
declaracoes: declaracoes.filter((d) => d),
|
|
304
|
+
};
|
|
305
|
+
simboloAtualBlocoCaso = this.avancarEDevolverAnterior();
|
|
306
|
+
}
|
|
307
|
+
if (simboloAtualBlocoCaso.tipo !== visualg_1.default.FIM_ESCOLHA) {
|
|
308
|
+
throw this.erro(this.simbolos[this.atual], "Esperado palavra-chave 'fimescolha' para fechamento de declaração 'escolha'.");
|
|
309
|
+
}
|
|
310
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimescolha'.");
|
|
311
|
+
return new declaracoes_1.Escolha(identificador, caminhos, caminhoPadrao);
|
|
312
|
+
}
|
|
313
|
+
logicaComumEscreva() {
|
|
314
|
+
const simboloParenteses = this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes dos valores em escreva.");
|
|
315
|
+
const argumentos = [];
|
|
316
|
+
// Sem não houver parâmetros, retorna vetor com literal vazio.
|
|
317
|
+
if (this.simbolos[this.atual].tipo === visualg_1.default.PARENTESE_DIREITO) {
|
|
318
|
+
this.avancarEDevolverAnterior();
|
|
319
|
+
return [new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), new construtos_1.Literal(this.hashArquivo, Number(simboloParenteses.linha), ''))
|
|
320
|
+
];
|
|
321
|
+
}
|
|
322
|
+
do {
|
|
323
|
+
const valor = this.declaracao();
|
|
324
|
+
let espacos = 0;
|
|
325
|
+
let casasDecimais = 0;
|
|
326
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
|
|
327
|
+
// Espaços
|
|
328
|
+
const simboloEspacos = this.consumir(visualg_1.default.NUMERO, 'Esperado número após sinal de dois-pontos após identificador como argumento.');
|
|
329
|
+
espacos = Number(simboloEspacos.lexema) - 1;
|
|
330
|
+
}
|
|
331
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.DOIS_PONTOS)) {
|
|
332
|
+
// Casas decimais
|
|
333
|
+
const simboloCasasDecimais = this.consumir(visualg_1.default.NUMERO, 'Esperado número após segundo sinal de dois-pontos após identificador como argumento.');
|
|
334
|
+
casasDecimais = Number(simboloCasasDecimais.lexema);
|
|
335
|
+
}
|
|
336
|
+
argumentos.push(new construtos_1.FormatacaoEscrita(this.hashArquivo, Number(simboloParenteses.linha), valor, espacos, casasDecimais));
|
|
337
|
+
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
338
|
+
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após os valores em escreva.");
|
|
339
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após fechamento de parênteses pós instrução 'escreva'.");
|
|
340
|
+
return argumentos;
|
|
341
|
+
}
|
|
342
|
+
declaracaoEscreva() {
|
|
343
|
+
const simboloAtual = this.avancarEDevolverAnterior();
|
|
344
|
+
const argumentos = this.logicaComumEscreva();
|
|
345
|
+
return new declaracoes_1.Escreva(Number(simboloAtual.linha), this.hashArquivo, argumentos);
|
|
346
|
+
}
|
|
347
|
+
declaracaoEscrevaMesmaLinha() {
|
|
348
|
+
const simboloAtual = this.avancarEDevolverAnterior();
|
|
349
|
+
const argumentos = this.logicaComumEscreva();
|
|
350
|
+
return new declaracoes_1.EscrevaMesmaLinha(Number(simboloAtual.linha), this.hashArquivo, argumentos);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Criação de declaração "repita".
|
|
354
|
+
* @returns Um construto do tipo Fazer
|
|
355
|
+
*/
|
|
356
|
+
declaracaoFazer() {
|
|
357
|
+
const simboloAtual = this.avancarEDevolverAnterior();
|
|
358
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após instrução 'repita'.");
|
|
359
|
+
const declaracoes = [];
|
|
360
|
+
do {
|
|
361
|
+
declaracoes.push(this.declaracao());
|
|
362
|
+
} while (![visualg_1.default.ATE].includes(this.simbolos[this.atual].tipo));
|
|
363
|
+
this.consumir(visualg_1.default.ATE, "Esperado palavra-chave 'ate' após declaração de bloco em instrução 'repita'.");
|
|
364
|
+
const condicao = this.expressao();
|
|
365
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após condição de continuidade em instrução 'repita'.");
|
|
366
|
+
return new declaracoes_1.Fazer(this.hashArquivo, Number(simboloAtual.linha), new declaracoes_1.Bloco(this.hashArquivo, Number(simboloAtual.linha), declaracoes.filter((d) => d)), condicao);
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Criação de declaração "interrompa".
|
|
370
|
+
* Em VisuAlg, "sustar" é chamada de "interrompa".
|
|
371
|
+
* @returns Uma declaração do tipo Sustar.
|
|
372
|
+
*/
|
|
373
|
+
declaracaoInterrompa() {
|
|
374
|
+
const simboloAtual = this.avancarEDevolverAnterior();
|
|
375
|
+
// TODO: Contar blocos para colocar esta condição de erro.
|
|
376
|
+
/* if (this.blocos < 1) {
|
|
377
|
+
this.erro(this.simbolos[this.atual - 1], "'interrompa' deve estar dentro de um laço de repetição.");
|
|
378
|
+
} */
|
|
379
|
+
return new declaracoes_1.Sustar(simboloAtual);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Análise de uma declaração `leia()`. No VisuAlg, `leia()` aceita 1..N argumentos.
|
|
383
|
+
* @returns Uma declaração `Leia`.
|
|
384
|
+
*/
|
|
385
|
+
declaracaoLeia() {
|
|
386
|
+
const simboloAtual = this.avancarEDevolverAnterior();
|
|
387
|
+
this.consumir(visualg_1.default.PARENTESE_ESQUERDO, "Esperado '(' antes do argumento em instrução `leia`.");
|
|
388
|
+
const argumentos = [];
|
|
389
|
+
do {
|
|
390
|
+
argumentos.push(this.declaracao());
|
|
391
|
+
} while (this.verificarSeSimboloAtualEIgualA(visualg_1.default.VIRGULA));
|
|
392
|
+
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado ')' após o argumento em instrução `leia`.");
|
|
393
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, 'Esperado quebra de linha após fechamento de parênteses pós instrução `leia`.');
|
|
394
|
+
return new declaracoes_1.Leia(simboloAtual.hashArquivo, Number(simboloAtual.linha), argumentos);
|
|
395
|
+
}
|
|
396
|
+
declaracaoPara() {
|
|
397
|
+
const simboloPara = this.avancarEDevolverAnterior();
|
|
398
|
+
const variavelIteracao = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado identificador de variável após 'para'.");
|
|
399
|
+
this.consumir(visualg_1.default.DE, "Esperado palavra reservada 'de' após variáve de controle de 'para'.");
|
|
400
|
+
const numeroInicio = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
|
|
401
|
+
this.consumir(visualg_1.default.ATE, "Esperado palavra reservada 'ate' após valor inicial do laço de repetição 'para'.");
|
|
402
|
+
const numeroFim = this.consumir(visualg_1.default.NUMERO, "Esperado literal ou variável após 'de' em declaração 'para'.");
|
|
403
|
+
this.consumir(visualg_1.default.FACA, "Esperado palavra reservada 'faca' após valor final do laço de repetição 'para'.");
|
|
404
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'faca' do laço de repetição 'para'.");
|
|
405
|
+
const declaracoesBlocoPara = [];
|
|
406
|
+
let simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
407
|
+
while (simboloAtualBlocoPara.tipo !== visualg_1.default.FIM_PARA) {
|
|
408
|
+
declaracoesBlocoPara.push(this.declaracao());
|
|
409
|
+
simboloAtualBlocoPara = this.simbolos[this.atual];
|
|
410
|
+
}
|
|
411
|
+
this.consumir(visualg_1.default.FIM_PARA, '');
|
|
412
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'fimpara'.");
|
|
413
|
+
const corpo = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloPara.linha) + 1, declaracoesBlocoPara.filter((d) => d));
|
|
414
|
+
return new declaracoes_1.Para(this.hashArquivo, Number(simboloPara.linha), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroInicio.literal)), new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.MENOR, '', '', Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), numeroFim.literal)), new construtos_1.Atribuir(this.hashArquivo, variavelIteracao, new construtos_1.Binario(this.hashArquivo, new construtos_1.Variavel(this.hashArquivo, variavelIteracao), new lexador_1.Simbolo(visualg_1.default.ADICAO, '', null, Number(simboloPara.linha), this.hashArquivo), new construtos_1.Literal(this.hashArquivo, Number(simboloPara.linha), 1))), corpo);
|
|
415
|
+
}
|
|
416
|
+
logicaComumParametros() {
|
|
417
|
+
const parametros = [];
|
|
418
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.PARENTESE_ESQUERDO)) {
|
|
419
|
+
while (!this.verificarTipoSimboloAtual(visualg_1.default.PARENTESE_DIREITO)) {
|
|
420
|
+
const dadosParametros = this.logicaComumParametroVisuAlg();
|
|
421
|
+
for (let parametro of dadosParametros.identificadores) {
|
|
422
|
+
parametros.push({
|
|
423
|
+
abrangencia: 'padrao',
|
|
424
|
+
nome: parametro
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// Consumir parêntese direito
|
|
429
|
+
this.consumir(visualg_1.default.PARENTESE_DIREITO, "Esperado parêntese direito para finalização da leitura de parâmetros.");
|
|
430
|
+
}
|
|
431
|
+
return parametros;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Procedimentos nada mais são do que funções que não retornam valor.
|
|
435
|
+
*/
|
|
436
|
+
declaracaoProcedimento() {
|
|
437
|
+
const simboloProcedimento = this.avancarEDevolverAnterior();
|
|
438
|
+
const nomeProcedimento = this.consumir(visualg_1.default.IDENTIFICADOR, "Esperado nome do procedimento após palavra-chave `procedimento`.");
|
|
439
|
+
// Parâmetros
|
|
440
|
+
const parametros = this.logicaComumParametros();
|
|
441
|
+
this.validarSegmentoVar();
|
|
442
|
+
this.validarSegmentoInicio('procedimento');
|
|
443
|
+
const corpo = this.blocoEscopo();
|
|
444
|
+
return new declaracoes_1.FuncaoDeclaracao(nomeProcedimento, new construtos_1.FuncaoConstruto(this.hashArquivo, Number(simboloProcedimento.linha), parametros, corpo.filter(d => d)));
|
|
445
|
+
}
|
|
446
|
+
declaracaoSe() {
|
|
447
|
+
const simboloSe = this.avancarEDevolverAnterior();
|
|
448
|
+
const condicao = this.expressao();
|
|
449
|
+
this.consumir(visualg_1.default.ENTAO, "Esperado palavra reservada 'entao' após condição em declaração 'se'.");
|
|
450
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra reservada 'entao' em declaração 'se'.");
|
|
451
|
+
const declaracoes = [];
|
|
452
|
+
do {
|
|
453
|
+
declaracoes.push(this.declaracao());
|
|
454
|
+
} while (![visualg_1.default.SENAO, visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
|
|
455
|
+
let caminhoSenao = null;
|
|
456
|
+
if (this.verificarSeSimboloAtualEIgualA(visualg_1.default.SENAO)) {
|
|
457
|
+
const simboloSenao = this.simbolos[this.atual - 1];
|
|
458
|
+
const declaracoesSenao = [];
|
|
459
|
+
do {
|
|
460
|
+
declaracoesSenao.push(this.declaracao());
|
|
461
|
+
} while (![visualg_1.default.FIM_SE].includes(this.simbolos[this.atual].tipo));
|
|
462
|
+
caminhoSenao = new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSenao.linha), declaracoesSenao.filter((d) => d));
|
|
463
|
+
}
|
|
464
|
+
this.consumir(visualg_1.default.FIM_SE, "Esperado palavra-chave 'fimse' para fechamento de declaração 'se'.");
|
|
465
|
+
this.consumir(visualg_1.default.QUEBRA_LINHA, "Esperado quebra de linha após palavra-chave 'fimse'.");
|
|
466
|
+
return new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(this.hashArquivo, Number(simboloSe.linha), declaracoes.filter((d) => d)), [], caminhoSenao);
|
|
467
|
+
}
|
|
468
|
+
declaracao() {
|
|
469
|
+
// Refatorar isso no futuro.
|
|
470
|
+
const simboloAtual = this.simbolos[this.atual];
|
|
471
|
+
switch (simboloAtual.tipo) {
|
|
472
|
+
case visualg_1.default.ENQUANTO:
|
|
473
|
+
return this.declaracaoEnquanto();
|
|
474
|
+
case visualg_1.default.ESCOLHA:
|
|
475
|
+
return this.declaracaoEscolha();
|
|
476
|
+
case visualg_1.default.ESCREVA:
|
|
477
|
+
return this.declaracaoEscrevaMesmaLinha();
|
|
478
|
+
case visualg_1.default.ESCREVA_LINHA:
|
|
479
|
+
return this.declaracaoEscreva();
|
|
480
|
+
case visualg_1.default.FUNCAO:
|
|
481
|
+
return this.funcao('funcao');
|
|
482
|
+
case visualg_1.default.INTERROMPA:
|
|
483
|
+
return this.declaracaoInterrompa();
|
|
484
|
+
case visualg_1.default.LEIA:
|
|
485
|
+
return this.declaracaoLeia();
|
|
486
|
+
case visualg_1.default.PARA:
|
|
487
|
+
return this.declaracaoPara();
|
|
488
|
+
case visualg_1.default.PARENTESE_DIREITO:
|
|
489
|
+
throw new Error('Não deveria estar caindo aqui.');
|
|
490
|
+
case visualg_1.default.PROCEDIMENTO:
|
|
491
|
+
return this.declaracaoProcedimento();
|
|
492
|
+
case visualg_1.default.QUEBRA_LINHA:
|
|
493
|
+
this.avancarEDevolverAnterior();
|
|
494
|
+
return null;
|
|
495
|
+
case visualg_1.default.REPITA:
|
|
496
|
+
return this.declaracaoFazer();
|
|
497
|
+
case visualg_1.default.SE:
|
|
498
|
+
return this.declaracaoSe();
|
|
499
|
+
default:
|
|
500
|
+
return this.expressao();
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* No VisuAlg, há uma determinada cadência de validação de símbolos.
|
|
505
|
+
* - O primeiro símbolo é `algoritmo`, seguido por um identificador e
|
|
506
|
+
* uma quebra de linha.
|
|
507
|
+
* - O segundo símbolo é `var`, que pode ser seguido por uma série de
|
|
508
|
+
* declarações de variáveis e finalizado por uma quebra de linha.
|
|
509
|
+
* - O terceiro símbolo é `inicio`, seguido por uma quebra de linha.
|
|
510
|
+
* - O último símbolo deve ser `fimalgoritmo`, que também é usado para
|
|
511
|
+
* definir quando não existem mais construtos a serem adicionados.
|
|
512
|
+
* @param retornoLexador Os símbolos entendidos pelo Lexador.
|
|
513
|
+
* @param hashArquivo Obrigatório por interface mas não usado aqui.
|
|
514
|
+
*/
|
|
515
|
+
analisar(retornoLexador, hashArquivo) {
|
|
516
|
+
this.erros = [];
|
|
517
|
+
this.atual = 0;
|
|
518
|
+
this.blocos = 0;
|
|
519
|
+
this.hashArquivo = hashArquivo || 0;
|
|
520
|
+
this.simbolos = (retornoLexador === null || retornoLexador === void 0 ? void 0 : retornoLexador.simbolos) || [];
|
|
521
|
+
let declaracoes = [];
|
|
522
|
+
this.validarSegmentoAlgoritmo();
|
|
523
|
+
declaracoes = declaracoes.concat(this.validarSegmentoVar());
|
|
524
|
+
this.validarSegmentoInicio('algoritmo');
|
|
525
|
+
while (!this.estaNoFinal() && this.simbolos[this.atual].tipo !== visualg_1.default.FIM_ALGORITMO) {
|
|
526
|
+
declaracoes.push(this.declaracao());
|
|
527
|
+
}
|
|
528
|
+
return {
|
|
529
|
+
declaracoes: declaracoes.filter((d) => d),
|
|
530
|
+
erros: this.erros,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
exports.AvaliadorSintaticoVisuAlg = AvaliadorSintaticoVisuAlg;
|
|
535
535
|
//# sourceMappingURL=avaliador-sintatico-visualg.js.map
|