Repository: DesignLiquido/delegua
Pull request #389 (2023-05-19 22:40:51)

Potigol
Esboço inicial do dialeto.

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: 72.92%">72.63% (-0.29% 🔻)</div> |    6154/8473    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 62.6%">62.38% (-0.22% 🔻)</div>  |    1978/3171    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 70.12%">69.99% (-0.13% 🔻)</div> |     912/1303    |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 73.38%">73.06% (-0.32% 🔻)</div> |    5993/8203    |

<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="avaliador-sintatico/dialetos/avaliador-sintatico-potigol.ts">`...` / avaliador-sintatico-potigol.ts</div> | 77.27%     | 66.67%   | 50%       | 77.27% |
|                                                                           🟢                                                                           | <div title="tipos-de-simbolos/potigol.ts">`...` / potigol.ts</div>                                                    | 100%       | 100%     | 100%      | 100%   |
|                                                                           🔴                                                                           | <div title="lexador/dialetos/lexador-potigol.ts">`...` / lexador-potigol.ts</div>                                     | 46.23%     | 43.9%    | 85.71%    | 45.19% |
|                                                                           🟢                                                                           | <div title="lexador/dialetos/palavras-reservadas/potigol.ts">`...` / potigol.ts</div>                                 | 100%       | 100%     | 100%      | 100%   |

</details>


## Test suite run success
470 tests passing in 41 suites.

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

Patch:
diff --git a/.vscode/launch.json b/.vscode/launch.json
index b4e4b531..d4340fdf 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -645,13 +645,13 @@
             "internalConsoleOptions": "neverOpen"
         },
         {
-            "name": "Testes unitários - VisuAlg",
+            "name": "Testes unitários - Mapler",
             "type": "node",
             "request": "launch",
             "runtimeArgs": [
                 "--inspect-brk",
                 "${workspaceRoot}/node_modules/jest/bin/jest.js",
-                "visualg",
+                "mapler",
                 "--runInBand"
             ],
             "skipFiles": ["<node_internals>/**", "node_modules/**"],
@@ -659,16 +659,19 @@
             "internalConsoleOptions": "neverOpen"
         },
         {
-            "name": "Testes unitários - Mapler",
+            "name": "Testes unitários - Potigol",
             "type": "node",
             "request": "launch",
             "runtimeArgs": [
                 "--inspect-brk",
                 "${workspaceRoot}/node_modules/jest/bin/jest.js",
-                "mapler",
+                "potigol/interpretador",
                 "--runInBand"
             ],
-            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "skipFiles": [
+                "<node_internals>/**",
+                "node_modules/**"
+            ],
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
         },
@@ -706,6 +709,20 @@
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
         },
+        {
+            "name": "Testes unitários - VisuAlg",
+            "type": "node",
+            "request": "launch",
+            "runtimeArgs": [
+                "--inspect-brk",
+                "${workspaceRoot}/node_modules/jest/bin/jest.js",
+                "visualg",
+                "--runInBand"
+            ],
+            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "console": "integratedTerminal",
+            "internalConsoleOptions": "neverOpen"
+        },
         {
             "name": "Testes unitários - Tradutor Delégua para Javascript",
             "type": "node",
diff --git a/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-potigol.ts b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-potigol.ts
new file mode 100644
index 00000000..a6b6655e
--- /dev/null
+++ b/fontes/avaliador-sintatico/dialetos/avaliador-sintatico-potigol.ts
@@ -0,0 +1,110 @@
+import { Construto, FuncaoConstruto, Literal, Variavel } from "../../construtos";
+import { Escreva, Declaracao, Se, Enquanto, Para, Escolha, Fazer, EscrevaMesmaLinha } from "../../declaracoes";
+import { RetornoLexador, RetornoAvaliadorSintatico } from "../../interfaces/retornos";
+import { AvaliadorSintaticoBase } from "../avaliador-sintatico-base";
+
+import tiposDeSimbolos from "../../tipos-de-simbolos/potigol";
+import { SimboloInterface } from "../../interfaces";
+
+export class AvaliadorSintaticoPotigol extends AvaliadorSintaticoBase {
+    primario(): Construto {
+        const simboloAtual = this.simbolos[this.atual];
+
+        switch (simboloAtual.tipo) {
+            case tiposDeSimbolos.INTEIRO:
+            case tiposDeSimbolos.REAL:
+            case tiposDeSimbolos.TEXTO:
+                const simboloNumeroTexto: SimboloInterface = this.avancarEDevolverAnterior();
+                return new Literal(this.hashArquivo, Number(simboloNumeroTexto.linha), simboloNumeroTexto.literal);
+            default:
+                const simboloIdentificador: SimboloInterface = this.avancarEDevolverAnterior();
+                return new Variavel(this.hashArquivo, simboloIdentificador);
+        }
+    }
+
+    chamar(): Construto {
+        return this.primario();
+    }
+    
+
+    declaracaoEscreva(): Escreva {
+        const simboloAtual = this.avancarEDevolverAnterior();
+
+        const argumentos: Construto[] = [];
+
+        do {
+            argumentos.push(this.expressao());
+        } while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
+
+        return new Escreva(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
+    }
+
+    declaracaoImprima(): EscrevaMesmaLinha {
+        const simboloAtual = this.avancarEDevolverAnterior();
+
+        const argumentos: Construto[] = [];
+
+        do {
+            argumentos.push(this.expressao());
+        } while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.VIRGULA));
+
+        return new EscrevaMesmaLinha(Number(simboloAtual.linha), simboloAtual.hashArquivo, argumentos);
+    }
+
+    blocoEscopo(): Declaracao[] {
+        throw new Error("Método não implementado.");
+    }
+    declaracaoSe(): Se {
+        throw new Error("Método não implementado.");
+    }
+    declaracaoEnquanto(): Enquanto {
+        throw new Error("Método não implementado.");
+    }
+    declaracaoPara(): Para {
+        throw new Error("Método não implementado.");
+    }
+    declaracaoEscolha(): Escolha {
+        throw new Error("Método não implementado.");
+    }
+    declaracaoFazer(): Fazer {
+        throw new Error("Método não implementado.");
+    }
+    corpoDaFuncao(tipo: string): FuncaoConstruto {
+        throw new Error("Método não implementado.");
+    }
+
+    declaracao(): Declaracao | Declaracao[] | Construto | Construto[] | any {
+        const simboloAtual = this.simbolos[this.atual];
+        switch (simboloAtual.tipo) {
+            case tiposDeSimbolos.ESCREVA:
+                return this.declaracaoEscreva();
+            case tiposDeSimbolos.IMPRIMA:
+                return this.declaracaoImprima();
+            default:
+                return this.expressao();
+        }
+    }
+
+    atribuir(): Construto {
+        return this.ou();
+    }
+
+    analisar(retornoLexador: RetornoLexador, hashArquivo: number): RetornoAvaliadorSintatico {
+        this.erros = [];
+        this.atual = 0;
+        this.blocos = 0;
+
+        this.hashArquivo = hashArquivo || 0;
+        this.simbolos = retornoLexador?.simbolos || [];
+
+        const declaracoes: Declaracao[] = [];
+        while (!this.estaNoFinal()) {
+            declaracoes.push(this.declaracao() as Declaracao);
+        }
+
+        return {
+            declaracoes: declaracoes,
+            erros: this.erros,
+        } as RetornoAvaliadorSintatico;
+    }
+}
\ No newline at end of file
diff --git a/fontes/avaliador-sintatico/dialetos/index.ts b/fontes/avaliador-sintatico/dialetos/index.ts
index 454f19e7..67f36fa5 100644
--- a/fontes/avaliador-sintatico/dialetos/index.ts
+++ b/fontes/avaliador-sintatico/dialetos/index.ts
@@ -2,6 +2,7 @@ export * from './avaliador-sintatico-birl';
 export * from './avaliador-sintatico-egua-classico';
 export * from './avaliador-sintatico-eguap';
 export * from './avaliador-sintatico-mapler';
+export * from './avaliador-sintatico-potigol';
 export * from './avaliador-sintatico-portugol-ipt';
 export * from './avaliador-sintatico-portugol-studio';
 export * from './avaliador-sintatico-visualg';
diff --git a/fontes/lexador/dialetos/index.ts b/fontes/lexador/dialetos/index.ts
index 7714bc10..a9db3f41 100644
--- a/fontes/lexador/dialetos/index.ts
+++ b/fontes/lexador/dialetos/index.ts
@@ -3,6 +3,7 @@ export * from './lexador-egua-classico';
 export * from './lexador-eguap';
 export * from './lexador-guarani';
 export * from './lexador-mapler';
+export * from './lexador-potigol';
 export * from './lexador-portugol-ipt';
 export * from './lexador-portugol-studio';
 export * from './lexador-visualg';
diff --git a/fontes/lexador/dialetos/lexador-portugol-studio.ts b/fontes/lexador/dialetos/lexador-portugol-studio.ts
index 4c286249..f621f709 100644
--- a/fontes/lexador/dialetos/lexador-portugol-studio.ts
+++ b/fontes/lexador/dialetos/lexador-portugol-studio.ts
@@ -126,6 +126,8 @@ export class LexadorPortugolStudio extends LexadorBase {
                 } else {
                     this.adicionarSimbolo(tiposDeSimbolos.SUBTRACAO);
                 }
+                
+                break;
             case '+':
                 this.inicioSimbolo = this.atual;
                 this.avancar();
diff --git a/fontes/lexador/dialetos/lexador-potigol.ts b/fontes/lexador/dialetos/lexador-potigol.ts
new file mode 100644
index 00000000..2792f3fb
--- /dev/null
+++ b/fontes/lexador/dialetos/lexador-potigol.ts
@@ -0,0 +1,278 @@
+import { RetornoLexador } from "../../interfaces/retornos";
+import { ErroLexador } from "../erro-lexador";
+import { LexadorBaseLinhaUnica } from "../lexador-base-linha-unica";
+
+import tiposDeSimbolos from '../../tipos-de-simbolos/potigol';
+import { palavrasReservadas } from "./palavras-reservadas/potigol";
+
+export class LexadorPotigol extends LexadorBaseLinhaUnica {
+    protected logicaComumCaracteres(delimitador: string) {
+        while (this.simboloAtual() !== delimitador && !this.eFinalDoCodigo()) {
+            this.avancar();
+        }
+
+        if (this.eFinalDoCodigo()) {
+            this.erros.push({
+                linha: this.linha + 1,
+                caractere: this.simboloAnterior(),
+                mensagem: 'Cadeia de caracteres não finalizada.',
+            } as ErroLexador);
+            return;
+        }
+
+        const valor = this.codigo.substring(this.inicioSimbolo + 1, this.atual);
+        return valor;
+    }
+
+    analisarCaracter() {
+        const valor = this.logicaComumCaracteres("'");
+        this.adicionarSimbolo(tiposDeSimbolos.CARACTERE, valor);
+    }
+
+    analisarTexto(): void {
+        const valor = this.logicaComumCaracteres('"');
+        this.adicionarSimbolo(tiposDeSimbolos.TEXTO, valor);
+    }
+
+    analisarNumero(): void {
+        let real = false;
+        while (this.eDigito(this.simboloAtual())) {
+            this.avancar();
+        }
+
+        if (this.simboloAtual() == '.' && this.eDigito(this.proximoSimbolo())) {
+            real = true;
+            this.avancar();
+
+            while (this.eDigito(this.simboloAtual())) {
+                this.avancar();
+            }
+        }
+
+        const numeroCompleto = this.codigo.substring(this.inicioSimbolo, this.atual);
+
+        this.adicionarSimbolo(
+            real ? tiposDeSimbolos.REAL : tiposDeSimbolos.INTEIRO,
+            parseFloat(numeroCompleto));
+    }
+
+    identificarPalavraChave(): void {
+        while (this.eAlfabetoOuDigito(this.simboloAtual())) {
+            this.avancar();
+        }
+
+        const codigo = this.codigo.substring(this.inicioSimbolo, this.atual);
+        const tipo = codigo in palavrasReservadas ? palavrasReservadas[codigo] : tiposDeSimbolos.IDENTIFICADOR;
+
+        this.adicionarSimbolo(tipo);
+    }
+
+    analisarToken(): void {
+        const caractere = this.simboloAtual();
+
+        switch (caractere) {
+            case '[':
+                this.adicionarSimbolo(tiposDeSimbolos.COLCHETE_ESQUERDO);
+                this.avancar();
+                break;
+            case ']':
+                this.adicionarSimbolo(tiposDeSimbolos.COLCHETE_DIREITO);
+                this.avancar();
+                break;
+            case '(':
+                this.adicionarSimbolo(tiposDeSimbolos.PARENTESE_ESQUERDO);
+                this.avancar();
+                break;
+            case ')':
+                this.adicionarSimbolo(tiposDeSimbolos.PARENTESE_DIREITO);
+                this.avancar();
+                break;
+            /* case '{':
+                this.adicionarSimbolo(tiposDeSimbolos.CHAVE_ESQUERDA);
+                this.avancar();
+                break;
+            case '}':
+                this.adicionarSimbolo(tiposDeSimbolos.CHAVE_DIREITA);
+                this.avancar();
+                break; */
+            case ',':
+                this.adicionarSimbolo(tiposDeSimbolos.VIRGULA);
+                this.avancar();
+                break;
+            case '.':
+                this.adicionarSimbolo(tiposDeSimbolos.PONTO);
+                this.avancar();
+                break;
+            case '-':
+                this.inicioSimbolo = this.atual;
+                this.avancar();
+                this.adicionarSimbolo(tiposDeSimbolos.SUBTRACAO);
+                /* if (this.simboloAtual() === '=') {
+                    this.adicionarSimbolo(tiposDeSimbolos.MENOS_IGUAL);
+                    this.avancar();
+                } else if (this.simboloAtual() === '-') {
+                    this.adicionarSimbolo(tiposDeSimbolos.DECREMENTAR);
+                    this.avancar();
+                } else {
+                    this.adicionarSimbolo(tiposDeSimbolos.SUBTRACAO);
+                } */
+                break;
+            case '+':
+                this.inicioSimbolo = this.atual;
+                this.avancar();
+                this.adicionarSimbolo(tiposDeSimbolos.ADICAO);
+                /* if (this.simboloAtual() === '=') {
+                    this.adicionarSimbolo(tiposDeSimbolos.MAIS_IGUAL);
+                    this.avancar();
+                } else if (this.simboloAtual() === '+') {
+                    this.adicionarSimbolo(tiposDeSimbolos.INCREMENTAR);
+                    this.avancar();
+                } else {
+                    this.adicionarSimbolo(tiposDeSimbolos.ADICAO);
+                } */
+
+                break;
+
+            case '*':
+                this.inicioSimbolo = this.atual;
+                this.avancar();
+                this.adicionarSimbolo(tiposDeSimbolos.MULTIPLICACAO);
+                /* switch (this.simboloAtual()) {
+                    case '=':
+                        this.avancar();
+                        this.adicionarSimbolo(tiposDeSimbolos.MULTIPLICACAO_IGUAL);
+                        break;
+                    default:
+                        this.adicionarSimbolo(tiposDeSimbolos.MULTIPLICACAO);
+                        break;
+                } */
+                break;
+            case '=':
+                this.avancar();
+                this.adicionarSimbolo(tiposDeSimbolos.IGUAL);
+                /* if (this.simboloAtual() === '=') {
+                    this.adicionarSimbolo(tiposDeSimbolos.IGUAL_IGUAL);
+                    this.avancar();
+                } else {
+                    this.adicionarSimbolo(tiposDeSimbolos.IGUAL);
+                } */
+
+                break;
+
+            /* case '&':
+                this.adicionarSimbolo(tiposDeSimbolos.BIT_AND);
+                this.avancar();
+                break;
+
+            case '~':
+                this.adicionarSimbolo(tiposDeSimbolos.BIT_NOT);
+                this.avancar();
+                break;
+
+            case '|':
+                this.adicionarSimbolo(tiposDeSimbolos.BIT_OR);
+                this.avancar();
+                break;
+
+            case '^':
+                this.adicionarSimbolo(tiposDeSimbolos.BIT_XOR);
+                this.avancar();
+                break; */
+
+            case '<':
+                this.avancar();
+                if (this.simboloAtual() === '=') {
+                    this.adicionarSimbolo(tiposDeSimbolos.MENOR_IGUAL);
+                    this.avancar();
+                } else {
+                    this.adicionarSimbolo(tiposDeSimbolos.MENOR);
+                }
+                break;
+
+            case '>':
+                this.avancar();
+                if (this.simboloAtual() === '=') {
+                    this.adicionarSimbolo(tiposDeSimbolos.MAIOR_IGUAL);
+                    this.avancar();
+                } else {
+                    this.adicionarSimbolo(tiposDeSimbolos.MAIOR);
+                }
+                break;
+
+            case '/':
+                this.avancar();
+                /* switch (this.simboloAtual()) {
+                    case '/':
+                        this.avancarParaProximaLinha();
+                        break;
+                    case '*':
+                        this.encontrarFimComentarioAsterisco();
+                        break;
+                    case '=':
+                        this.adicionarSimbolo(tiposDeSimbolos.DIVISAO_IGUAL);
+                        this.avancar();s
+                        break;
+                    default:
+                        this.adicionarSimbolo(tiposDeSimbolos.DIVISAO);
+                        break;
+                } */
+
+                break;
+
+            // Esta sessão ignora espaços em branco na tokenização.
+            // Ponto-e-vírgula é opcional em Delégua, então pode apenas ser ignorado.
+            case ' ':
+            case '\0':
+            case '\r':
+            case '\t':
+            case ';':
+                this.avancar();
+                break;
+
+            case '"':
+                this.avancar();
+                this.analisarTexto();
+                this.avancar();
+                break;
+
+            case "'":
+                this.avancar();
+                this.analisarCaracter();
+                this.avancar();
+                break;
+
+            default:
+                if (this.eDigito(caractere)) this.analisarNumero();
+                else if (this.eAlfabeto(caractere)) this.identificarPalavraChave();
+                else {
+                    this.erros.push({
+                        linha: this.linha + 1,
+                        caractere: caractere,
+                        mensagem: 'Caractere inesperado.',
+                    } as ErroLexador);
+                    this.avancar();
+                }
+        }
+    }
+
+    mapear(codigo: string[], hashArquivo: number): RetornoLexador {
+        this.erros = [];
+        this.simbolos = [];
+        this.inicioSimbolo = 0;
+        this.atual = 0;
+        this.linha = 0;
+
+        this.codigo = codigo.join('\n') || '';
+        this.hashArquivo = hashArquivo;
+
+        while (!this.eFinalDoCodigo()) {
+            this.inicioSimbolo = this.atual;
+            this.analisarToken();
+        }
+
+        return {
+            simbolos: this.simbolos,
+            erros: this.erros,
+        } as RetornoLexador;
+    }
+}
\ No newline at end of file
diff --git a/fontes/lexador/dialetos/palavras-reservadas/index.ts b/fontes/lexador/dialetos/palavras-reservadas/index.ts
index fd01421c..678ecf46 100644
--- a/fontes/lexador/dialetos/palavras-reservadas/index.ts
+++ b/fontes/lexador/dialetos/palavras-reservadas/index.ts
@@ -1,3 +1,3 @@
-export * from './birl';
-export * from './portugol-studio';
-export * from './visualg';
+export { palavrasReservadas as palavrasReservadasBirl } from './birl';
+export { palavrasReservadas as palavrasReservadasPortugolStudio } from './portugol-studio';
+export { palavrasReservadas as palavrasReservadasVisuAlg } from './visualg';
diff --git a/fontes/lexador/dialetos/palavras-reservadas/potigol.ts b/fontes/lexador/dialetos/palavras-reservadas/potigol.ts
new file mode 100644
index 00000000..f3f4ab44
--- /dev/null
+++ b/fontes/lexador/dialetos/palavras-reservadas/potigol.ts
@@ -0,0 +1,12 @@
+import tiposDeSimbolos from '../../../tipos-de-simbolos/potigol';
+
+export const palavrasReservadas = {
+    caractere: tiposDeSimbolos.CARACTERE,
+    escreva: tiposDeSimbolos.ESCREVA,
+    imprima: tiposDeSimbolos.IMPRIMA,
+    inteiro: tiposDeSimbolos.INTEIRO,
+    logico: tiposDeSimbolos.LOGICO,
+    não: tiposDeSimbolos.NAO,
+    real: tiposDeSimbolos.REAL,
+    texto: tiposDeSimbolos.TEXTO
+}
\ No newline at end of file
diff --git a/fontes/tipos-de-simbolos/potigol.ts b/fontes/tipos-de-simbolos/potigol.ts
new file mode 100644
index 00000000..b76a4c93
--- /dev/null
+++ b/fontes/tipos-de-simbolos/potigol.ts
@@ -0,0 +1,26 @@
+export default {
+    ADICAO: 'ADICAO',
+    CARACTERE: 'CARACTERE',
+    COLCHETE_ESQUERDO: 'COLCHETE_ESQUERDO',
+    COLCHETE_DIREITO: 'COLCHETE_DIREITO',
+    DIVISAO: 'DIVISAO',
+    PARENTESE_ESQUERDO: 'PARENTESE_ESQUERDO',
+    PARENTESE_DIREITO: 'PARENTESE_DIREITO',
+    ESCREVA: 'ESCREVA',
+    IDENTIFICADOR: 'IDENTIFICADOR',
+    IGUAL: 'IGUAL',
+    IMPRIMA: 'IMPRIMA',
+    INTEIRO: 'INTEIRO',
+    LOGICO: 'LOGICO',
+    MAIOR: 'MAIOR',
+    MAIOR_IGUAL: 'MAIOR_IGUAL',
+    MENOR: 'MENOR',
+    MENOR_IGUAL: 'MENOR_IGUAL',
+    MULTIPLICACAO: 'MULTIPLICACAO',
+    NAO: 'NAO',
+    PONTO: 'PONTO',
+    REAL: 'REAL',
+    SUBTRACAO: 'SUBTRACAO',
+    TEXTO: 'TEXTO',
+    VIRGULA: 'VIRGULA'
+}
\ No newline at end of file


Test patch:
diff --git a/testes/portugol-ipt/interpretador.test.ts b/testes/portugol-ipt/interpretador.test.ts
index 52eb917e..391e2e50 100644
--- a/testes/portugol-ipt/interpretador.test.ts
+++ b/testes/portugol-ipt/interpretador.test.ts
@@ -16,7 +16,7 @@ describe('Interpretador', () => {
                 interpretador = new InterpretadorPortugolIpt(process.cwd());
             });
 
-            it.skip('Trivial', async () => {
+            it('Trivial', async () => {
                 const retornoLexador = lexador.mapear([
                     'inicio',
                     'escrever "Olá mundo"',
diff --git a/testes/portugol-studio/lexador.test.ts b/testes/portugol-studio/lexador.test.ts
index a719ee9e..0f964594 100644
--- a/testes/portugol-studio/lexador.test.ts
+++ b/testes/portugol-studio/lexador.test.ts
@@ -61,7 +61,7 @@ describe('Lexador (Portugol Studio)', () => {
                 ], -1);
 
                 expect(resultado).toBeTruthy();
-                expect(resultado.simbolos).toHaveLength(16);
+                expect(resultado.simbolos).toHaveLength(15);
             });
 
             it('Operação matematica - multiplicação', () => {
diff --git a/testes/potigol/avaliador-sintatico.test.ts b/testes/potigol/avaliador-sintatico.test.ts
new file mode 100644
index 00000000..9bc51841
--- /dev/null
+++ b/testes/potigol/avaliador-sintatico.test.ts
@@ -0,0 +1,35 @@
+import { LexadorPotigol } from "../../fontes/lexador/dialetos";
+import { AvaliadorSintaticoPotigol } from "../../fontes/avaliador-sintatico/dialetos";
+
+describe('Avaliador sintático', () => {
+    describe('analisar()', () => {
+        let lexador = new LexadorPotigol();
+        let avaliadorSintatico = new AvaliadorSintaticoPotigol();
+
+        describe('Cenários de sucesso', () => {
+            it('Sucesso - Escreva Olá Mundo', () => {
+                const retornoLexador = lexador.mapear(['escreva "Olá mundo"'], -1);
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+    
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
+            });
+
+            it('Sucesso - Imprima Olá Mundo', () => {
+                const retornoLexador = lexador.mapear(['imprima "Olá mundo"'], -1);
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+    
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
+            });
+
+            it('Sucesso - 2 + 2', () => {
+                const retornoLexador = lexador.mapear(['escreva 2 + 2'], -1);
+                const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+    
+                expect(retornoAvaliadorSintatico).toBeTruthy();
+                expect(retornoAvaliadorSintatico.declaracoes).toHaveLength(1);
+            });
+        });
+    });
+});
diff --git a/testes/potigol/interpretador.test.ts b/testes/potigol/interpretador.test.ts
new file mode 100644
index 00000000..2947307e
--- /dev/null
+++ b/testes/potigol/interpretador.test.ts
@@ -0,0 +1,28 @@
+import { AvaliadorSintaticoPotigol } from "../../fontes/avaliador-sintatico/dialetos";
+import { InterpretadorBase } from "../../fontes/interpretador";
+import { LexadorPotigol } from "../../fontes/lexador/dialetos";
+
+describe('Interpretador', () => {
+    describe('interpretar()', () => {
+        let lexador: LexadorPotigol;
+        let avaliadorSintatico: AvaliadorSintaticoPotigol;
+        let interpretador: InterpretadorBase;
+
+        beforeEach(() => {
+            lexador = new LexadorPotigol();
+            avaliadorSintatico = new AvaliadorSintaticoPotigol();
+            interpretador = new InterpretadorBase(process.cwd());
+        });
+
+        it('Trivial', async () => {
+            const retornoLexador = lexador.mapear([
+                'escreva "Olá mundo"'
+            ], -1);
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+            expect(retornoInterpretador.erros).toHaveLength(0);
+        });
+    });
+});
diff --git a/testes/potigol/lexador.test.ts b/testes/potigol/lexador.test.ts
new file mode 100644
index 00000000..94082536
--- /dev/null
+++ b/testes/potigol/lexador.test.ts
@@ -0,0 +1,29 @@
+import { LexadorPotigol } from "../../fontes/lexador/dialetos";
+
+describe('Lexador (Potigol)', () => {
+    describe('mapear()', () => {
+        let lexador: LexadorPotigol;
+
+        beforeEach(() => {
+            lexador = new LexadorPotigol();
+        });
+
+        describe('Cenário de sucesso', () => {
+            it('Arquivo vazio.', () => {
+                const resultado = lexador.mapear([''], -1);
+
+                expect(resultado).toBeTruthy();
+                expect(resultado.simbolos).toHaveLength(0);
+            });
+
+            it('Olá mundo', () => {
+                const resultado = lexador.mapear([
+                    'escreva "Olá Mundo"'
+                ], -1);
+
+                expect(resultado).toBeTruthy();
+                expect(resultado.simbolos).toHaveLength(2);
+            });
+        });
+    });
+});