Repository: DesignLiquido/delegua
Pull request #357 (2023-05-08 06:14:54)

Analisador semântico 1
Esboço do analisador semântico. 
Várias alterações estruturais para acomodar a nova funcionalidade.

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.84%">73.48% (-0.36% 🔻)</div> |    5727/7794    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 62.49%">62.43% (-0.06% 🔻)</div> |    1823/2920    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 73.77%">71.44% (-2.33% 🔻)</div> |     848/1187    |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 74.31%">73.95% (-0.36% 🔻)</div> |    5578/7543    |

<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="analisador-semantico/index.ts">`...` / index.ts</div>                               | 100%       | 100%     | 100%      | 100%  |
|                                                                           🔴                                                                           | <div title="analisador-semantico/analisador-semantico.ts">`...` / analisador-semantico.ts</div> | 35%        | 50%      | 14.29%    | 35%   |
|                                                                           🔴                                                                           | <div title="analisador-semantico/pilha-variaveis.ts">`...` / pilha-variaveis.ts</div>           | 20%        | 0%       | 20%       | 25%   |

</details>


## Test suite run success
419 tests passing in 36 suites.

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

Patch:
diff --git a/.vscode/launch.json b/.vscode/launch.json
index a4ba5a3c..9c381b1c 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -637,7 +637,7 @@
             "runtimeArgs": [
                 "--inspect-brk",
                 "${workspaceRoot}/node_modules/jest/bin/jest.js",
-                "interpretador",
+                "analisador-semantico",
                 "--runInBand"
             ],
             "skipFiles": ["<node_internals>/**", "node_modules/**"],
diff --git a/fontes/analisador-semantico/README.md b/fontes/analisador-semantico/README.md
new file mode 100644
index 00000000..525146a4
--- /dev/null
+++ b/fontes/analisador-semantico/README.md
@@ -0,0 +1,3 @@
+# Analisador Semântico
+
+Analisadores Semânticos não exatamente executam código. A ideia é visitar as declarações geradas pelo Avaliador Sintático elemento a elemento, anotndo sequencialmente algumas informações, e conferindo outras. Se em algum momento algo não faz sentido, o Analisador Semântico anota uma observação no retorno.
\ No newline at end of file
diff --git a/fontes/analisador-semantico/analisador-semantico.ts b/fontes/analisador-semantico/analisador-semantico.ts
new file mode 100644
index 00000000..59d87c90
--- /dev/null
+++ b/fontes/analisador-semantico/analisador-semantico.ts
@@ -0,0 +1,220 @@
+import { Literal, Construto, Atribuir, FimPara, FormatacaoEscrita, Super } from "../construtos";
+import { Declaracao, Expressao, Leia, Para, ParaCada, Se, Fazer, Escolha, Tente, Enquanto, Importar, Escreva, EscrevaMesmaLinha, Bloco, Var, Const, Continua, Sustar, Retorna, FuncaoDeclaracao, Classe } from "../declaracoes";
+import { VariavelInterface } from "../interfaces";
+import { AnalisadorSemanticoInterface } from "../interfaces/analisador-semantico-interface";
+import { ErroAnalisadorSemantico } from "../interfaces/erros";
+import { RetornoAnalisadorSemantico } from "../interfaces/retornos/retorno-analisador-semantico";
+import { ContinuarQuebra, SustarQuebra, RetornoQuebra } from "../quebras";
+import { PilhaVariaveis } from "./pilha-variaveis";
+
+interface VariavelHipoteticaInterface {
+    tipo:
+        | 'texto'
+        | 'número'
+        | 'longo'
+        | 'vetor'
+        | 'dicionário'
+        | 'nulo'
+        | 'lógico'
+        | 'função'
+        | 'símbolo'
+        | 'objeto'
+        | 'módulo';
+    subtipo?: 'texto' | 'número' | 'longo' | 'lógico';
+    imutavel: boolean;
+}
+
+export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
+    pilhaVariaveis: PilhaVariaveis;
+    variaveis: { [nomeVariavel: string]: VariavelHipoteticaInterface }
+    atual: number;
+    erros: ErroAnalisadorSemantico[];
+
+    constructor() {
+        this.pilhaVariaveis = new PilhaVariaveis();
+        this.variaveis = {};
+        this.atual = 0;
+        this.erros = [];
+    }
+
+    visitarExpressaoLiteral(expressao: Literal): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+    avaliar(expressao: Construto | Declaracao) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoAgrupamento(expressao: any): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoUnaria(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoBinaria(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoDeChamada(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+
+    visitarDeclaracaoDeAtribuicao(expressao: Atribuir) {
+        if (!this.variaveis.hasOwnProperty(expressao.simbolo.lexema)) {
+            this.erros.push({
+                simbolo: expressao.simbolo,
+                mensagem: `Variável ${expressao.simbolo} ainda não foi declarada até este ponto.`,
+                hashArquivo: expressao.hashArquivo,
+                linha: expressao.linha
+            });
+
+            return Promise.resolve();
+        }
+
+        if (this.variaveis[expressao.simbolo.lexema].imutavel) {
+            this.erros.push({
+                simbolo: expressao.simbolo,
+                mensagem: `Constante ${expressao.simbolo} não pode ser modificada.`,
+                hashArquivo: expressao.hashArquivo,
+                linha: expressao.linha
+            });
+
+            return Promise.resolve();
+        }
+    }
+
+    visitarExpressaoDeVariavel(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+
+    visitarDeclaracaoDeExpressao(declaracao: Expressao) {
+        return declaracao.expressao.aceitar(this);
+    }
+
+    visitarExpressaoLeia(expressao: Leia) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoLogica(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoPara(declaracao: Para): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoParaCada(declaracao: ParaCada): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoSe(declaracao: Se) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoFimPara(declaracao: FimPara) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoFazer(declaracao: Fazer) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoFormatacaoEscrita(declaracao: FormatacaoEscrita) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoEscolha(declaracao: Escolha) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoTente(declaracao: Tente) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoEnquanto(declaracao: Enquanto) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoImportar(declaracao: Importar) {
+        throw new Error("Método não implementado.");
+    }
+
+    visitarDeclaracaoEscreva(declaracao: Escreva) {
+        // throw new Error("Método não implementado.");
+    }
+
+    visitarExpressaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha) {
+        throw new Error("Método não implementado.");
+    }
+    
+    visitarExpressaoBloco(declaracao: Bloco): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoVar(declaracao: Var): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+
+    visitarDeclaracaoConst(declaracao: Const): Promise<any> {
+        if (this.variaveis.hasOwnProperty(declaracao.simbolo.lexema)) {
+            this.erros.push({
+                simbolo: declaracao.simbolo,
+                mensagem: 'Declaração de constante já feita.',
+                hashArquivo: declaracao.hashArquivo,
+                linha: declaracao.linha
+            });
+        } else {
+            this.variaveis[declaracao.simbolo.lexema] = {
+                imutavel: true,
+                tipo: 'número'
+            };
+        }
+
+        return Promise.resolve();
+    }
+
+    visitarExpressaoContinua(declaracao?: Continua): ContinuarQuebra {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoSustar(declaracao?: Sustar): SustarQuebra {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoRetornar(declaracao: Retorna): Promise<RetornoQuebra> {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoDeleguaFuncao(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoAtribuicaoSobrescrita(expressao: any): Promise<any> {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoAcessoIndiceVariavel(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoDefinirValor(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoDefinicaoFuncao(declaracao: FuncaoDeclaracao) {
+        throw new Error("Método não implementado.");
+    }
+    visitarDeclaracaoClasse(declaracao: Classe) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoAcessoMetodo(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoIsto(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoDicionario(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoVetor(expressao: any) {
+        throw new Error("Método não implementado.");
+    }
+    visitarExpressaoSuper(expressao: Super) {
+        throw new Error("Método não implementado.");
+    }
+
+    analisar(declaracoes: Declaracao[]): RetornoAnalisadorSemantico {
+        // this.pilhaVariaveis = new PilhaVariaveis();
+        // this.pilhaVariaveis.empilhar()
+        this.variaveis = {};
+        this.atual = 0;
+        this.erros = [];
+
+        while (this.atual < declaracoes.length) {
+            declaracoes[this.atual].aceitar(this);
+            this.atual++;
+        }
+
+        return {
+            erros: this.erros
+        } as RetornoAnalisadorSemantico;
+    }
+}
\ No newline at end of file
diff --git a/fontes/analisador-semantico/index.ts b/fontes/analisador-semantico/index.ts
new file mode 100644
index 00000000..1834311c
--- /dev/null
+++ b/fontes/analisador-semantico/index.ts
@@ -0,0 +1,1 @@
+export * from './analisador-semantico';
diff --git a/fontes/analisador-semantico/pilha-variaveis.ts b/fontes/analisador-semantico/pilha-variaveis.ts
new file mode 100644
index 00000000..c325f31b
--- /dev/null
+++ b/fontes/analisador-semantico/pilha-variaveis.ts
@@ -0,0 +1,28 @@
+import { VariavelInterface } from "../interfaces";
+import { PilhaInterface } from "../interfaces";
+
+export class PilhaVariaveis implements PilhaInterface<{ [nomeVariavel: string]: VariavelInterface }> {
+    pilha: { [nomeVariavel: string]: VariavelInterface }[];
+
+    constructor() {
+        this.pilha = [];
+    }
+    
+    empilhar(item: { [nomeVariavel: string]: VariavelInterface; }): void {
+        this.pilha.push(item);
+    }
+
+    eVazio(): boolean {
+        return this.pilha.length === 0;
+    }
+
+    topoDaPilha(): { [nomeVariavel: string]: VariavelInterface; } {
+        if (this.eVazio()) throw new Error('Pilha vazia.');
+        return this.pilha[this.pilha.length - 1];
+    }
+
+    removerUltimo(): { [nomeVariavel: string]: VariavelInterface; } {
+        if (this.eVazio()) throw new Error('Pilha vazia.');
+        return this.pilha.pop();
+    }
+}
\ No newline at end of file
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
index a9c4cb30..a91f826e 100644
--- a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-birl.ts
@@ -580,6 +580,7 @@ export class AvaliadorSintaticoBirl extends AvaliadorSintaticoBase {
             paramentros.push(this.logicaComumParamentros());
         }
         this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
+        this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após parâmetros.");
 
         let corpo = [];
 
diff --git a/fontes/bibliotecas/biblioteca-global.ts b/fontes/bibliotecas/biblioteca-global.ts
index 0da507e4..39176710 100644
--- a/fontes/bibliotecas/biblioteca-global.ts
+++ b/fontes/bibliotecas/biblioteca-global.ts
@@ -2,11 +2,11 @@ import { ErroEmTempoDeExecucao } from '../excecoes';
 import { ObjetoDeleguaClasse } from '../estruturas/objeto-delegua-classe';
 import { FuncaoPadrao } from '../estruturas/funcao-padrao';
 import { DeleguaClasse } from '../estruturas/delegua-classe';
-import { InterpretadorInterface, VariavelInterface } from '../interfaces';
+import { VisitanteComumInterface, VariavelInterface } from '../interfaces';
 import { PilhaEscoposExecucaoInterface } from '../interfaces/pilha-escopos-execucao-interface';
 import { DeleguaFuncao } from '../estruturas';
 
-export default function (interpretador: InterpretadorInterface, pilhaEscoposExecucao: PilhaEscoposExecucaoInterface) {
+export default function (interpretador: VisitanteComumInterface, pilhaEscoposExecucao: PilhaEscoposExecucaoInterface) {
     const todosEmCondicao = async function (
         vetor: VariavelInterface | any,
         funcaoCondicional: VariavelInterface | any
diff --git a/fontes/construtos/acesso-indice-variavel.ts b/fontes/construtos/acesso-indice-variavel.ts
index b2b2d30b..88ac71b6 100644
--- a/fontes/construtos/acesso-indice-variavel.ts
+++ b/fontes/construtos/acesso-indice-variavel.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Construto } from './construto';
 
 /**
@@ -22,7 +22,7 @@ export class AcessoIndiceVariavel implements Construto {
         this.simboloFechamento = simboloFechamento;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoAcessoIndiceVariavel(this);
     }
 }
diff --git a/fontes/construtos/acesso-metodo.ts b/fontes/construtos/acesso-metodo.ts
index d1d6f799..3323bec4 100644
--- a/fontes/construtos/acesso-metodo.ts
+++ b/fontes/construtos/acesso-metodo.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Construto } from './construto';
 
 /**
@@ -20,7 +20,7 @@ export class AcessoMetodo implements Construto {
         this.simbolo = simbolo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoAcessoMetodo(this);
     }
 }
diff --git a/fontes/construtos/agrupamento.ts b/fontes/construtos/agrupamento.ts
index 6707355b..bb8d3f2d 100644
--- a/fontes/construtos/agrupamento.ts
+++ b/fontes/construtos/agrupamento.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 /**
@@ -19,7 +19,7 @@ export class Agrupamento implements Construto {
         this.expressao = expressao;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoAgrupamento(this);
     }
 }
diff --git a/fontes/construtos/atribuicao-sobrescrita.ts b/fontes/construtos/atribuicao-sobrescrita.ts
index 86695b04..a689ab3d 100644
--- a/fontes/construtos/atribuicao-sobrescrita.ts
+++ b/fontes/construtos/atribuicao-sobrescrita.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 export class AtribuicaoSobrescrita implements Construto {
@@ -18,7 +18,7 @@ export class AtribuicaoSobrescrita implements Construto {
         this.valor = valor;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoAtribuicaoSobrescrita(this);
     }
 }
diff --git a/fontes/construtos/atribuir.ts b/fontes/construtos/atribuir.ts
index 59a43a81..0f1ca7ad 100644
--- a/fontes/construtos/atribuir.ts
+++ b/fontes/construtos/atribuir.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Construto } from './construto';
 
 export class Atribuir implements Construto {
@@ -16,7 +16,7 @@ export class Atribuir implements Construto {
         this.valor = valor;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoDeAtribuicao(this);
     }
 }
diff --git a/fontes/construtos/binario.ts b/fontes/construtos/binario.ts
index 39ebebec..48306d7d 100644
--- a/fontes/construtos/binario.ts
+++ b/fontes/construtos/binario.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Construto } from './construto';
 
 /**
@@ -29,7 +29,7 @@ export class Binario implements Construto {
         this.direita = direita;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoBinaria(this);
     }
 }
diff --git a/fontes/construtos/chamada.ts b/fontes/construtos/chamada.ts
index 481cf15e..439562e1 100644
--- a/fontes/construtos/chamada.ts
+++ b/fontes/construtos/chamada.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 import { uuidv4 } from '../geracao-identificadores';
 
@@ -24,7 +24,7 @@ export class Chamada implements Construto {
         this.argumentos = argumentos;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoDeChamada(this);
     }
 }
diff --git a/fontes/construtos/constante.ts b/fontes/construtos/constante.ts
index 0681dee2..558dcf57 100644
--- a/fontes/construtos/constante.ts
+++ b/fontes/construtos/constante.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface, VariavelInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface, VariavelInterface } from '../interfaces';
 import { Construto } from './construto';
 
 export class Constante implements Construto {
@@ -14,7 +14,7 @@ export class Constante implements Construto {
         this.simbolo = simbolo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<VariavelInterface> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<VariavelInterface> {
         return Promise.resolve(visitante.visitarExpressaoDeVariavel(this));
     }
 }
diff --git a/fontes/construtos/construto.ts b/fontes/construtos/construto.ts
index 6b8baa3a..8a83be83 100644
--- a/fontes/construtos/construto.ts
+++ b/fontes/construtos/construto.ts
@@ -1,8 +1,8 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 
 export interface Construto {
     linha: number;
     hashArquivo: number;
     valor?: any;
-    aceitar(visitante: InterpretadorInterface): Promise<any>;
+    aceitar(visitante: VisitanteComumInterface): Promise<any>;
 }
diff --git a/fontes/construtos/definir-valor.ts b/fontes/construtos/definir-valor.ts
index d17871b3..f671c622 100644
--- a/fontes/construtos/definir-valor.ts
+++ b/fontes/construtos/definir-valor.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 export class DefinirValor implements Construto {
@@ -18,7 +18,7 @@ export class DefinirValor implements Construto {
         this.valor = valor;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoDefinirValor(this);
     }
 }
diff --git a/fontes/construtos/dicionario.ts b/fontes/construtos/dicionario.ts
index 217519c4..431438e2 100644
--- a/fontes/construtos/dicionario.ts
+++ b/fontes/construtos/dicionario.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 export class Dicionario implements Construto {
@@ -16,7 +16,7 @@ export class Dicionario implements Construto {
         this.valores = valores;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoDicionario(this);
     }
 }
diff --git a/fontes/construtos/fim-para.ts b/fontes/construtos/fim-para.ts
index b937150d..2bf13e5c 100644
--- a/fontes/construtos/fim-para.ts
+++ b/fontes/construtos/fim-para.ts
@@ -1,5 +1,5 @@
 import { Declaracao } from '../declaracoes';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Binario } from './binario';
 import { Construto } from './construto';
 
@@ -27,7 +27,7 @@ export class FimPara implements Construto {
         this.incremento = blocoIncremento;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoFimPara(this);
     }
 }
\ No newline at end of file
diff --git a/fontes/construtos/formatacao-escrita.ts b/fontes/construtos/formatacao-escrita.ts
index 05108626..d117c45a 100644
--- a/fontes/construtos/formatacao-escrita.ts
+++ b/fontes/construtos/formatacao-escrita.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 /**
@@ -21,7 +21,7 @@ export class FormatacaoEscrita implements Construto {
         this.casasDecimais = casasDecimais || -1;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoFormatacaoEscrita(this);
     }
 }
diff --git a/fontes/construtos/funcao.ts b/fontes/construtos/funcao.ts
index efb0cd42..6b6564e2 100644
--- a/fontes/construtos/funcao.ts
+++ b/fontes/construtos/funcao.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, ParametroInterface } from '../interfaces';
+import { VisitanteComumInterface, ParametroInterface } from '../interfaces';
 import { Construto } from './construto';
 
 export class FuncaoConstruto implements Construto {
@@ -16,7 +16,7 @@ export class FuncaoConstruto implements Construto {
         this.corpo = corpo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.resolve(visitante.visitarExpressaoDeleguaFuncao(this));
     }
 }
diff --git a/fontes/construtos/isto.ts b/fontes/construtos/isto.ts
index 657ff981..ff3b2e8e 100644
--- a/fontes/construtos/isto.ts
+++ b/fontes/construtos/isto.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 export class Isto implements Construto {
@@ -14,7 +14,7 @@ export class Isto implements Construto {
         this.palavraChave = palavraChave;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.resolve(visitante.visitarExpressaoIsto(this));
     }
 }
diff --git a/fontes/construtos/literal.ts b/fontes/construtos/literal.ts
index 7bb42503..56974d59 100644
--- a/fontes/construtos/literal.ts
+++ b/fontes/construtos/literal.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 export type ValorLiteral = number | string | number[] | string[] | any;
@@ -16,7 +16,7 @@ export class Literal implements Construto {
         this.valor = valor;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.resolve(visitante.visitarExpressaoLiteral(this));
     }
 }
diff --git a/fontes/construtos/logico.ts b/fontes/construtos/logico.ts
index be8a3eb5..be4a30c8 100644
--- a/fontes/construtos/logico.ts
+++ b/fontes/construtos/logico.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Construto } from './construto';
 
 export class Logico implements Construto {
@@ -18,7 +18,7 @@ export class Logico implements Construto {
         this.direita = direita;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoLogica(this);
     }
 }
diff --git a/fontes/construtos/super.ts b/fontes/construtos/super.ts
index 4e0d131c..68b6691f 100644
--- a/fontes/construtos/super.ts
+++ b/fontes/construtos/super.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Construto } from './construto';
 
 export class Super implements Construto {
@@ -16,7 +16,7 @@ export class Super implements Construto {
         this.metodo = metodo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.resolve(visitante.visitarExpressaoSuper(this));
     }
 }
diff --git a/fontes/construtos/unario.ts b/fontes/construtos/unario.ts
index 45d79fc9..93a65d5b 100644
--- a/fontes/construtos/unario.ts
+++ b/fontes/construtos/unario.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Construto } from './construto';
 
 export class Unario implements Construto {
@@ -23,7 +23,7 @@ export class Unario implements Construto {
         this.incidenciaOperador = incidenciaOperador;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoUnaria(this);
     }
 }
diff --git a/fontes/construtos/variavel.ts b/fontes/construtos/variavel.ts
index e585587f..56840bfc 100644
--- a/fontes/construtos/variavel.ts
+++ b/fontes/construtos/variavel.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface, VariavelInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface, VariavelInterface } from '../interfaces';
 import { Construto } from './construto';
 
 export class Variavel implements Construto {
@@ -14,7 +14,7 @@ export class Variavel implements Construto {
         this.simbolo = simbolo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<VariavelInterface> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<VariavelInterface> {
         return Promise.resolve(visitante.visitarExpressaoDeVariavel(this));
     }
 }
diff --git a/fontes/construtos/vetor.ts b/fontes/construtos/vetor.ts
index 0f1ec86d..7a818751 100644
--- a/fontes/construtos/vetor.ts
+++ b/fontes/construtos/vetor.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Construto } from './construto';
 
 export class Vetor implements Construto {
@@ -14,7 +14,7 @@ export class Vetor implements Construto {
         this.valores = valores;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoVetor(this);
     }
 }
diff --git a/fontes/declaracoes/bloco.ts b/fontes/declaracoes/bloco.ts
index 0f00c950..6edd311f 100644
--- a/fontes/declaracoes/bloco.ts
+++ b/fontes/declaracoes/bloco.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class Bloco extends Declaracao {
@@ -9,7 +9,7 @@ export class Bloco extends Declaracao {
         this.declaracoes = declaracoes;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoBloco(this);
     }
 }
diff --git a/fontes/declaracoes/classe.ts b/fontes/declaracoes/classe.ts
index 95ee65f4..ee7acf92 100644
--- a/fontes/declaracoes/classe.ts
+++ b/fontes/declaracoes/classe.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Declaracao } from './declaracao';
 
 export class Classe extends Declaracao {
@@ -13,7 +13,7 @@ export class Classe extends Declaracao {
         this.metodos = metodos;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoClasse(this);
     }
 }
diff --git a/fontes/declaracoes/const.ts b/fontes/declaracoes/const.ts
index 4c52eabc..ff89486a 100644
--- a/fontes/declaracoes/const.ts
+++ b/fontes/declaracoes/const.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { TiposDadosInterface } from '../interfaces/tipos-dados-interface';
 import { Declaracao } from './declaracao';
 
@@ -22,7 +22,7 @@ export class Const extends Declaracao {
         this.tipo = tipo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoConst(this);
     }
 }
diff --git a/fontes/declaracoes/continua.ts b/fontes/declaracoes/continua.ts
index 58ff718a..06cf1302 100644
--- a/fontes/declaracoes/continua.ts
+++ b/fontes/declaracoes/continua.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Declaracao } from './declaracao';
 
 export class Continua extends Declaracao {
@@ -6,7 +6,7 @@ export class Continua extends Declaracao {
         super(Number(simbolo.linha), simbolo.hashArquivo);
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.resolve(visitante.visitarExpressaoContinua(this));
     }
 }
diff --git a/fontes/declaracoes/declaracao.ts b/fontes/declaracoes/declaracao.ts
index a1cb42a2..613ae66c 100644
--- a/fontes/declaracoes/declaracao.ts
+++ b/fontes/declaracoes/declaracao.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 
 export class Declaracao {
     linha: number;
@@ -14,7 +14,7 @@ export class Declaracao {
         this.assinaturaMetodo = '<principal>';
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.reject(new Error('Este método não deveria ser chamado.'));
     }
 }
diff --git a/fontes/declaracoes/enquanto.ts b/fontes/declaracoes/enquanto.ts
index cfc021cc..374f2630 100644
--- a/fontes/declaracoes/enquanto.ts
+++ b/fontes/declaracoes/enquanto.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class Enquanto extends Declaracao {
@@ -12,7 +12,7 @@ export class Enquanto extends Declaracao {
         this.corpo = corpo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoEnquanto(this);
     }
 }
diff --git a/fontes/declaracoes/escolha.ts b/fontes/declaracoes/escolha.ts
index 5920e550..a99dfc68 100644
--- a/fontes/declaracoes/escolha.ts
+++ b/fontes/declaracoes/escolha.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { CaminhoEscolha } from '../interfaces/construtos';
 import { Declaracao } from './declaracao';
 
@@ -18,7 +18,7 @@ export class Escolha extends Declaracao {
         this.caminhoPadrao = caminhoPadrao;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoEscolha(this);
     }
 }
diff --git a/fontes/declaracoes/escreva-mesma-linha.ts b/fontes/declaracoes/escreva-mesma-linha.ts
index e7aa4123..964dbec7 100644
--- a/fontes/declaracoes/escreva-mesma-linha.ts
+++ b/fontes/declaracoes/escreva-mesma-linha.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class EscrevaMesmaLinha extends Declaracao {
@@ -10,7 +10,7 @@ export class EscrevaMesmaLinha extends Declaracao {
         this.argumentos = argumentos;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoEscrevaMesmaLinha(this);
     }
 }
diff --git a/fontes/declaracoes/escreva.ts b/fontes/declaracoes/escreva.ts
index 953b9c77..168c7f00 100644
--- a/fontes/declaracoes/escreva.ts
+++ b/fontes/declaracoes/escreva.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class Escreva extends Declaracao {
@@ -10,7 +10,7 @@ export class Escreva extends Declaracao {
         this.argumentos = argumentos;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoEscreva(this);
     }
 }
diff --git a/fontes/declaracoes/expressao.ts b/fontes/declaracoes/expressao.ts
index 582ae8ab..ce185d4f 100644
--- a/fontes/declaracoes/expressao.ts
+++ b/fontes/declaracoes/expressao.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class Expressao extends Declaracao {
@@ -10,7 +10,7 @@ export class Expressao extends Declaracao {
         this.expressao = expressao;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoDeExpressao(this);
     }
 }
diff --git a/fontes/declaracoes/fazer.ts b/fontes/declaracoes/fazer.ts
index 28c71678..42fdc7a4 100644
--- a/fontes/declaracoes/fazer.ts
+++ b/fontes/declaracoes/fazer.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class Fazer extends Declaracao {
@@ -11,7 +11,7 @@ export class Fazer extends Declaracao {
         this.condicaoEnquanto = condicaoEnquanto;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoFazer(this);
     }
 }
diff --git a/fontes/declaracoes/funcao.ts b/fontes/declaracoes/funcao.ts
index 6cf2bec2..f0391a78 100644
--- a/fontes/declaracoes/funcao.ts
+++ b/fontes/declaracoes/funcao.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Declaracao } from './declaracao';
 import { FuncaoConstruto } from '../construtos';
 
@@ -14,7 +14,7 @@ export class FuncaoDeclaracao extends Declaracao {
         this.tipoRetorno = tipoRetorno;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.resolve(visitante.visitarDeclaracaoDefinicaoFuncao(this));
     }
 }
diff --git a/fontes/declaracoes/importar.ts b/fontes/declaracoes/importar.ts
index 8788378b..64474b51 100644
--- a/fontes/declaracoes/importar.ts
+++ b/fontes/declaracoes/importar.ts
@@ -1,5 +1,5 @@
 import { Literal } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class Importar extends Declaracao {
@@ -12,7 +12,7 @@ export class Importar extends Declaracao {
         this.simboloFechamento = simboloFechamento;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoImportar(this);
     }
 }
diff --git a/fontes/declaracoes/leia.ts b/fontes/declaracoes/leia.ts
index 7149e06b..85f57bb3 100644
--- a/fontes/declaracoes/leia.ts
+++ b/fontes/declaracoes/leia.ts
@@ -1,6 +1,6 @@
 import { Construto } from '../construtos';
 import { uuidv4 } from '../geracao-identificadores';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 /**
@@ -17,7 +17,7 @@ export class Leia extends Declaracao {
         this.argumentos = argumentos;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoLeia(this);
     }
 }
diff --git a/fontes/declaracoes/para-cada.ts b/fontes/declaracoes/para-cada.ts
index e6c09998..e1d99b7f 100644
--- a/fontes/declaracoes/para-cada.ts
+++ b/fontes/declaracoes/para-cada.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from "../interfaces";
+import { VisitanteComumInterface } from '../interfaces';
 import { Bloco } from "./bloco";
 import { Declaracao } from "./declaracao";
 
@@ -22,7 +22,7 @@ export class ParaCada extends Declaracao {
         this.posicaoAtual = 0;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoParaCada(this);
     }
 }
\ No newline at end of file
diff --git a/fontes/declaracoes/para.ts b/fontes/declaracoes/para.ts
index ca43dff5..9502923a 100644
--- a/fontes/declaracoes/para.ts
+++ b/fontes/declaracoes/para.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Bloco } from './bloco';
 import { Declaracao } from './declaracao';
 
@@ -32,7 +32,7 @@ export class Para extends Declaracao {
         this.blocoPosExecucao = undefined;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoPara(this);
     }
 }
diff --git a/fontes/declaracoes/retorna.ts b/fontes/declaracoes/retorna.ts
index 2ec3495e..0be9d133 100644
--- a/fontes/declaracoes/retorna.ts
+++ b/fontes/declaracoes/retorna.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Declaracao } from './declaracao';
 
 export class Retorna extends Declaracao {
@@ -11,7 +11,7 @@ export class Retorna extends Declaracao {
         this.valor = valor;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarExpressaoRetornar(this);
     }
 }
diff --git a/fontes/declaracoes/se.ts b/fontes/declaracoes/se.ts
index b47bf654..b971959b 100644
--- a/fontes/declaracoes/se.ts
+++ b/fontes/declaracoes/se.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 export class Se extends Declaracao {
@@ -21,7 +21,7 @@ export class Se extends Declaracao {
         this.caminhoSenao = caminhoSenao;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoSe(this);
     }
 }
diff --git a/fontes/declaracoes/sustar.ts b/fontes/declaracoes/sustar.ts
index 032b90ff..41e84da0 100644
--- a/fontes/declaracoes/sustar.ts
+++ b/fontes/declaracoes/sustar.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { Declaracao } from './declaracao';
 
 export class Sustar extends Declaracao {
@@ -6,7 +6,7 @@ export class Sustar extends Declaracao {
         super(Number(simbolo.linha), simbolo.hashArquivo);
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return Promise.resolve(visitante.visitarExpressaoSustar(this));
     }
 }
diff --git a/fontes/declaracoes/tente.ts b/fontes/declaracoes/tente.ts
index 429390ef..315b80c2 100644
--- a/fontes/declaracoes/tente.ts
+++ b/fontes/declaracoes/tente.ts
@@ -1,5 +1,5 @@
 import { FuncaoConstruto } from '../construtos';
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Declaracao } from './declaracao';
 
 /**
@@ -26,7 +26,7 @@ export class Tente extends Declaracao {
         this.caminhoFinalmente = caminhoFinalmente;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoTente(this);
     }
 }
diff --git a/fontes/declaracoes/var.ts b/fontes/declaracoes/var.ts
index b996830b..29369c72 100644
--- a/fontes/declaracoes/var.ts
+++ b/fontes/declaracoes/var.ts
@@ -1,5 +1,5 @@
 import { Construto } from '../construtos';
-import { InterpretadorInterface, SimboloInterface } from '../interfaces';
+import { VisitanteComumInterface, SimboloInterface } from '../interfaces';
 import { TiposDadosInterface } from '../interfaces/tipos-dados-interface';
 import { Declaracao } from './declaracao';
 
@@ -18,7 +18,7 @@ export class Var extends Declaracao {
         this.tipo = tipo;
     }
 
-    async aceitar(visitante: InterpretadorInterface): Promise<any> {
+    async aceitar(visitante: VisitanteComumInterface): Promise<any> {
         return await visitante.visitarDeclaracaoVar(this);
     }
 }
diff --git a/fontes/estruturas/delegua-classe.ts b/fontes/estruturas/delegua-classe.ts
index f4589ed1..65307543 100644
--- a/fontes/estruturas/delegua-classe.ts
+++ b/fontes/estruturas/delegua-classe.ts
@@ -1,4 +1,4 @@
-import { InterpretadorInterface } from '../interfaces';
+import { VisitanteComumInterface } from '../interfaces'
 import { Chamavel } from './chamavel';
 import { DeleguaFuncao } from './delegua-funcao';
 import { ObjetoDeleguaClasse } from './objeto-delegua-classe';
@@ -36,12 +36,12 @@ export class DeleguaClasse extends Chamavel {
         return inicializador ? inicializador.aridade() : 0;
     }
 
-    chamar(interpretador: InterpretadorInterface, argumentos: any[]): ObjetoDeleguaClasse {
+    chamar(visitante: VisitanteComumInterface, argumentos: any[]): ObjetoDeleguaClasse {
         const instancia = new ObjetoDeleguaClasse(this);
 
         const inicializador = this.encontrarMetodo('construtor');
         if (inicializador) {
-            inicializador.definirInstancia(instancia).chamar(interpretador, argumentos);
+            inicializador.definirInstancia(instancia).chamar(visitante, argumentos);
         }
 
         return instancia;
diff --git a/fontes/estruturas/delegua-funcao.ts b/fontes/estruturas/delegua-funcao.ts
index f0432bbd..0c040e45 100644
--- a/fontes/estruturas/delegua-funcao.ts
+++ b/fontes/estruturas/delegua-funcao.ts
@@ -1,7 +1,7 @@
 import { Chamavel } from './chamavel';
 import { EspacoVariaveis } from '../espaco-variaveis';
 
-import { InterpretadorInterface } from '../interfaces';
+import { InterpretadorInterface, VisitanteComumInterface } from '../interfaces'
 import { RetornoQuebra } from '../quebras';
 import { ObjetoDeleguaClasse } from './objeto-delegua-classe';
 import { FuncaoConstruto } from '../construtos';
@@ -37,7 +37,7 @@ export class DeleguaFuncao extends Chamavel {
         return `<função ${this.nome}>`;
     }
 
-    async chamar(interpretador: InterpretadorInterface, argumentos: any): Promise<any> {
+    async chamar(visitante: VisitanteComumInterface, argumentos: any): Promise<any> {
         const ambiente = new EspacoVariaveis();
         const parametros = this.declaracao.parametros;
 
@@ -63,7 +63,9 @@ export class DeleguaFuncao extends Chamavel {
             };
         }
 
-        (interpretador as any).proximoEscopo = 'funcao';
+        // TODO: Repensar essa dinâmica para análise semântica.
+        const interpretador = (visitante as any);
+        interpretador.proximoEscopo = 'funcao';
         const retornoBloco: any = await interpretador.executarBloco(this.declaracao.corpo, ambiente);
         if (retornoBloco instanceof RetornoQuebra) {
             return retornoBloco.valor;
diff --git a/fontes/interfaces/analisador-semantico-interface.ts b/fontes/interfaces/analisador-semantico-interface.ts
new file mode 100644
index 00000000..f09d647b
--- /dev/null
+++ b/fontes/interfaces/analisador-semantico-interface.ts
@@ -0,0 +1,12 @@
+import { Construto } from '../construtos';
+import {
+    Declaracao
+} from '../declaracoes';
+
+import { RetornoAnalisadorSemantico } from './retornos/retorno-analisador-semantico';
+import { VisitanteComumInterface } from './visitante-comum-interface';
+
+export interface AnalisadorSemanticoInterface extends VisitanteComumInterface {
+    avaliar(expressao: Construto | Declaracao): any;
+    analisar(declaracoes: Declaracao[]): RetornoAnalisadorSemantico;
+}
diff --git a/fontes/interfaces/erros/erro-analisador-semantico.ts b/fontes/interfaces/erros/erro-analisador-semantico.ts
new file mode 100644
index 00000000..f418ba78
--- /dev/null
+++ b/fontes/interfaces/erros/erro-analisador-semantico.ts
@@ -0,0 +1,8 @@
+import { SimboloInterface } from "../simbolo-interface";
+
+export interface ErroAnalisadorSemantico {
+    simbolo?: SimboloInterface;
+    mensagem?: string;
+    linha?: number;
+    hashArquivo?: number;
+}
diff --git a/fontes/interpretador/erro-interpretador.ts b/fontes/interfaces/erros/erro-interpretador.ts
similarity index 76%
rename from fontes/interpretador/erro-interpretador.ts
rename to fontes/interfaces/erros/erro-interpretador.ts
index 3dd134e9..5dd5b9db 100644
--- a/fontes/interpretador/erro-interpretador.ts
+++ b/fontes/interfaces/erros/erro-interpretador.ts
@@ -1,4 +1,4 @@
-import { SimboloInterface } from '../interfaces';
+import { SimboloInterface } from '..';
 
 export interface ErroInterpretador {
     simbolo?: SimboloInterface;
diff --git a/fontes/interfaces/erros/index.ts b/fontes/interfaces/erros/index.ts
new file mode 100644
index 00000000..9e363209
--- /dev/null
+++ b/fontes/interfaces/erros/index.ts
@@ -0,0 +1,1 @@
+export * from './erro-analisador-semantico';
diff --git a/fontes/interfaces/index.ts b/fontes/interfaces/index.ts
index a4d4df88..8378e059 100644
--- a/fontes/interfaces/index.ts
+++ b/fontes/interfaces/index.ts
@@ -9,3 +9,4 @@ export * from './retornos/retorno-execucao-interface';
 export * from './simbolo-interface';
 export * from './tradutor-interface';
 export * from './variavel-interface';
+export * from './visitante-comum-interface';
diff --git a/fontes/interfaces/interpretador-interface.ts b/fontes/interfaces/interpretador-interface.ts
index d88ea174..99d1704f 100644
--- a/fontes/interfaces/interpretador-interface.ts
+++ b/fontes/interfaces/interpretador-interface.ts
@@ -1,81 +1,21 @@
 import { EspacoVariaveis } from '../espaco-variaveis';
-import { Atribuir, Construto, FimPara, Literal, Super } from '../construtos';
+import { Construto } from '../construtos';
 import {
-    Bloco,
-    Classe,
-    Const,
-    Continua,
-    Declaracao,
-    Enquanto,
-    Escolha,
-    Escreva,
-    Expressao,
-    Fazer,
-    FuncaoDeclaracao,
-    Importar,
-    Leia,
-    Para,
-    ParaCada,
-    Retorna,
-    Se,
-    Sustar,
-    Tente,
-    Var,
+    Declaracao
 } from '../declaracoes';
-import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../quebras';
 import { PilhaEscoposExecucaoInterface } from './pilha-escopos-execucao-interface';
 
 import { RetornoInterpretador } from './retornos/retorno-interpretador';
-import { EscrevaMesmaLinha } from '../declaracoes/escreva-mesma-linha';
-import { FormatacaoEscrita } from '../construtos/formatacao-escrita';
+import { VisitanteComumInterface } from './visitante-comum-interface';
 
-export interface InterpretadorInterface {
+export interface InterpretadorInterface extends VisitanteComumInterface {
     diretorioBase: any;
     funcaoDeRetorno: Function;
     pilhaEscoposExecucao: PilhaEscoposExecucaoInterface;
     interfaceEntradaSaida: any;
 
-    visitarExpressaoLiteral(expressao: Literal): Promise<any>;
     avaliar(expressao: Construto | Declaracao): any;
-    visitarExpressaoAgrupamento(expressao: any): Promise<any>;
-    visitarExpressaoUnaria(expressao: any): any;
-    visitarExpressaoBinaria(expressao: any): any;
-    visitarExpressaoDeChamada(expressao: any): any;
-    visitarDeclaracaoDeAtribuicao(expressao: Atribuir): any;
-    visitarExpressaoDeVariavel(expressao: any): any;
-    visitarDeclaracaoDeExpressao(declaracao: Expressao): any;
-    visitarExpressaoLeia(expressao: Leia): any;
-    visitarExpressaoLogica(expressao: any): any;
-    visitarDeclaracaoPara(declaracao: Para): Promise<any>;
-    visitarDeclaracaoParaCada(declaracao: ParaCada): Promise<any>;
-    visitarDeclaracaoSe(declaracao: Se): any;
-    visitarExpressaoFimPara(declaracao: FimPara): any;
-    visitarDeclaracaoFazer(declaracao: Fazer): any;
-    visitarExpressaoFormatacaoEscrita(declaracao: FormatacaoEscrita): any;
-    visitarDeclaracaoEscolha(declaracao: Escolha): any;
-    visitarDeclaracaoTente(declaracao: Tente): any;
-    visitarDeclaracaoEnquanto(declaracao: Enquanto): any;
-    visitarDeclaracaoImportar(declaracao: Importar): any;
-    visitarDeclaracaoEscreva(declaracao: Escreva): any;
-    visitarExpressaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): any;
     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>;
-    visitarExpressaoDeleguaFuncao(expressao: any): any;
-    visitarExpressaoAtribuicaoSobrescrita(expressao: any): Promise<any>;
-    visitarExpressaoAcessoIndiceVariavel(expressao: any): any;
-    visitarExpressaoDefinirValor(expressao: any): any;
-    visitarDeclaracaoDefinicaoFuncao(declaracao: FuncaoDeclaracao): any;
-    visitarDeclaracaoClasse(declaracao: Classe): any;
-    visitarExpressaoAcessoMetodo(expressao: any): any;
-    visitarExpressaoIsto(expressao: any): any;
-    visitarExpressaoDicionario(expressao: any): any;
-    visitarExpressaoVetor(expressao: any): any;
-    visitarExpressaoSuper(expressao: Super): any;
     paraTexto(objeto: any): any;
     executar(declaracao: Declaracao, mostrarResultado: boolean): any;
     interpretar(declaracoes: Declaracao[], manterAmbiente?: boolean): Promise<RetornoInterpretador>;
diff --git a/fontes/interfaces/retornos/retorno-analisador-semantico.ts b/fontes/interfaces/retornos/retorno-analisador-semantico.ts
new file mode 100644
index 00000000..f79c65ad
--- /dev/null
+++ b/fontes/interfaces/retornos/retorno-analisador-semantico.ts
@@ -0,0 +1,5 @@
+import { ErroAnalisadorSemantico } from "../erros";
+
+export interface RetornoAnalisadorSemantico {
+    erros: ErroAnalisadorSemantico[];
+}
diff --git a/fontes/interfaces/retornos/retorno-interpretador.ts b/fontes/interfaces/retornos/retorno-interpretador.ts
index 42796c67..ba2bbf68 100644
--- a/fontes/interfaces/retornos/retorno-interpretador.ts
+++ b/fontes/interfaces/retornos/retorno-interpretador.ts
@@ -1,4 +1,4 @@
-import { ErroInterpretador } from '../../interpretador/erro-interpretador';
+import { ErroInterpretador } from '../erros/erro-interpretador';
 
 export interface RetornoInterpretador {
     erros: ErroInterpretador[];
diff --git a/fontes/interfaces/visitante-comum-interface.ts b/fontes/interfaces/visitante-comum-interface.ts
new file mode 100644
index 00000000..e54a0c3b
--- /dev/null
+++ b/fontes/interfaces/visitante-comum-interface.ts
@@ -0,0 +1,70 @@
+import { EspacoVariaveis } from '../espaco-variaveis';
+import { Atribuir, Construto, FimPara, Literal, Super } from '../construtos';
+import {
+    Bloco,
+    Classe,
+    Const,
+    Continua,
+    Declaracao,
+    Enquanto,
+    Escolha,
+    Escreva,
+    Expressao,
+    Fazer,
+    FuncaoDeclaracao,
+    Importar,
+    Leia,
+    Para,
+    ParaCada,
+    Retorna,
+    Se,
+    Sustar,
+    Tente,
+    Var,
+} from '../declaracoes';
+import { ContinuarQuebra, RetornoQuebra, SustarQuebra } from '../quebras';
+
+import { EscrevaMesmaLinha } from '../declaracoes/escreva-mesma-linha';
+import { FormatacaoEscrita } from '../construtos/formatacao-escrita';
+
+export interface VisitanteComumInterface {
+    visitarExpressaoAgrupamento(expressao: any): Promise<any>;
+    visitarExpressaoUnaria(expressao: any): any;
+    visitarExpressaoBinaria(expressao: any): any;
+    visitarExpressaoDeChamada(expressao: any): any;
+    visitarDeclaracaoDeAtribuicao(expressao: Atribuir): any;
+    visitarExpressaoDeVariavel(expressao: any): any;
+    visitarDeclaracaoDeExpressao(declaracao: Expressao): any;
+    visitarExpressaoLeia(expressao: Leia): any;
+    visitarExpressaoLiteral(expressao: Literal): Promise<any>;
+    visitarExpressaoLogica(expressao: any): any;
+    visitarDeclaracaoPara(declaracao: Para): Promise<any>;
+    visitarDeclaracaoParaCada(declaracao: ParaCada): Promise<any>;
+    visitarDeclaracaoSe(declaracao: Se): any;
+    visitarExpressaoFimPara(declaracao: FimPara): any;
+    visitarDeclaracaoFazer(declaracao: Fazer): any;
+    visitarExpressaoFormatacaoEscrita(declaracao: FormatacaoEscrita): any;
+    visitarDeclaracaoEscolha(declaracao: Escolha): any;
+    visitarDeclaracaoTente(declaracao: Tente): any;
+    visitarDeclaracaoEnquanto(declaracao: Enquanto): any;
+    visitarDeclaracaoImportar(declaracao: Importar): any;
+    visitarDeclaracaoEscreva(declaracao: Escreva): any;
+    visitarExpressaoEscrevaMesmaLinha(declaracao: EscrevaMesmaLinha): 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>;
+    visitarExpressaoDeleguaFuncao(expressao: any): any;
+    visitarExpressaoAtribuicaoSobrescrita(expressao: any): Promise<any>;
+    visitarExpressaoAcessoIndiceVariavel(expressao: any): any;
+    visitarExpressaoDefinirValor(expressao: any): any;
+    visitarDeclaracaoDefinicaoFuncao(declaracao: FuncaoDeclaracao): any;
+    visitarDeclaracaoClasse(declaracao: Classe): any;
+    visitarExpressaoAcessoMetodo(expressao: any): any;
+    visitarExpressaoIsto(expressao: any): any;
+    visitarExpressaoDicionario(expressao: any): any;
+    visitarExpressaoVetor(expressao: any): any;
+    visitarExpressaoSuper(expressao: Super): any;
+}
\ No newline at end of file
diff --git a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
index d2193292..ac8b18e6 100644
--- a/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
+++ b/fontes/interpretador/dialetos/egua-classico/interpretador-egua-classico.ts
@@ -40,7 +40,7 @@ import {
     Variavel,
 } from '../../../construtos';
 import { RetornoInterpretador } from '../../../interfaces/retornos/retorno-interpretador';
-import { ErroInterpretador } from '../../erro-interpretador';
+import { ErroInterpretador } from '../../../interfaces/erros/erro-interpretador';
 import { PilhaEscoposExecucao } from '../../pilha-escopos-execucao';
 import { EscopoExecucao } from '../../../interfaces/escopo-execucao';
 import { ContinuarQuebra, Quebra, RetornoQuebra, SustarQuebra } from '../../../quebras';
diff --git a/fontes/interpretador/dialetos/mapler/comum.ts b/fontes/interpretador/dialetos/mapler/comum.ts
index 5fcefd69..c9a0bd4e 100644
--- a/fontes/interpretador/dialetos/mapler/comum.ts
+++ b/fontes/interpretador/dialetos/mapler/comum.ts
@@ -1,12 +1,12 @@
 import { Binario, Construto, Logico } from "../../../construtos";
-import { InterpretadorInterface, SimboloInterface, VariavelInterface } from "../../../interfaces";
+import { VisitanteComumInterface, SimboloInterface, VariavelInterface } from "../../../interfaces";
 import { inferirTipoVariavel } from '../../inferenciador';
 
 import tiposDeSimbolos from '../../../tipos-de-simbolos/mapler';
 import { ErroEmTempoDeExecucao } from "../../../excecoes";
 
-async function avaliar(interpretador: InterpretadorInterface, expressao: Construto): Promise<any> {
-    return await expressao.aceitar(interpretador);
+async function avaliar(visitante: VisitanteComumInterface, expressao: Construto): Promise<any> {
+    return await expressao.aceitar(visitante);
 }
 
 function eIgual(esquerda: VariavelInterface | any, direita: VariavelInterface | any): boolean {
@@ -46,10 +46,10 @@ function verificarOperandosNumeros(
  * @param expressao A expressão binária.
  * @returns O resultado da resolução da expressão.
  */
-export async function visitarExpressaoBinaria(interpretador: InterpretadorInterface, expressao: Binario | any): Promise<any> {
+export async function visitarExpressaoBinaria(visitante: VisitanteComumInterface, expressao: Binario | any): Promise<any> {
     try {
-        const esquerda: VariavelInterface | any = await avaliar(interpretador, expressao.esquerda);
-        const direita: VariavelInterface | any = await avaliar(interpretador, expressao.direita);
+        const esquerda: VariavelInterface | any = await avaliar(visitante, expressao.esquerda);
+        const direita: VariavelInterface | any = await avaliar(visitante, expressao.direita);
 
         let valorEsquerdo: any = esquerda?.hasOwnProperty('valor') ? esquerda.valor : esquerda;
         let valorDireito: any = direita?.hasOwnProperty('valor') ? direita.valor : direita;
@@ -142,7 +142,7 @@ export async function visitarExpressaoBinaria(interpretador: InterpretadorInterf
     }
 }
 
-export async function visitarExpressaoLogica(interpretador: InterpretadorInterface, expressao: Logico): Promise<any> {
+export async function visitarExpressaoLogica(interpretador: VisitanteComumInterface, expressao: Logico): Promise<any> {
     const esquerda = await avaliar(interpretador, expressao.esquerda);
 
     // se um estado for verdadeiro, retorna verdadeiro
diff --git a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
index 82d450ca..4492790b 100644
--- a/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
+++ b/fontes/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.ts
@@ -8,7 +8,7 @@ import { EscopoExecucao } from "../../../interfaces/escopo-execucao";
 import { PilhaEscoposExecucaoInterface } from "../../../interfaces/pilha-escopos-execucao-interface";
 import { RetornoInterpretador } from "../../../interfaces/retornos";
 import { ContinuarQuebra, SustarQuebra, RetornoQuebra, Quebra } from "../../../quebras";
-import { ErroInterpretador } from "../../erro-interpretador";
+import { ErroInterpretador } from "../../../interfaces/erros/erro-interpretador";
 import { PilhaEscoposExecucao } from "../../pilha-escopos-execucao";
 
 import tiposDeSimbolos from '../../../tipos-de-simbolos/portugol-ipt';
diff --git a/fontes/interpretador/dialetos/visualg/comum.ts b/fontes/interpretador/dialetos/visualg/comum.ts
index 8e56d61c..30868143 100644
--- a/fontes/interpretador/dialetos/visualg/comum.ts
+++ b/fontes/interpretador/dialetos/visualg/comum.ts
@@ -1,11 +1,11 @@
 import { Binario, Construto, Logico } from "../../../construtos";
-import { InterpretadorInterface, SimboloInterface, VariavelInterface } from "../../../interfaces";
+import { VisitanteComumInterface, SimboloInterface, VariavelInterface } from "../../../interfaces";
 import { inferirTipoVariavel } from '../../inferenciador';
 
 import tiposDeSimbolos from '../../../tipos-de-simbolos/visualg';
 import { ErroEmTempoDeExecucao } from "../../../excecoes";
 
-async function avaliar(interpretador: InterpretadorInterface, expressao: Construto): Promise<any> {
+async function avaliar(interpretador: VisitanteComumInterface, expressao: Construto): Promise<any> {
     return await expressao.aceitar(interpretador);
 }
 
@@ -46,7 +46,7 @@ function verificarOperandosNumeros(
  * @param expressao A expressão binária.
  * @returns O resultado da resolução da expressão.
  */
-export async function visitarExpressaoBinaria(interpretador: InterpretadorInterface, expressao: Binario | any): Promise<any> {
+export async function visitarExpressaoBinaria(interpretador: VisitanteComumInterface, expressao: Binario | any): Promise<any> {
     try {
         const esquerda: VariavelInterface | any = await avaliar(interpretador, expressao.esquerda);
         const direita: VariavelInterface | any = await avaliar(interpretador, expressao.direita);
@@ -142,7 +142,7 @@ export async function visitarExpressaoBinaria(interpretador: InterpretadorInterf
     }
 }
 
-export async function visitarExpressaoLogica(interpretador: InterpretadorInterface, expressao: Logico): Promise<any> {
+export async function visitarExpressaoLogica(interpretador: VisitanteComumInterface, expressao: Logico): Promise<any> {
     const esquerda = await avaliar(interpretador, expressao.esquerda);
 
     // se um estado for verdadeiro, retorna verdadeiro
diff --git a/fontes/interpretador/index.ts b/fontes/interpretador/index.ts
index eaa1108c..dd9dd148 100644
--- a/fontes/interpretador/index.ts
+++ b/fontes/interpretador/index.ts
@@ -1,4 +1,4 @@
-export * from './erro-interpretador';
+export * from '../interfaces/erros/erro-interpretador';
 export * from './interpretador-base';
 export * from './interpretador-com-depuracao';
 export * from '../interfaces/retornos/retorno-interpretador';
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index 558a15e1..ebec1650 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -50,7 +50,7 @@ import {
     Unario,
     Variavel,
 } from '../construtos';
-import { ErroInterpretador } from './erro-interpretador';
+import { ErroInterpretador } from '../interfaces/erros/erro-interpretador';
 import { RetornoInterpretador } from '../interfaces/retornos/retorno-interpretador';
 import { EscopoExecucao } from '../interfaces/escopo-execucao';
 import { PilhaEscoposExecucao } from './pilha-escopos-execucao';


Test patch:
diff --git a/testes/analisador-semantico.test.ts b/testes/analisador-semantico.test.ts
new file mode 100644
index 00000000..d9c1898f
--- /dev/null
+++ b/testes/analisador-semantico.test.ts
@@ -0,0 +1,42 @@
+import { Lexador } from '../fontes/lexador';
+import { AvaliadorSintatico } from '../fontes/avaliador-sintatico';
+import { AnalisadorSemantico } from '../fontes/analisador-semantico';
+
+describe('Analisador semântico', () => {
+    let lexador: Lexador;
+    let avaliadorSintatico: AvaliadorSintatico;
+    let analisadorSemantico: AnalisadorSemantico;
+
+    describe('analisar()', () => {
+        beforeEach(() => {
+            lexador = new Lexador();
+            avaliadorSintatico = new AvaliadorSintatico();
+            analisadorSemantico = new AnalisadorSemantico();
+        });
+
+        describe('Cenários de sucesso', () => {
+            it('Sucesso - Olá Mundo', () => {
+                const retornoLexador = lexador.mapear(["escreva('Olá mundo')"], -1);
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
+    
+                expect(retornoAnalisadorSemantico).toBeTruthy();
+                expect(retornoAnalisadorSemantico.erros).toHaveLength(0);
+            });
+        });
+        
+        describe('Cenários de falha', () => {
+            it('Atribuição de constante + reatribuição de constante', () => {
+                const retornoLexador = lexador.mapear([
+                    "const a = 1",
+                    "a = 2"
+                ], -1);
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
+    
+                expect(retornoAnalisadorSemantico).toBeTruthy();
+                expect(retornoAnalisadorSemantico.erros).toHaveLength(1);
+            });
+        });
+    });
+});
diff --git a/testes/birl/avaliador-sintatico.test.ts b/testes/birl/avaliador-sintatico.test.ts
index f2e22732..8438df08 100644
--- a/testes/birl/avaliador-sintatico.test.ts
+++ b/testes/birl/avaliador-sintatico.test.ts
@@ -302,7 +302,7 @@ describe('Avaliador Sintático Birl', () => {
             it('Sucesso - declaração - declaracaoFuncao', () => {
                 const retornoLexador = lexador.mapear([
                     'HORA DO SHOW \n',
-                    '   OH O HOME AI PO(MONSTRO NOMEFUNCAO(MONSTRO primeiro, MONSTRO segundo)\n',
+                    '   OH O HOME AI PO(MONSTRO NOMEFUNCAO(MONSTRO primeiro, MONSTRO segundo))\n',
                     '       MONSTRO C = primeiro + segundo;\n',
                     '       BORA CUMPADE C;\n',
                     '   BIRL\n',
@@ -377,12 +377,7 @@ describe('Avaliador Sintático Birl', () => {
 
             it('Falha - declaração - Escreva - com falha na expressão', () => {
                 const retornoLexador = lexador.mapear(
-                    [
-                        'HORA DO SHOW',
-                        '  CE QUER VER ESSA ? ("Hello, World! Porra!\n");',
-                        '  BORA CUMPADE 0;',
-                        'BIRL',
-                    ],
+                    ['HORA DO SHOW', '  CE QUER VER ESSA ? ("Hello, World! Porra!\n");', '  BORA CUMPADE 0;', 'BIRL'],
                     -1
                 );
 
@@ -390,9 +385,256 @@ describe('Avaliador Sintático Birl', () => {
                 expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
                     expect.objectContaining({
                         message: 'Esperado expressão `PORRA` após `ESSA` para escrever mensagem.',
-                    }))
+                    })
+                );
+            });
+
+            it('Falha - declaração - Frango - sem identificador', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    "   FRANGO = 'testes';\n",
+                    '   CE QUER VER ESSA PORRA? (FR); \n',
+                    '   BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'FRANGO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - Trapezio - sem identificador', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  TRAPEZIO = 1.03; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'TRAPEZIO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - short int - sem identificador', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  MONSTRINHO = 1.03; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'MONSTRINHO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - long int - sem identificador', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  MONSTRAO = 16666666; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'MONSTRAO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - double - sem identificador', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '  TRAPEZIO DESCENDENTE = 0.37; \n',
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'TRAPEZIO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - unsigned char - sem identificador', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    `  BICEPS FRANGO = 'test'; \n`,
+                    '  CE QUER VER ESSA PORRA? (M1); \n',
+                    '  BORA CUMPADE 0; \n',
+                    'BIRL \n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado identificador após palavra reservada 'FRANGO'.",
+                    })
+                );
+            });
+
+            it('Falha - declaração - if - sem expressão', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   ELE QUE A GENTE QUER? ()\n',
+                    '     CE QUER VER ESSA PORRA? ("teste");\n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(TypeError);
+            });
+
+            it('Falha - declaração - if - sem bloco e sem expressão', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   ELE QUE A GENTE QUER? ()\n',
+                    '     \n',
+                    '   NAO VAI DAR NAO\n',
+                    '     \n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(TypeError);
+            });
+
+            it('Falha - declaração - for - sem expressão', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   MAIS QUERO MAIS ( ; ; )\n',
+                    '       CE QUER VER ESSA PORRA? ("teste");\n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: 'Esperado expressão `;` após a condição do `PARA`.',
+                    })
+                );
+            })
+
+            it('Falha - declaração - for - sem bloco e sem expressão', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   MAIS QUERO MAIS ()',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: 'Esperado expressão `;` após a inicialização do `PARA`.',
+                    })
+                );
             });
 
+            it('Falha - declaração - for - sem incremento e condição', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   MONSTRO M;\n',
+                    '   MAIS QUERO MAIS (M = 5;)',
+                    '       CE QUER VER ESSA PORRA? ("teste");\n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: 'Esperado expressão `;` após a condição do `PARA`.',
+                    })
+                );
+            })
+
+            it('Falha - declaração - while - sem expressão', () => {
+                const RetornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   MONSTRO X = 5;\n',
+                    '   NEGATIVA BAMBAM ()',
+                    '       CE QUER VER ESSA PORRA? ("teste");\n',
+                    '       X--;\n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(RetornoLexador, -1)).toThrow(TypeError);
+            })
+
+            it('Falha - declaração - declaracao - sem nome de funcão', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   OH O HOME AI PO(MONSTRO (MONSTRO primeiro, MONSTRO segundo)\n',
+                    '       MONSTRO C = primeiro + segundo;\n',
+                    '       BORA CUMPADE C;\n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: 'Esperado nome da função apos a declaração do tipo.',
+                    })
+                );
+            })
+
+            it('Falha - declaração - declaracao - sem declaração', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   OH O HOME AI PO(MONSTRO(MONSTRO primeiro, MONSTRO segundo))\n',
+                    '       MONSTRO C = primeiro + segundo;\n',
+                    '       BORA CUMPADE C;\n',
+                    '   BIRL\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: 'Esperado nome da função apos a declaração do tipo.',
+                    })
+                );
+            })
+
+            it('Falha - declaração - chamarFuncao - sem identificador', () => {
+                const retornoLexador = lexador.mapear([
+                    'HORA DO SHOW \n',
+                    '   MONSTRO primeiro = 5;\n',
+                    '   MONSTRO segundo = 10;\n',
+                    '   MONSTRO resultado = AJUDA O MALUCO TA DOENTE (primeiro, segundo);\n',
+                    'BIRL\n',
+                ]);
+
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(ErroAvaliadorSintatico);
+                expect(() => avaliadorSintatico.analisar(retornoLexador, -1)).toThrow(
+                    expect.objectContaining({
+                        message: "Esperado ')' após a expressão.",
+                    })
+                );
+            })
+
             it.skip('Falha - declaração - Variavel - numero recebendo string', () => {
                 const retornoLexador = lexador.mapear([
                     'HORA DO SHOW \n',
@@ -403,7 +645,7 @@ describe('Avaliador Sintático Birl', () => {
                 ]);
 
                 console.log(avaliadorSintatico.analisar(retornoLexador, -1));
-            })
+            });
         });
     });
 });