Repository: DesignLiquido/delegua
Pull request #326 (2023-04-22 20:28:58)

Variável Constante

github-actions[bot]: <!-- jest coverage report action for options with hash 781087021f8e6c43aac1e668f4520603 -->

## Coverage report 



| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | Category   | Percentage                                                     | Covered / Total |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------- | :------------------------------------------------------------- | :-------------: |
|                                                                           🟡                                                                           | Statements | <div title="Base coverage is: 73.35%">73.3% (-0.05% 🔻)</div>  |    5327/7267    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 61.83%">61.76% (-0.08% 🔻)</div> |    1660/2688    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 74.88%">74.5% (-0.38% 🔻)</div>  |     789/1059    |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 73.79%">73.73% (-0.05% 🔻)</div> |    5182/7028    |

<details><summary>Show new covered files 🐣</summary>
<br/>

| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | File                                                            | Statements | Branches | Functions | Lines |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------- | :--------- | :------- | :-------- | :---- |
|                                                                           🔴                                                                           | <div title="construtos/constante.ts">`...` / constante.ts</div> | 20%        | 100%     | 0%        | 20%   |
|                                                                           🟢                                                                           | <div title="declaracoes/const.ts">`...` / const.ts</div>        | 100%       | 100%     | 100%      | 100%  |

</details>


<details><summary>Show files with reduced coverage 🔻</summary>
<br/>

| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | File                                                                                                                                    | Statements                                                     | Branches                                                       | Functions                                                      | Lines                                                          |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- | :------------------------------------------------------------- |
|                                                                           🟢                                                                           | <div title="avaliador-sintatico/avaliador-sintatico.ts">`...` / avaliador-sintatico.ts</div>                                            | <div title="Base coverage is: 93.48%">93.19% (-0.3% 🔻)</div>  | <div title="Base coverage is: 83.72%">82.71% (-1.01% 🔻)</div> | <div title="Base coverage is: 94%">94.12% (+0.12% 🔼)</div>    | <div title="Base coverage is: 93.59%">93.27% (-0.32% 🔻)</div> |
|                                                                           🟡                                                                           | <div title="interpretador/interpretador-base.ts">`...` / interpretador-base.ts</div>                                                    | <div title="Base coverage is: 74.95%">75% (+0.05% 🔼)</div>    | <div title="Base coverage is: 66.33%">66.11% (-0.22% 🔻)</div> | <div title="Base coverage is: 88.14%">88.33% (+0.2% 🔼)</div>  | <div title="Base coverage is: 74.42%">74.48% (+0.06% 🔼)</div> |
|                                                                           🔴                                                                           | <div title="interpretador/pilha-escopos-execucao.ts">`...` / pilha-escopos-execucao.ts</div>                                            | <div title="Base coverage is: 52.5%">54.44% (+1.94% 🔼)</div>  | <div title="Base coverage is: 53.85%">51.52% (-2.33% 🔻)</div> | <div title="Base coverage is: 52.63%">55% (+2.37% 🔼)</div>    | <div title="Base coverage is: 54.17%">56.1% (+1.93% 🔼)</div>  |
|                                                                           🔴                                                                           | <div title="interpretador/dialetos/egua-classico/interpretador-egua-classico.ts">`...` / interpretador-egua-classico.ts</div>           | <div title="Base coverage is: 56.35%">56.2% (-0.15% 🔻)</div>  | 46.48%                                                         | <div title="Base coverage is: 64.71%">63.46% (-1.24% 🔻)</div> | <div title="Base coverage is: 57.34%">57.18% (-0.16% 🔻)</div> |
|                                                                           🟡                                                                           | <div title="interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts">`...` / resolvedor.ts</div>                                  | <div title="Base coverage is: 66.07%">65.78% (-0.29% 🔻)</div> | 64.1%                                                          | <div title="Base coverage is: 50%">49.12% (-0.88% 🔻)</div>    | <div title="Base coverage is: 65.7%">65.38% (-0.32% 🔻)</div>  |
|                                                                           🔴                                                                           | <div title="interpretador/dialetos/mapler/interpretador-mapler.ts">`...` / interpretador-mapler.ts</div>                                | <div title="Base coverage is: 46.15%">45% (-1.15% 🔻)</div>    | 58.33%                                                         | <div title="Base coverage is: 36.36%">33.33% (-3.03% 🔻)</div> | <div title="Base coverage is: 47.37%">46.15% (-1.21% 🔻)</div> |
|                                                                           🟡                                                                           | <div title="interpretador/dialetos/visualg/interpretador-visualg.ts">`...` / interpretador-visualg.ts</div>                             | <div title="Base coverage is: 81.4%">79.55% (-1.85% 🔻)</div>  | 58.33%                                                         | <div title="Base coverage is: 90.91%">83.33% (-7.58% 🔻)</div> | <div title="Base coverage is: 80.95%">79.07% (-1.88% 🔻)</div> |
|                                                                           🔴                                                                           | <div title="interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts">`...` / interpretador-visualg-com-depuracao.ts</div> | <div title="Base coverage is: 8.11%">8% (-0.11% 🔻)</div>      | 0%                                                             | 0%                                                             | <div title="Base coverage is: 8.11%">8% (-0.11% 🔻)</div>      |

</details>

## Test suite run success
383 tests passing in 35 suites.

<p align="right">Report generated by <a href="https://github.com/ArtiomTr/jest-coverage-report-action">🧪jest coverage report action</a> from 7d6e9211074eb3474e70344aa36decb63b494919</p>
<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 68b0873b..c8938edc 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -590,26 +590,6 @@
                 "ts-node/register/transpile-only"
             ]
         },
-        {
-            "type": "node",
-            "request": "launch",
-            "name": "Delégua > REPL",
-            "skipFiles": [
-                "<node_internals>/**",
-                "node_modules/**"
-            ],
-            "cwd": "${workspaceRoot}",
-            "console": "integratedTerminal",
-            "args": [
-                "${workspaceFolder}${pathSeparator}execucao.ts"
-            ],
-            "runtimeExecutable": "node",
-            "runtimeArgs": [
-                "--nolazy",
-                "-r",
-                "ts-node/register/transpile-only"
-            ]
-        },
         {
             "type": "node",
             "request": "launch",
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index 051fd3f0..8f6f57e6 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -43,6 +43,7 @@ import {
     Tente,
     Var,
     Leia,
+    Const,
 } from '../declaracoes';
 import { RetornoAvaliadorSintatico } from '../interfaces/retornos/retorno-avaliador-sintatico';
 import { RetornoLexador } from '../interfaces/retornos/retorno-lexador';
@@ -601,7 +602,10 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
                 inicializador = null;
             } else if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VARIAVEL)) {
                 inicializador = this.declaracaoDeVariavel();
-            } else {
+            } else if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CONSTANTE)) {
+                inicializador = this.declaracaoDeConstante();
+            }
+            else {
                 inicializador = this.declaracaoExpressao();
             }
 
@@ -893,6 +897,21 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
         return new Var(simbolo, inicializador);
     }
 
+        /**
+     * Caso símbolo atual seja `const, constante ou fixo`, devolve uma declaração de const.
+     * @returns Um Construto do tipo Const.
+     */
+    declaracaoDeConstante(): Const {
+        const simbolo: SimboloInterface = this.consumir(tiposDeSimbolos.IDENTIFICADOR, 'Esperado nome de constante.');
+        let inicializador = null;
+        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.IGUAL)) {
+            inicializador = this.expressao();
+        }
+
+        this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.PONTO_E_VIRGULA);
+        return new Const(simbolo, inicializador);
+    }
+
     funcao(tipo: string): FuncaoDeclaracao {
         let simbolo: SimboloInterface;
         switch (this.simbolos[this.atual].tipo) {
@@ -988,6 +1007,7 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
                 return this.funcao('funcao');
             }
             if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VARIAVEL)) return this.declaracaoDeVariavel();
+            if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CONSTANTE)) return this.declaracaoDeConstante();
             if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.CLASSE)) return this.declaracaoDeClasse();
 
             return this.resolverDeclaracao();
diff --git a/fontes/construtos/constante.ts b/fontes/construtos/constante.ts
new file mode 100644
index 00000000..0681dee2
--- /dev/null
+++ b/fontes/construtos/constante.ts
@@ -0,0 +1,21 @@
+import { InterpretadorInterface, SimboloInterface, VariavelInterface } from '../interfaces';
+import { Construto } from './construto';
+
+export class Constante implements Construto {
+    linha: number;
+    hashArquivo: number;
+
+    simbolo: SimboloInterface;
+
+    constructor(hashArquivo: number, simbolo: SimboloInterface) {
+        this.linha = Number(simbolo.linha);
+        this.hashArquivo = hashArquivo;
+
+        this.simbolo = simbolo;
+    }
+
+    async aceitar(visitante: InterpretadorInterface): Promise<VariavelInterface> {
+        return Promise.resolve(visitante.visitarExpressaoDeVariavel(this));
+    }
+}
+
diff --git a/fontes/construtos/index.ts b/fontes/construtos/index.ts
index 28f2c423..f23cb80d 100644
--- a/fontes/construtos/index.ts
+++ b/fontes/construtos/index.ts
@@ -2,6 +2,7 @@ export * from './atribuicao-sobrescrita';
 export * from './atribuir';
 export * from './binario';
 export * from './chamada';
+export * from './constante';
 export * from './definir-valor';
 export * from './dicionario';
 export * from './construto';
diff --git a/fontes/declaracoes/const.ts b/fontes/declaracoes/const.ts
new file mode 100644
index 00000000..a9ff0429
--- /dev/null
+++ b/fontes/declaracoes/const.ts
@@ -0,0 +1,27 @@
+import { Construto } from '../construtos';
+import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { Declaracao } from './declaracao';
+
+/**
+ * Uma declaração de constante.
+ */
+export class Const extends Declaracao {
+    simbolo: SimboloInterface;
+    inicializador: Construto;
+    tipo: 'texto' | 'numero' | 'longo' | 'lógico' | 'nulo' | 'vetor' | 'módulo' | 'dicionário' | 'função' | 'símbolo' | undefined
+
+    constructor(
+        simbolo: SimboloInterface,
+        inicializador: Construto,
+        tipo: 'texto' | 'numero' | 'longo' | 'lógico' | 'nulo' | 'vetor' | 'módulo' | 'dicionário' | 'função' | 'símbolo' | undefined = undefined
+    ) {
+        super(Number(simbolo.linha), simbolo.hashArquivo);
+        this.simbolo = simbolo;
+        this.inicializador = inicializador;
+        this.tipo = tipo;
+    }
+
+    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+        return await visitante.visitarDeclaracaoConst(this);
+    }
+}
diff --git a/fontes/declaracoes/index.ts b/fontes/declaracoes/index.ts
index 13135e20..54401add 100644
--- a/fontes/declaracoes/index.ts
+++ b/fontes/declaracoes/index.ts
@@ -1,5 +1,6 @@
 export * from './bloco';
 export * from './classe';
+export * from './const';
 export * from './continua';
 export * from './declaracao';
 export * from './enquanto';
diff --git a/fontes/estruturas/delegua-funcao.ts b/fontes/estruturas/delegua-funcao.ts
index cb33af00..27379d6a 100644
--- a/fontes/estruturas/delegua-funcao.ts
+++ b/fontes/estruturas/delegua-funcao.ts
@@ -59,6 +59,7 @@ export class DeleguaFuncao extends Chamavel {
             ambiente.valores['isto'] = {
                 valor: this.instancia,
                 tipo: 'objeto',
+                imutavel: false
             };
         }
 
diff --git a/fontes/interfaces/interpretador-interface.ts b/fontes/interfaces/interpretador-interface.ts
index 6372cc87..880c54f6 100644
--- a/fontes/interfaces/interpretador-interface.ts
+++ b/fontes/interfaces/interpretador-interface.ts
@@ -3,6 +3,7 @@ import { Atribuir, Construto, FimPara, Literal, Super } from '../construtos';
 import {
     Bloco,
     Classe,
+    Const,
     Continua,
     Declaracao,
     Enquanto,
@@ -58,6 +59,7 @@ export interface InterpretadorInterface {
     executarBloco(declaracoes: Declaracao[], ambiente?: EspacoVariaveis): Promise<any>;
     visitarExpressaoBloco(declaracao: Bloco): Promise<any>;
     visitarDeclaracaoVar(declaracao: Var): Promise<any>;
+    visitarDeclaracaoConst(declaracao: Const): Promise<any>;
     visitarExpressaoContinua(declaracao?: Continua): ContinuarQuebra;
     visitarExpressaoSustar(declaracao?: Sustar): SustarQuebra;
     visitarExpressaoRetornar(declaracao: Retorna): Promise<RetornoQuebra>;
diff --git a/fontes/interfaces/pilha-escopos-execucao-interface.ts b/fontes/interfaces/pilha-escopos-execucao-interface.ts
index 2984cedd..f0788f59 100644
--- a/fontes/interfaces/pilha-escopos-execucao-interface.ts
+++ b/fontes/interfaces/pilha-escopos-execucao-interface.ts
@@ -7,6 +7,7 @@ import { VariavelInterface } from './variavel-interface';
 export interface PilhaEscoposExecucaoInterface extends PilhaInterface<EscopoExecucao> {
     atribuirVariavel(simbolo: SimboloInterface, valor: any): void;
     atribuirVariavelEm(distancia: number, simbolo: SimboloInterface, valor: any): void;
+    definirConstante(nomeConstante: string, valor: any, subtipo?: string): void;
     definirVariavel(nomeVariavel: string, valor: any, subtipo?: string): void;
     elementos(): number;
     naPosicao(posicao: number): EscopoExecucao;
diff --git a/fontes/interfaces/variavel-interface.ts b/fontes/interfaces/variavel-interface.ts
index 3d30c69d..c76b2d6b 100644
--- a/fontes/interfaces/variavel-interface.ts
+++ b/fontes/interfaces/variavel-interface.ts
@@ -12,5 +12,6 @@ export interface VariavelInterface {
         | 'símbolo'
         | 'objeto'
         | 'módulo';
-    subtipo?: 'texto' | 'número' | 'longo' | 'lógico'
+    subtipo?: 'texto' | 'número' | 'longo' | 'lógico';
+    imutavel: boolean;
 }
diff --git a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
index a8129443..b62a098c 100644
--- a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
+++ b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
@@ -11,6 +11,7 @@ import { ErroEmTempoDeExecucao } from '../../../excecoes';
 import { InterpretadorInterface, SimboloInterface, ResolvedorInterface, VariavelInterface } from '../../../interfaces';
 import {
     Classe,
+    Const,
     Declaracao,
     Enquanto,
     Escolha,
@@ -85,6 +86,10 @@ export class InterpretadorEguaClassico implements InterpretadorInterface {
         carregarBibliotecaGlobal(this, this.pilhaEscoposExecucao);
     }
     
+    visitarDeclaracaoConst(declaracao: Const): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+    
     visitarExpressaoFimPara(declaracao: FimPara) {
         throw new Error('Método não implementado.');
     }
diff --git a/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts b/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
index 33edb55d..1b919892 100644
--- a/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
+++ b/fontes/interpretador/dialetos/egua-classico/resolvedor/resolvedor.ts
@@ -2,7 +2,7 @@ import { ResolvedorInterface } from '../../../../interfaces/resolvedor-interface
 import { PilhaEscopos } from './pilha-escopos';
 import { ErroResolvedor } from './erro-resolvedor';
 import { InterpretadorInterface, SimboloInterface } from '../../../../interfaces';
-import { Bloco, Declaracao, EscrevaMesmaLinha, Expressao, Leia, Se } from '../../../../declaracoes';
+import { Bloco, Const, Declaracao, EscrevaMesmaLinha, Expressao, Leia, Se } from '../../../../declaracoes';
 import { AcessoMetodo, Construto, FimPara, FormatacaoEscrita, Super, Variavel } from '../../../../construtos';
 import { RetornoResolvedor } from './retorno-resolvedor';
 import { EspacoVariaveis } from '../../../../espaco-variaveis';
@@ -62,6 +62,9 @@ export class ResolvedorEguaClassico implements ResolvedorInterface, Interpretado
         this.classeAtual = TipoClasse.NENHUM;
         this.cicloAtual = TipoClasse.NENHUM;
     }
+    visitarDeclaracaoConst(declaracao: Const): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
     
     visitarExpressaoFimPara(declaracao: FimPara) {
         throw new Error('Método não implementado.');
diff --git a/fontes/interpretador/dialetos/mapler/interpretador-mapler.ts b/fontes/interpretador/dialetos/mapler/interpretador-mapler.ts
index 7d5e8720..e25524e2 100644
--- a/fontes/interpretador/dialetos/mapler/interpretador-mapler.ts
+++ b/fontes/interpretador/dialetos/mapler/interpretador-mapler.ts
@@ -1,5 +1,5 @@
 import { Binario, Construto, Logico, Variavel } from '../../../construtos';
-import { Escreva, EscrevaMesmaLinha, Fazer, Leia } from '../../../declaracoes';
+import { Const, Escreva, EscrevaMesmaLinha, Fazer, Leia } from '../../../declaracoes';
 import { InterpretadorBase } from '../..';
 import { ContinuarQuebra, Quebra } from '../../../quebras';
 
@@ -18,6 +18,10 @@ export class InterpretadorMapler extends InterpretadorBase {
         this.mensagemPrompt = '> ';
     }
 
+    visitarDeclaracaoConst(declaracao: Const): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     private async avaliarArgumentosEscrevaMapler(argumentos: Construto[]): Promise<string> {
         let formatoTexto: string = '';
 
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
index ee478b9c..a17640b5 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg-com-depuracao.ts
@@ -3,7 +3,7 @@ import {
     registrarBibliotecaCaracteresVisuAlg,
 } from '../../../bibliotecas/dialetos/visualg';
 import { AcessoIndiceVariavel, Binario, Construto, FimPara, Logico, Variavel } from '../../../construtos';
-import { EscrevaMesmaLinha, Escreva, Fazer, Leia } from '../../../declaracoes';
+import { EscrevaMesmaLinha, Escreva, Fazer, Leia, Const } from '../../../declaracoes';
 import { ContinuarQuebra, Quebra, SustarQuebra } from '../../../quebras';
 import { InterpretadorComDepuracao } from '../../interpretador-com-depuracao';
 
@@ -23,6 +23,10 @@ export class InterpretadorVisuAlgComDepuracao extends InterpretadorComDepuracao
         registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
     }
 
+    visitarDeclaracaoConst(declaracao: Const): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     private async avaliarArgumentosEscrevaVisuAlg(argumentos: Construto[]): Promise<string> {
         let formatoTexto: string = '';
 
diff --git a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
index 073a423a..d8ba6674 100644
--- a/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
+++ b/fontes/interpretador/dialetos/visualg/interpretador-visualg.ts
@@ -1,5 +1,5 @@
 import { Binario, Construto, Logico, Variavel } from '../../../construtos';
-import { Escreva, EscrevaMesmaLinha, Fazer, Leia } from '../../../declaracoes';
+import { Const, Escreva, EscrevaMesmaLinha, Fazer, Leia } from '../../../declaracoes';
 import { InterpretadorBase } from '../..';
 import { ContinuarQuebra, Quebra } from '../../../quebras';
 import { registrarBibliotecaNumericaVisuAlg } from '../../../bibliotecas/dialetos/visualg/numerica';
@@ -29,6 +29,10 @@ export class InterpretadorVisuAlg extends InterpretadorBase {
         registrarBibliotecaCaracteresVisuAlg(this, this.pilhaEscoposExecucao);
     }
 
+    visitarDeclaracaoConst(declaracao: Const): Promise<any> {
+        throw new Error('Método não implementado.');
+    }
+
     private async avaliarArgumentosEscrevaVisuAlg(argumentos: Construto[]): Promise<string> {
         let formatoTexto: string = '';
 
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index 639f0eff..ce21f618 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -8,6 +8,7 @@ import { InterpretadorInterface, ParametroInterface, SimboloInterface, VariavelI
 import {
     Bloco,
     Classe,
+    Const,
     Continua,
     Declaracao,
     Enquanto,
@@ -866,6 +867,24 @@ export class InterpretadorBase implements InterpretadorInterface {
         return null;
     }
 
+        /**
+     * Executa expressão de definição de constante.
+     * @param declaracao A declaração Const
+     * @returns Sempre retorna nulo.
+     */
+    async visitarDeclaracaoConst(declaracao: Const): Promise<any> {
+        const valorFinal = await this.avaliacaoDeclaracaoVar(declaracao);
+        
+        let subtipo;
+        if (declaracao.tipo !== undefined) {
+            subtipo = declaracao.tipo;
+        }
+
+        this.pilhaEscoposExecucao.definirConstante(declaracao.simbolo.lexema, valorFinal, subtipo);
+
+        return null;
+    }
+
     visitarExpressaoContinua(declaracao?: Continua): ContinuarQuebra {
         return new ContinuarQuebra();
     }
diff --git a/fontes/interpretador/pilha-escopos-execucao.ts b/fontes/interpretador/pilha-escopos-execucao.ts
index 42dbe404..35276938 100644
--- a/fontes/interpretador/pilha-escopos-execucao.ts
+++ b/fontes/interpretador/pilha-escopos-execucao.ts
@@ -52,16 +52,37 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface {
         }
     }
 
+    definirConstante(nomeConstante: string, valor: any, subtipo?: string): void {
+        const constante = this.pilha[this.pilha.length - 1].ambiente.valores[nomeConstante];
+        const tipo = constante && constante.hasOwnProperty('tipo') ? 
+            constante.tipo : 
+            inferirTipoVariavel(valor);
+
+        let elementoAlvo: VariavelInterface = {
+            valor,
+            tipo: tipo,
+            subtipo: undefined,
+            imutavel: true
+        };
+
+        if (subtipo !== undefined) {
+            (elementoAlvo.subtipo as any) = subtipo;
+        }
+
+        this.pilha[this.pilha.length - 1].ambiente.valores[nomeConstante] = elementoAlvo;
+    }
+
     definirVariavel(nomeVariavel: string, valor: any, subtipo?: string) {
         const variavel = this.pilha[this.pilha.length - 1].ambiente.valores[nomeVariavel];
         const tipo = variavel && variavel.hasOwnProperty('tipo') ? 
             variavel.tipo : 
             inferirTipoVariavel(valor);
 
-        let elementoAlvo = {
+        let elementoAlvo: VariavelInterface = {
             valor,
             tipo: tipo,
-            subtipo: undefined
+            subtipo: undefined,
+            imutavel: false
         };
 
         if (subtipo !== undefined) {
@@ -73,9 +94,13 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface {
 
     atribuirVariavelEm(distancia: number, simbolo: any, valor: any): void {
         const ambienteAncestral = this.pilha[this.pilha.length - distancia].ambiente;
+        if(ambienteAncestral.valores[simbolo.lexema].imutavel) {
+            throw new ErroEmTempoDeExecucao(simbolo, `Constante ${simbolo.lexema} não pode receber novos valores.`);
+        }
         ambienteAncestral.valores[simbolo.lexema] = {
             valor,
             tipo: inferirTipoVariavel(valor),
+            imutavel: false
         };
     }
 
@@ -84,6 +109,9 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface {
             const ambiente = this.pilha[this.pilha.length - i].ambiente;
             if (ambiente.valores[simbolo.lexema] !== undefined) {
                 const variavel = ambiente.valores[simbolo.lexema];
+                if(variavel.imutavel){
+                    throw new ErroEmTempoDeExecucao(simbolo, `Constante ${simbolo.lexema} não pode receber novos valores.`);
+                }
                 const tipo = variavel && variavel.hasOwnProperty('tipo') ? 
                     variavel.tipo : 
                     inferirTipoVariavel(valor);
@@ -91,7 +119,8 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface {
                 const valorResolvido = this.converterValor(tipo, valor);
                 ambiente.valores[simbolo.lexema] = {
                     valor: valorResolvido,
-                    tipo
+                    tipo,
+                    imutavel: false
                 };
                 return;
             }
@@ -152,6 +181,7 @@ export class PilhaEscoposExecucao implements PilhaEscoposExecucaoInterface {
                 nome: chaveEValor[0],
                 valor: chaveEValor[1].valor,
                 tipo: chaveEValor[1].tipo,
+                imutavel: chaveEValor[1].imutavel
             }));
             todasVariaveis = todasVariaveis.concat(vetorObjeto);
         }
diff --git a/fontes/lexador/palavras-reservadas.ts b/fontes/lexador/palavras-reservadas.ts
index 440bb76d..64c90152 100644
--- a/fontes/lexador/palavras-reservadas.ts
+++ b/fontes/lexador/palavras-reservadas.ts
@@ -5,6 +5,8 @@ export default {
     classe: tiposDeSimbolos.CLASSE,
     construtor: tiposDeSimbolos.CONSTRUTOR,
     continua: tiposDeSimbolos.CONTINUA,
+    constante: tiposDeSimbolos.CONSTANTE,
+    const: tiposDeSimbolos.CONSTANTE,
     e: tiposDeSimbolos.E,
     em: tiposDeSimbolos.EM,
     enquanto: tiposDeSimbolos.ENQUANTO,
@@ -13,6 +15,7 @@ export default {
     falso: tiposDeSimbolos.FALSO,
     fazer: tiposDeSimbolos.FAZER,
     finalmente: tiposDeSimbolos.FINALMENTE,
+    fixo: tiposDeSimbolos.CONSTANTE,
     funcao: tiposDeSimbolos.FUNCAO,
     função: tiposDeSimbolos.FUNÇÃO,
     herda: tiposDeSimbolos.HERDA,
@@ -33,5 +36,6 @@ export default {
     sustar: tiposDeSimbolos.SUSTAR,
     tente: tiposDeSimbolos.TENTE,
     var: tiposDeSimbolos.VARIAVEL,
+    variavel: tiposDeSimbolos.VARIAVEL,
     verdadeiro: tiposDeSimbolos.VERDADEIRO,
 };
diff --git a/fontes/tipos-de-simbolos/delegua.ts b/fontes/tipos-de-simbolos/delegua.ts
index 4ef89b91..a049a35e 100644
--- a/fontes/tipos-de-simbolos/delegua.ts
+++ b/fontes/tipos-de-simbolos/delegua.ts
@@ -10,8 +10,9 @@ export default {
     CLASSE: 'CLASSE',
     COLCHETE_DIREITO: 'COLCHETE_DIREITO',
     COLCHETE_ESQUERDO: 'COLCHETE_ESQUERDO',
-    CONTINUA: 'CONTINUA',
+    CONSTANTE: 'CONSTANTE',
     CONSTRUTOR: 'CONSTRUTOR',
+    CONTINUA: 'CONTINUA',
     DECREMENTAR: 'DECREMENTAR',
     DIFERENTE: 'DIFERENTE',
     DIVISAO: 'DIVISAO',


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 471b8c8b..04ee05f7 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -16,7 +16,7 @@ describe('Interpretador', () => {
 
         describe('Cenários de sucesso', () => {
             describe('Atribuições', () => {
-                it('Trivial', async () => {
+                it('Trivial var', async () => {
                     const retornoLexador = lexador.mapear(["var a = 1"], -1);
                     const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
@@ -25,6 +25,19 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
+                it('Trivial const/constante/fixo', async () => {
+                    const retornoLexador = lexador.mapear([
+                        "const a = 1",
+                        "constante b = \"b\"",
+                        "fixo c = 3"
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros).toHaveLength(0);
+                });
+
                 it('Vetor', async () => {
                     const retornoLexador = lexador.mapear(["var a = [1, 2, 3]"], -1);
                     const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
@@ -653,6 +666,48 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros.length).toBeGreaterThan(0);
                 });
 
+                it('const', async () => {
+                    const retornoLexador = lexador.mapear([
+                        "const a = 1",
+                        "a = 2",
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros[0].mensagem).toBe(
+                        'Constante a não pode receber novos valores.'
+                    );
+                });
+
+                it('constante', async () => {
+                    const retornoLexador = lexador.mapear([
+                        "constante b = \"b\"",
+                        "b = 3",
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros[0].mensagem).toBe(
+                        'Constante b não pode receber novos valores.'
+                    );
+                });
+
+                it('fixo', async () => {
+                    const retornoLexador = lexador.mapear([
+                        "fixo c = 3",
+                        "c = 1"
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros[0].mensagem).toBe(
+                        'Constante c não pode receber novos valores.'
+                    );
+                });
+
                 it('Acesso a elementos de dicionário', async () => {
                     const retornoLexador = lexador.mapear([
                         "var a = {'a': 1, 'b': 2};",
diff --git a/testes/visualg/biblioteca-global.test.ts b/testes/visualg/biblioteca-global.test.ts
index 475fee32..d03f3156 100644
--- a/testes/visualg/biblioteca-global.test.ts
+++ b/testes/visualg/biblioteca-global.test.ts
@@ -21,6 +21,10 @@ const mockPilha: PilhaEscoposExecucaoInterface = {
         funcoes[nomeVariavel] = valor;
     },
 
+    definirConstante: function (nomeConstante: string, valor: any, subtipo?: string | undefined): void {
+        funcoes[nomeConstante] = valor;
+    },
+
     elementos: function (): number {
         throw new Error('Função não implementada.');
     },
@@ -73,7 +77,7 @@ const mockPilha: PilhaEscoposExecucaoInterface = {
 
     removerUltimo: function (): EscopoExecucao {
         throw new Error('Função não implementada.');
-    }
+    },
 };
 
 describe('Biblioteca Numérica', () => {