Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduzindo o gerador de expressões para Delégua. #29

Merged
merged 1 commit into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions infraestrutura/resposta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { DefinirValor, FuncaoConstruto, Isto, Literal, Variavel } from '@designl
import { Expressao, Retorna } from '@designliquido/delegua/fontes/declaracoes';
import { DeleguaClasse, DeleguaFuncao } from '@designliquido/delegua/fontes/estruturas';
import { ParametroInterface } from '@designliquido/delegua/fontes/interfaces';
import { GeradorExpressoes } from './utilidades/gerador-expressoes';

/**
* A classe de Resposta é usada por Delégua para instrumentação do Express.
Expand All @@ -12,6 +13,22 @@ import { ParametroInterface } from '@designliquido/delegua/fontes/interfaces';
export class Resposta extends DeleguaClasse {
constructor() {
const metodos = {};

// Todo @Italo: Verificar se isso é melhor para instrumentar métodos.
leonelsanchesdasilva marked this conversation as resolved.
Show resolved Hide resolved
/* const geradorExpressoes = new GeradorExpressoes();
metodos['enviar'] = geradorExpressoes.gerarMetodo('enviar',
geradorExpressoes.gerarDeclaracao(
[geradorExpressoes.gerarParametro('mensagem', 'numero')],
[
geradorExpressoes.gerarAtribuicaoValorEmPropriedadeClasse(
'mensagem',
geradorExpressoes.gerarReferenciaVariavel('mensagem')
),
geradorExpressoes.gerarRetornoDeFuncao('isto')
]
)
); */

metodos['enviar'] = new DeleguaFuncao(
'enviar',
new FuncaoConstruto(
Expand Down
57 changes: 57 additions & 0 deletions infraestrutura/utilidades/gerador-expressoes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { DeleguaFuncao } from '@designliquido/delegua/fontes/estruturas';
import { DefinirValor, FuncaoConstruto, Isto, Construto, Variavel } from '@designliquido/delegua/fontes/construtos';
import { ParametroInterface } from '@designliquido/delegua/fontes/interfaces';
import { Simbolo } from '@designliquido/delegua/fontes/lexador';
import { Expressao, Retorna, Declaracao } from '@designliquido/delegua/fontes/declaracoes';

/**
* O gerador de expressões é uma classe facilitadora para a criação de
* objetos que normalmente são criados pelo Avaliador Sintático de
* Delégua.
*/
export class GeradorExpressoes {

gerarMetodo(nomeMetodo: string, declaracao: FuncaoConstruto): DeleguaFuncao {
return new DeleguaFuncao(nomeMetodo, declaracao, null, false);
}

gerarDeclaracao(parametros: ParametroInterface[], corpo: Declaracao[]): FuncaoConstruto {
return new FuncaoConstruto(-1, -1, parametros, corpo);
}

gerarParametro(nome: string, tipo: string): ParametroInterface {
return {
abrangencia: 'padrao',
tipo: tipo,
nome: new Simbolo('IDENTIFICADOR', nome, null, -1, -1)
} as ParametroInterface;
}

gerarReferenciaVariavel(nomeVariavel: string) {
return new Variavel(-1, new Simbolo('IDENTIFICADOR', nomeVariavel, null, -1, -1))
}

/**
* Gera uma atribuição de valor em uma propriedade de classe.
* Por exemplo, `isto.a = 1` seria algo como
* `gerarAtribuicaoValorEmPropriedadeClasse('a', 1)`.
*/
gerarAtribuicaoValorEmPropriedadeClasse(nomePropriedade: string, valor: Construto): Expressao {
return new Expressao(
new DefinirValor(
-1,
-1,
new Isto(-1, -1, new Simbolo('ISTO', 'isto', null, -1, -1)),
new Simbolo('IDENTIFICADOR', nomePropriedade, null, -1, -1),
valor
)
);
}

gerarRetornoDeFuncao(nomeVariavel: string): Retorna {
return new Retorna(
new Simbolo('IDENTIFICADOR', 'qualquerCoisa', null, -1, -1),
new Variavel(-1, new Simbolo('IDENTIFICADOR', nomeVariavel, null, -1, -1))
)
}
}
Loading