segunda-feira, 25 de setembro de 2017

Construindo um PARSER em javascript - VII - Código

Neste post apresentaremos e explicaremos a função mestra de nosso Parser, a função solvExpression.

Objetivo da função

O objetivo de solvExpression é scanear a expressão aritmética, com níveis de parênteses, achando, a cada passada, o parênteses mais interno e resolvendo a expressão aritmética no interior dele. Este procedimento será repetido até o fim das operações aritméticas disponíveis.

Variáveis locais necessárias

Uma série de variáveis de apoio são necessárias para o processamento dos níveis de parênteses, por esta função:

function solvExpression(Expressao){
// Variáveis iniciais
var Resultado = 0;
var OPERATOR;
var posExp_ant = 999999;
var posIni = 0;
var posFim = 0;
var ExpressaoTemp = "";
var Tam = 0;
var Temp;
var LadoEsq,LadoDir;
// Operador de parênteses
OPERATOR = ")";
aindaTem = (0==0);

Resultado - Nossa conhecida variável que armazena os resultados das operações aos pares de operandos;
OPERATOR - Armazena o operador aritmético da vez, ou parênteses;
posExp_ant - Armazena a posição onde o operador anterior está. Começa com um valor bem alto;
posIni - Posição inicial na expressão de um fragmento;
posFim - Posição final na expressão de um fragmento;
ExpressãoTemp - armazena a expressão temporária para análise;
Tam - Tamanho da Expressão;
Temp - Variável temporária;
LadoEsq e LadoDir - Fragmentos à esquerda e à direita de uma expressão;
aindaTem - Flag booleana que armazena a condição de continuidade de algum processo;

Loop operacional

A busca por níveis de parênteses é contínua, até que se esgote por completo:

while ( aindaTem ){
posExp = findCloseBrace(Expressao);
if( posExp >= 0 ){
VARIABLES = [];
textoConv = "";
ind = 0;
posFim = findCloseBrace(Expressao);
posIni = findOpenBrace(posFim,Expressao);
ExpressaoTemp = Expressao.substr(posIni+1,posFim-posIni-1);
Temp = equate(ExpressaoTemp);
LadoEsq = left(Expressao,posIni);
LadoDir = Expressao.substr(posFim+1,9999);
Expressao =  LadoEsq +VARIABLES["v01"]+ LadoDir;
} else {
aindaTem = (0==1);
}
}

Em nossas explicações, dissemos que os níveis de parênteses são facilmente identificados pelo operador ")" (fecha parênteses), e não pelo abre-parênteses, como os obsessivos do Parse à esquerda poderiam esperar. Por esta razão, a primeira função a ser chamada neste loop é findCloseBrace:

// Acha um FECHA PARENTESES
function findCloseBrace(texto){
var posicao = findOperator(")", texto);
return posicao;
}

Esta função chama a função mais básica findOperator, que utiliza o método indexOf do objeto string para achar o fecha-parênteses.

Procedimentos pós-loop

Ao fim do loop de parênteses, é necessário tomar algumas providências, pois resta uma expressão sem níveis de parênteses a interpretar:

VARIABLES = [];
textoConv = "";
ind = 0;
Temp = equate(Expressao);
return VARIABLES["v01"];

:A função equate fará a última avaliação de expressão, e o resultado final será devolvido no item cujo índice é "v01".

Conclusão

O último nível aqui apresentado do Parser é o primeiro nível em ordem de execução, que chama os demais.

Neste post apresentamos o código completo.


Nenhum comentário:

Postar um comentário