Repository: DesignLiquido/delegua
Pull request #488 (2023-09-05 01:19:48)

Tradutor x64
- [x] Implementando sintaxe simples para escreva com string literal.


Patch:
diff --git a/.vscode/launch.json b/.vscode/launch.json
index c57b2fe9..9102e6ef 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -358,7 +358,10 @@
             ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
-            "args": ["${workspaceFolder}${pathSeparator}execucao.ts", "./exemplos/fila-estatica.delegua"],
+            "args": [
+                "${workspaceFolder}${pathSeparator}execucao.ts",
+                "./exemplos/fila-estatica.delegua"
+            ],
             "runtimeExecutable": "node",
             "runtimeArgs": [
                 "--nolazy",
@@ -485,7 +488,10 @@
             ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
-            "args": ["${workspaceFolder}${pathSeparator}execucao.ts", "./exemplos/leia.delegua"],
+            "args": [
+                "${workspaceFolder}${pathSeparator}execucao.ts",
+                "./exemplos/leia.delegua"
+            ],
             "runtimeExecutable": "node",
             "runtimeArgs": [
                 "--nolazy",
@@ -524,7 +530,11 @@
             ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
-            "args": ["${workspaceFolder}${pathSeparator}execucao.ts", "--codigo", "escreva(2+1)"],
+            "args": [
+                "${workspaceFolder}${pathSeparator}execucao.ts",
+                "--codigo",
+                "escreva(2+1)"
+            ],
             "runtimeExecutable": "node",
             "runtimeArgs": [
                 "--nolazy",
@@ -542,7 +552,10 @@
             ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
-            "args": ["${workspaceFolder}${pathSeparator}execucao.ts", "./exemplos/perceptron.delegua"],
+            "args": [
+                "${workspaceFolder}${pathSeparator}execucao.ts",
+                "./exemplos/perceptron.delegua"
+            ],
             "runtimeExecutable": "node",
             "runtimeArgs": [
                 "--nolazy",
@@ -560,7 +573,10 @@
             ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
-            "args": ["${workspaceFolder}${pathSeparator}execucao.ts", "./exemplos/primitivas/texto/minusculo.delegua"],
+            "args": [
+                "${workspaceFolder}${pathSeparator}execucao.ts",
+                "./exemplos/primitivas/texto/minusculo.delegua"
+            ],
             "runtimeExecutable": "node",
             "runtimeArgs": [
                 "--nolazy",
@@ -599,7 +615,10 @@
             ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
-            "args": ["${workspaceFolder}${pathSeparator}execucao.ts", "./exemplos/classes/teste-classe.delegua"],
+            "args": [
+                "${workspaceFolder}${pathSeparator}execucao.ts",
+                "./exemplos/classes/teste-classe.delegua"
+            ],
             "runtimeExecutable": "node",
             "runtimeArgs": [
                 "--nolazy",
@@ -639,7 +658,10 @@
                 "birl/interpretador",
                 "--runInBand"
             ],
-            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "skipFiles": [
+                "<node_internals>/**",
+                "node_modules/**"
+            ],
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
         },
@@ -654,7 +676,10 @@
                 "interpretador",
                 "--runInBand"
             ],
-            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "skipFiles": [
+                "<node_internals>/**",
+                "node_modules/**"
+            ],
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
         },
@@ -668,7 +693,10 @@
                 "mapler",
                 "--runInBand"
             ],
-            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "skipFiles": [
+                "<node_internals>/**",
+                "node_modules/**"
+            ],
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
         },
@@ -682,7 +710,10 @@
                 "pitugues/interpretador",
                 "--runInBand"
             ],
-            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "skipFiles": [
+                "<node_internals>/**",
+                "node_modules/**"
+            ],
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
         },
@@ -747,7 +778,10 @@
                 "visualg",
                 "--runInBand"
             ],
-            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "skipFiles": [
+                "<node_internals>/**",
+                "node_modules/**"
+            ],
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
         },
@@ -1114,7 +1148,12 @@
             ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
-            "args": ["${workspaceFolder}${pathSeparator}execucao.ts", "--dialeto", "egua", "./exemplos/testes.egua"],
+            "args": [
+                "${workspaceFolder}${pathSeparator}execucao.ts",
+                "--dialeto",
+                "egua",
+                "./exemplos/testes.egua"
+            ],
             "runtimeExecutable": "node",
             "runtimeArgs": [
                 "--nolazy",
@@ -1401,7 +1440,10 @@
             "type": "node",
             "request": "launch",
             "name": "Portugol Studio > Olá Mundo",
-            "skipFiles": ["<node_internals>/**", "node_modules/**"],
+            "skipFiles": [
+                "<node_internals>/**",
+                "node_modules/**"
+            ],
             "cwd": "${workspaceRoot}",
             "console": "integratedTerminal",
             "args": [
@@ -1411,7 +1453,11 @@
                 "./exemplos/dialetos/portugol-studio/ola-mundo.por"
             ],
             "runtimeExecutable": "node",
-            "runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"]
+            "runtimeArgs": [
+                "--nolazy",
+                "-r",
+                "ts-node/register/transpile-only"
+            ]
         },
         {
             "name": "Tradutor > Delégua para AssemblyScript",
@@ -1425,6 +1471,19 @@
             ],
             "console": "integratedTerminal",
             "internalConsoleOptions": "neverOpen"
+        },
+        {
+            "name": "Tradutor > Delégua para Assembly x64",
+            "type": "node",
+            "request": "launch",
+            "runtimeArgs": [
+                "--inspect-brk",
+                "${workspaceRoot}/node_modules/jest/bin/jest.js",
+                "tradutores/tradutor-assembly-x64.test.ts",
+                "--runInBand"
+            ],
+            "console": "integratedTerminal",
+            "internalConsoleOptions": "neverOpen"
         }
     ]
-}
+}
\ No newline at end of file
diff --git a/fontes/tradutores/tradutor-assembly-x64.ts b/fontes/tradutores/tradutor-assembly-x64.ts
new file mode 100644
index 00000000..149563fe
--- /dev/null
+++ b/fontes/tradutores/tradutor-assembly-x64.ts
@@ -0,0 +1,154 @@
+import { Literal } from '../construtos';
+import { Classe, Declaracao, Escreva } from '../declaracoes';
+
+export class TradutorAssemblyX64 {
+    indentacao: number = 0;
+    declaracoesDeClasses: Classe[];
+
+    bss = 'section .bss\n';
+    data = 'section .data\n';
+    text = `
+section .text
+    global _start
+
+_start:`;
+
+    gerarDigitoAleatorio(): string {
+        let result = '';
+        const digits = '0123456789';
+
+        for (let i = 0; i < 5; i++) {
+            const randomIndex = Math.floor(Math.random() * digits.length);
+            result += digits.charAt(randomIndex);
+        }
+
+        return result;
+    }
+
+    dicionarioConstrutos = {
+        // AcessoIndiceVariavel: this.traduzirAcessoIndiceVariavel.bind(this),
+        // AcessoMetodo: this.trazudirConstrutoAcessoMetodo.bind(this),
+        // Agrupamento: this.traduzirConstrutoAgrupamento.bind(this),
+        // AtribuicaoPorIndice: this.traduzirConstrutoAtribuicaoPorIndice.bind(this),
+        // Atribuir: this.traduzirConstrutoAtribuir.bind(this),
+        // Binario: this.traduzirConstrutoBinario.bind(this),
+        // Chamada: this.traduzirConstrutoChamada.bind(this),
+        // DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
+        // FuncaoConstruto: this.traduzirFuncaoConstruto.bind(this),
+        // Isto: () => 'this',
+        // Literal: this.traduzirConstrutoLiteral.bind(this),
+        // Logico: this.traduzirConstrutoLogico.bind(this),
+        // TipoDe: this.traduzirConstrutoTipoDe.bind(this),
+        // Unario: this.traduzirConstrutoUnario.bind(this),
+        // Variavel: this.traduzirConstrutoVariavel.bind(this),
+        // Vetor: this.traduzirConstrutoVetor.bind(this),
+    };
+
+    dicionarioDeclaracoes = {
+        // Bloco: this.traduzirDeclaracaoBloco.bind(this),
+        // Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
+        // Continua: () => 'continue',
+        // Escolha: this.traduzirDeclaracaoEscolha.bind(this),
+        // Expressao: this.traduzirDeclaracaoExpressao.bind(this),
+        // Fazer: this.traduzirDeclaracaoFazer.bind(this),
+        // Falhar: this.traduzirDeclaracaoFalhar.bind(this),
+        // FuncaoDeclaracao: this.traduzirDeclaracaoFuncao.bind(this),
+        // Importar: this.traduzirDeclaracaoImportar.bind(this),
+        // Leia: this.traduzirDeclaracaoLeia.bind(this),
+        // Para: this.traduzirDeclaracaoPara.bind(this),
+        // ParaCada: this.traduzirDeclaracaoParaCada.bind(this),
+        // Retorna: this.traduzirDeclaracaoRetorna.bind(this),
+        // Se: this.traduzirDeclaracaoSe.bind(this),
+        // Sustar: () => 'break',
+        // Classe: this.traduzirDeclaracaoClasse.bind(this),
+        // Tente: this.traduzirDeclaracaoTente.bind(this),
+        // Const: this.traduzirDeclaracaoConst.bind(this),
+        // Var: this.traduzirDeclaracaoVar.bind(this),
+        Escreva: this.traduzirDeclaracaoEscreva.bind(this),
+    };
+    // traduzirAcessoIndiceVariavel(): void {}
+    // trazudirConstrutoAcessoMetodo(): void {}
+    // traduzirConstrutoAgrupamento(): void {}
+    // traduzirConstrutoAtribuicaoPorIndice(): void {}
+    // traduzirConstrutoAtribuir(): void {}
+    // traduzirConstrutoBinario(): void {}
+    // traduzirConstrutoChamada(): void {}
+    // traduzirConstrutoDefinirValor(): void {}
+    // traduzirFuncaoConstruto(): void {}
+    // traduzirConstrutoLiteral(): void {}
+    // traduzirConstrutoLogico(): void {}
+    // traduzirConstrutoTipoDe(): void {}
+    // traduzirConstrutoUnario(): void {}
+    // traduzirConstrutoVariavel(): void {}
+    // traduzirConstrutoVetor(): void {}
+    // traduzirDeclaracaoBloco(): void {}
+    // traduzirDeclaracaoEnquanto(): void {}
+    // traduzirDeclaracaoEscolha(): void {}
+    // traduzirDeclaracaoExpressao(): void {}
+    // traduzirDeclaracaoFazer(): void {}
+    // traduzirDeclaracaoFalhar(): void {}
+    // traduzirDeclaracaoFuncao(): void {}
+    // traduzirDeclaracaoImportar(): void {}
+    // traduzirDeclaracaoLeia(): void {}
+    // traduzirDeclaracaoPara(): void {}
+    // traduzirDeclaracaoParaCada(): void {}
+    // traduzirDeclaracaoRetorna(): void {}
+    // traduzirDeclaracaoSe(): void {}
+    // traduzirDeclaracaoClasse(): void {}
+    // traduzirDeclaracaoTente(): void {}
+    // traduzirDeclaracaoConst(): void {}
+    // traduzirDeclaracaoVar(): void {}
+
+    criaStringLiteral(literal: Literal): string {
+        const varLiteral = `Delegua_${this.gerarDigitoAleatorio()}`;
+        this.data += `    ${varLiteral} db '${literal.valor}', 0\n`;
+        return varLiteral;
+    }
+
+    criaTamanhoNaMemoriaReferenteAVar(nomeStringLiteral: string): string {
+        const varTamanho = `tam_${nomeStringLiteral}`;
+        this.data += `    ${varTamanho} equ $ - ${nomeStringLiteral}`;
+        return varTamanho;
+    }
+
+    traduzirDeclaracaoEscreva(declaracaoEscreva: Escreva): void {
+        let tam_string_literal = '';
+        let nome_string_literal = '';
+
+        if (declaracaoEscreva.argumentos[0] instanceof Literal) {
+            nome_string_literal = this.criaStringLiteral(declaracaoEscreva.argumentos[0]);
+            tam_string_literal = this.criaTamanhoNaMemoriaReferenteAVar(nome_string_literal);
+        }
+
+        this.text += `
+    mov edx, ${tam_string_literal}
+    mov ecx, ${nome_string_literal}
+    mov ebx, 1
+    mov eax, 4
+    int 0x80
+        `;
+    }
+
+    saida_sistema(): void {
+        this.text += `
+    mov eax, 1
+    int 0x80
+        `;
+    }
+
+    traduzir(declaracoes: Declaracao[]): string {
+        let resultado = '';
+        this.declaracoesDeClasses = declaracoes.filter((declaracao) => declaracao instanceof Classe) as Classe[];
+
+        for (const declaracao of declaracoes) {
+            `${this.dicionarioDeclaracoes[declaracao.constructor.name](declaracao)} \n`;
+        }
+        this.saida_sistema();
+
+        resultado += this.bss + '\n' + this.data + '\n' + this.text;
+
+        console.log(resultado);
+
+        return resultado;
+    }
+}


Test patch:
diff --git a/testes/tradutores/tradutor-assembly-x64.test.ts b/testes/tradutores/tradutor-assembly-x64.test.ts
new file mode 100644
index 00000000..07cb60c9
--- /dev/null
+++ b/testes/tradutores/tradutor-assembly-x64.test.ts
@@ -0,0 +1,31 @@
+import { AvaliadorSintatico } from "../../fontes/avaliador-sintatico";
+import { Lexador } from "../../fontes/lexador";
+import { TradutorAssemblyX64 } from '../../fontes/tradutores/tradutor-assembly-x64';
+
+describe('Tradutor Delégua -> AssemblyX64', () => {
+    const tradutor: TradutorAssemblyX64 = new TradutorAssemblyX64();
+
+    describe('Codigo', () => {
+        let lexador: Lexador;
+        let avaliadorSintatico: AvaliadorSintatico;
+
+        beforeEach(() => {
+            lexador = new Lexador();
+            avaliadorSintatico = new AvaliadorSintatico()
+        })
+
+        it('escreva -> saida padrão', () => {
+            const retornoLexador = lexador.mapear([
+                'escreva("Olá, mundo!")',
+            ], -1)
+
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, 1)
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes)
+
+            expect(resultado).toBeTruthy();
+
+        })
+
+    })
+})
\ No newline at end of file