Linguagem Cálculo - Vitor-Xavier/Antlr4Exemplo GitHub Wiki

Linguagem Cálculo

Introdução

A linguagem do cálculo do Sistema Tributário foi arquitetada para auxiliar a computação de valores de tributos e taxas através da utilização da ferramenta ANTLR4, provendo funções e recursos específicos para facilitar o acesso a dados, em português e de forma simplificada.

Pela estrutura definida, todas as fórmulas devem se encerrar com uma instrução retorno, e é possível declarar variáveis locais através da instrução var, sem a necessidade de definir um tipo, porém a declaração de listas se dá pelo uso da instrução lista, além de instruções lógicas e de repetição e as funções definidas na linguagem presentes neste documento.

O acesso a registros no banco de dados do Sistema Tributário, se decorre através do uso do caractere '@' seguido do nome da tabela, e então o caractere '.', e em seguida o nome da coluna, estrutura essa que pode sofrer alterações conforme o tipo de acesso realizado, representado no item de constantes de suporte.

Exemplo de estrutura simples de uma fórmula na linguagem de cálculo, utilizando comentários, variáveis locais, constantes de suporte, e uma estrutura lógica, além da instrução retorno, obrigatória:

// Definição de tamanho máximo
var tamanhoMaximo = 100.5;
var resultado = 0;

// Verificação de tamanho máximo para aplicar ao resultado
se (@Fisico.AreaTerreno == tamanhoMaximo) {
    resultado = 3.5;
} senao {
    resultado = 3.0;
}
retorno resultado;

Palavras-chave

Instrução Caso

A instrução caso é utilizada exclusivamente dentro do bloco de uma instrução parametro, para informações sobre instrução parâmetro na seção de Palavras-chave.

Cada instrução caso especifica um padrão a ser comparado com a expressão do parametro. Se houver correspondência, o bloco de código equivalente ao primeiro caso correspondente. Se nenhuma correspondência de caso for encontrada, o bloco de código da instrução padrao será executado, caso existir. No exemplo abaixo, como nenhum dos casos definidos no parametro existe correspondência, o bloco da instrução padrao será executado. No exemplo a seguir o valor da variável numero é comparado aos valores 1, 2 e 3 definidos nas instruções caso, e ao atingir o valor correspondente executa o bloco de código equivalente e então o comando parar para terminar as comparações da instrução parametro.

var numero = 2;
var resultado = 0;
parametro (numero) {
    caso 1: {
        resultado = 0.1;
        parar;
    }
    caso 2: {
        resultado = 0.25;
        parar;
    }
    caso 3: {
        resultado = 0.375;
        parar;
    }
    padrao: {
        resultado = 0.05;
    }
}
retorno resultado;

Instrução Enquanto

A instrução enquanto executa uma instrução ou um bloco de instruções enquanto a expressão especificada é avaliada como verdadeiro. Como essa expressão é avaliada antes de cada execução do laço de repetição, uma instrução enquanto é executado zero ou mais vezes.

É possível sair de uma instrução enquanto, utilizando a palavra-chave parar, ou quando a condição especificada ser avaliada como falso.

No exemplo a seguir é exibido o funcionamento de uma instrução enquanto.

var contador = 0;
enquanto (contador < 3) {
    contador += 1;
}
retorno contador;

Instrução Padrão

A instrução padrao é utilizada exclusivamente dentro do bloco de uma instrução parametro, para informações sobre instrução parâmetro na seção de Palavras-chave.

Uma instrução padrao especifica a seção parametro a ser executada se a expressão de correspondência não corresponder a nenhum outro caso especificado. Se um padrao não estiver presente e a expressão de correspondência não corresponder a nenhum outro caso, nenhum bloco da expressão parametro sera executado. No exemplo a seguir, como não há correspondência entre a expressão de parametro e os valores definidos nos casos de comparação, o trecho de código da instrução padrao será executado.

var numero = 0;
var resultado = 0;
parametro (numero) {
    caso 1: {
        resultado = 0.1;
        parar;
    }
    caso 2: {
        resultado = 0.25;
        parar;
    }
    caso 3: {
        resultado = 0.375;
        parar;
    }
    padrao: {
        resultado = 0.05;
    }
}
retorno resultado;

Instrução Parâmetro

Uma instrução parametro inclui um ou mais casos para comparação. Cada seção parametro contém uma ou mais instruções caso, e uma ou nenhuma instrução padrao seguidos por um bloco de uma ou mais instruções. Em uma instrução parametro pode conter qualquer quantidade de casos, no entanto dois casos não podem conter a mesma expressão. No exemplo abaixo a única correspondência ocorre no terceiro caso, e a variável resultado recebe o valor 0.375.

var numero = 3;
var resultado = 0;
parametro (numero) {
    caso 1: {
        resultado = 0.1;
        parar;
    }
    caso 2: {
        resultado = 0.25;
        parar;
    }
    caso 3: {
        resultado = 0.375;
        parar;
    }
}
retorno resultado;

Instrução Parar

A instrução parar termina o laço de repetição enquanto, e também a execução de blocos de código referentes a instruções se, senao e parametro, dentro do bloco de código de um caso. No exemplo abaixo a instrução parar interrompe a execução de enquanto quando a condição é avaliada para verdadeiro.

var i = 0;
enquanto (i < 4) {
    se (i == 2) {
        parar;
    }
    i += 1;
}
retorno i;

Instrução Retorno

A instrução retorno finaliza a execução de uma fórmula, assim sinalizando o término do bloco de código a ser executado e opcionalmente pode informar um valor a ser armazenado dentre os resultados das fórmulas conforme o roteiro a qual se enquadra. No exemplo a seguir é ilustrado o retorno do cálculo de uma variável ao final do bloco de código.

var numero = 0.75;
retorno numero * 100;

Instrução Se

Uma instrução se identifica qual instrução executar com base no valor de uma expressão condicional. No exemplo a seguir, a comparação da variável numero com o valor 0, utilizando a operação de maior que ou igual, resulta em verdadeiro, então a variável resultado recebe o valor 1.5.

var numero = 0;
var resultado = 0;
se (numero >= 0) {
    resultado = 1.5;
}
retorno resultado;

Instrução Se-Senão

Uma instrução senao deve acompanhar uma instrução se, e é executada no caso da condição definida na instrução se for avaliada como falso, como uma condição não pode ser simultaneamente verdadeiro e falso somente um dos blocos de código será executado. No exemplo a seguir a comparação da variável numero com o valor 1, utilizando a operação de maior que ou igual, resulta em falso, então a variável resultado recebe o valor 2, e o bloco de código referente a condição se não será executado.

var numero = 1;
var resultado = 0;
se (numero >= 0) {
    resultado = 1.5;
} senao {
    resultado = 2;
}
retorno resultado;

Instrução Var

A instrução var permite a declaração de variáveis, que são representações de valores, que possuem dois elementos básicos, um identificador e um valor.

Variáveis não possuem um tipo definido, portanto é possível declarar uma variável com um número decimal, e posteriormente atribuir uma data a variável. No exemplo a seguir ilustra a declaração de uma variável, e então a atribuição de outro valor a mesma.

var i = 0;
i = 90.6;
retorno i;

Instrução Lista

A instrução lista permite a declaração de listas, que são representações coleções de valores, que é inicializada vazia reconhecida pelo identificador informado.

lista listaTeste = [];
retorno listaTeste;

Listas possuem uma coleção de objetos, portanto para cada elemento da lista, é possível atribuir um identificador e a ele um valor, conforme posição na lista.

lista listaTeste = [];
listaTeste[0].Teste = 10;
retorno listaTeste[0].Teste;

No exemplo anterior foi declarada uma lista nomeada de listaTeste, e então na posição 0 de listaTeste foi criada a variável Teste contendo o valor 10.

Instrução Nulo

A instrução nulo, representa a ausência de valor, e portanto não pode ser utilizado como identificador.

var teste = nulo;
var valor = 0;
se (teste == nulo) {
    valor = 1;
}
retorno valor;

Operadores

Operadores Aritméticos

Operadores Aritméticos são utilizados para realizar operações matemáticas básicas, tais como adição, subtração, multiplicação e divisão, e produzir resultados numéricos.

Operador de soma +

O operador de soma + calcula a soma dos operandos.

Operador de subtração -

O operador de subtração - subtrai o operando à direita do operando à esquerda.

Operador de multiplicação *

O operador de multiplicação * calcula o produto dos operandos.

Operador de divisão /

O operador de divisão / divide o operando à esquerda pelo operando à direita.

Operadores Boleanos

Operador de negação !

O operador ! calcula a negação lógica de seu operando. Ou seja, ele produz verdadeiro, se o operando for avaliado como falso, e flso, se o operando for avaliado como verdadeiro.

Operador lógico E &&

O operador lógico condicional E &&, computa o E lógico de seus operandos, então o resultado de x && y será verdadeiro se ambos x e y forem avaliados como verdadeiro. Caso contrário, o resultado será falso. Se x for avaliado como falso, y não será avaliado.

Operador lógico OU ||

O operador lógico condicional OU ||, computa o OU lógico de seus operandos, então o resultado de x || y será verdadeiro se x ou y for avaliado como verdadeiro. Caso contrário, o resultado será falso. Se x for avaliado como verdadeiro, y não será avaliado.

Operadores de Comparação

Operador de Igualdade ==

O operador == retornará verdadeiro se o operando à esquerda for igual ao operando à direita, caso contrário, falso.

Operador de Desigualdade !=

O operador != retornará verdadeiro se o operando à esquerda for diferente ao operando à direita, caso contrário, falso.

Operador Maior que >

O operador > retornará verdadeiro se o operando à esquerda for maior que o operando à direita, caso contrário, falso.

Operador Menor que <

O operador < retornará verdadeiro se o operando à esquerda for menor que o operando à direita, caso contrário, falso.

Operador Maior ou igual >=

O operador >= retornará verdadeiro se o operando à esquerda for maior ou igual ao operando à direita, caso contrário, falso.

Operador Menor ou igual <=

O operador <= retornará verdadeiro se o operando à esquerda for menor ou igual ao operando à direita, caso contrário, falso.

Operadores de Atribuição

Operador de atribuição =

O operador = atribui o operando à direita à variável à esquerda.

Operador de atribuição de soma +=

O operador += atribui à variável à esquerda a soma do valor da variável à esquerda e o operando à direita.

Operador de atribuição de subtração -=

O operador -= atribui à variável à esquerda a subtrai do valor do operando à direita da variável à esquerda.

Operador de atribuição de multiplicação *=

O operador *= atribui à variável à esquerda a multiplicação do valor da variável à esquerda e o operando à direita.

Operador de atribuição de divisão /=

O operador /= atribui à variável à esquerda a divisão do valor da variável à esquerda pelo operando à direita.

Erros de arredondamento

Devido às limitações gerais da representação de pontos flutuantes de números reais e aritmética de ponto flutuante, erros de arredondamento podem ocorrer em cálculos com tipos de pontos flutuantes.


Funções de Suporte

As funções de suporte fornecem recursos previamente definidos para auxiliar na utilização da linguagem.

_DATA

A função _DATA, recebe os parâmetro dia, mês e ano, e possivelmente hora e minuto, para formar uma data.

_DATA(dia, mes, ano, hora, minuto);

Parâmetros:

dia Dia, referente ao dia do mês.

mes Mês, referente ao mês do ano (entre 1 e 12).

ano Ano (entre 1 e 9999).

hora (Opcional) Hora (entre 0 e 23).

minuto (Opcional) Minuto (entre 0 e 59).

Exemplo:

var data = _DATA(30, 03, 2020);

_HOJE

A função _HOJE, não recebe parâmetros, e retorna a data atual do sistema sem especificar a hora, minuto ou segundo.

_HOJE();

Exemplo:

var data = _HOJE();

_AGORA

A função _AGORA, não recebe parâmetros, e retorna a data e hora atual do sistema.

_AGORA();

Exemplo:

var dataHora = _AGORA();

_DATADIF

A função _DATADIF, recebe os parâmetros data inicial, data final e unidade, para calcular a diferença entre as duas datas informadas, e utiliza a unidade para determinar como será devolvido o resultado, são aceitas as opções DIA, MES ou ANO.

_DATADIF(dataInicial, dataFinal, unidade)

Parâmetros:

dataInicial Data inicial para comparação.

dataFinal Data final para comparação.

unidade Unidade de retorno. (DIA, MES ou ANO)

Exemplo:

var data = _DATA(01, 04, 2020);
var dif = _DATADIF(data, _HOJE(), DIA);

_ANO

A função _ANO, recebe como parâmetro a data da qual se deseja extrair o ano.

_ANO(data)

Parâmetros:

data Data para se realizar a operação.

Exemplo:

var data = _DATA(01, 04, 2020);
var ano = _ANO(data);

_MES

A função _MES, recebe como parâmetro a data da qual se deseja extrair o mês.

_ANO(data)

Parâmetros:

data Data para se realizar a operação.

Exemplo:

var data = _DATA(01, 04, 2020);
var mes = _MES(data);

_DIA

A função _DIA, recebe como parâmetro a data da qual se deseja extrair o dia.

_DIA(data)

Parâmetros:

data Data para se realizar a operação.

Exemplo:

var data = _DATA(01, 04, 2020);
var dia = _DIA(data);

_HORA

A função _HORA, recebe como parâmetro a data da qual se deseja extrair a hora.

_HORA(dataHora)

Parâmetros:

dataHora Data para se realizar a operação.

Exemplo:

var dataHora = _AGORA();
var hora = _HORA(dataHora);

_MINUTO

A função _MINUTO, recebe como parâmetro a data da qual se deseja extrair o minuto.

_MINUTO(dataHora)

Parâmetros:

dataHora Data para se realizar a operação.

Exemplo:

var dataHora = _AGORA();
var minuto = _MINUTO(dataHora);

_ANO_ADICIONAR

A função _ANO_ADICIONAR, recebe como parâmetro a data a se realizar a operação, e a quantidade de anos a se adicionar.

_ANO_ADICIONAR(data, anos)

Parâmetros:

data Data para se realizar a operação.

anos Quantidade de anos a se adicionar.

Exemplo:

var data = _DATA(01, 04, 2020);
var novaData = _ANO_ADICIONAR(data, 2);

_MES_ADICIONAR

A função _MES_ADICIONAR, recebe como parâmetro a data a se realizar a operação, e a quantidade de meses a se adicionar.

_MES_ADICIONAR(data, meses)

Parâmetros:

data Data para se realizar a operação.

meses Quantidade de meses a se adicionar.

Exemplo:

var data = _DATA(01, 04, 2020);
var novaData = _MES_ADICIONAR(meses, 8);

_DIA_ADICIONAR

A função _DIA_ADICIONAR, recebe como parâmetro a data a se realizar a operação, e a quantidade de dias a se adicionar.

_DIA_ADICIONAR(data, dias)

Parâmetros:

data Data para se realizar a operação.

dias Quantidade de dias a se adicionar.

Exemplo:

var data = _DATA(01, 04, 2020);
var novaData = _DIA_ADICIONAR(data, 8);

_ARRUMAR

A função _ARRUMAR, recebe como parâmetro um texto e remove espaços em branco do começo, final e espaços seguidos entre as palavras.

_ARRUMAR(texto)

Parâmetros:

texto Texto a ser arrumado.

Exemplo:

var texto = "Um   texto  ";
var novoTexto = _ARRUMAR(texto);

_ARREDONDAR

A função _ARREDONDAR, recebe como parâmetro um número decimal e o arredonda para a quantidade de casas decimais informada, ou sem casas decimais caso não seja fornecida.

_ARREDONDAR(entidade, casasDecimais)

Parâmetros:

entidade Número a ser arredondado.

casasDecimais Número de casas decimais no valor retornado.

Exemplo:

var numero = 10.9410;
var numeroArredondado = _ARREDONDAR(numero, 3);

_RAIZ

A função _RAIZ, recebe como parâmetro um número decimal e cálcula a sua raiz quadrada.

_RAIZ(numero)

Parâmetros:

numero O número a ser achar a raiz quadrada.

Exemplo:

var numero = 9;
var numeroRaiz = _RAIZ(numero);

_ABS

A função _ABS, recebe como parâmetro um número decimal e retorna o valor absoluto de um número.

_ABS(numero)

Parâmetros:

numero O número a ser achar a valor absoluto.

Exemplo:

var numero = 9.97;
var numeroAbsoluto = _ABS(numero);

_COALESCE

A função _COALESCE, recebe como parâmetro um número decimal e retorna o valor absoluto de um número.

_COALESCE(entidade [, entidade])

Parâmetros:

entidade Valor a ser verificado.

Exemplo:

var numero = nulo;
var valorNaoNulo = _COALESCE(numero, 9);

_NULO

A função _NULO, recebe como parâmetro uma entidade, e indica se é nula.

_NULO(entidade)

Parâmetros:

entidade Valor a ser verificado.

Exemplo:

var numero = nulo;
var valorNaoNulo = _NULO(numero, 9);

_SOMA

A função _SOMA, recebe como parâmetro uma lista, e soma todos os valores da propriedade especificada da lista informada.

_SOMA(lista)

Parâmetros:

lista Lista de valores a serem verificado.

Exemplo:

lista ls = [];
ls[0].Valor = 10;
ls[1].Valor = 12;
var soma = _SOMA(ls.Valor);

_SOMASE

A função _SOMASE, recebe como parâmetro uma lista, e soma todos os valores da propriedade especificada da lista que satisfazem a condição.

_SOMASE(lista, condicao)

Parâmetros:

lista Lista de valores a serem verificado.

condicao Condição para se realizar a operação.

Exemplo:

lista ls = [];
ls[0].Valor = 10;
ls[1].Valor = 12;
ls[2].Valor = 14;
var soma = _SOMASE(ls.Valor, Valor > 10);

_MEDIA

A função _MEDIA, recebe como parâmetro uma lista, e cálcula a média entre os valores da propriedade especificada da lista.

_MEDIA(lista)

Parâmetros:

lista Lista de valores a serem verificados.

Exemplo:

lista ls = [];
ls[0].Valor = 10;
ls[1].Valor = 12;
var media = _MEDIA(ls.Valor);

_MAXIMO

A função _MAXIMO, recebe como parâmetro uma lista, e extrai o máximo entre os valores da propriedade especificada da lista.

_MAXIMO(lista)

Parâmetros:

lista Lista de valores a serem verificados.

Exemplo:

lista ls = [];
ls[0].Valor = 10;
ls[1].Valor = 12;
var max = _MAXIMO(ls.Valor);

_MINIMO

A função _MINIMO, recebe como parâmetro uma lista, e extrai o mínimo entre os valores da propriedade especificada da lista.

_MINIMO(lista)

Parâmetros:

lista Lista de valores a serem verificados.

Exemplo:

lista ls = [];
ls[0].Valor = 10;
ls[1].Valor = 12;
var min = _MINIMO(ls.Valor);

_CONT

A função _CONT, recebe como parâmetro uma lista, e conta a quantidade de itens da lista.

_CONT(lista)

Parâmetros:

lista Lista de valores a serem verificados.

Exemplo:

lista ls = [];
ls[0].Valor = 10;
ls[1].Valor = 12;
var total = _CONT(ls);

_CONTSE

A função _CONTSE, recebe como parâmetro uma lista, e conta a quantidade de itens da lista que satisfazem a condição.

_CONTSE(lista, condicao)

Parâmetros:

lista Lista de valores a serem verificados.

condicao Condição para se realizar a operação.

Exemplo:

lista ls = [];
ls[0].Valor = 10;
ls[1].Valor = 12;
ls[2].Valor = 14;
var total = _CONTSE(ls, Valor > 10);

_CARACTERISTICA

A função _CARACTERISTICA, através de consulta a base de dados retorna o conteúdo da coluna valor ou fator, conforme solicitado no parâmetro valor_fator_caracteristica, das características gerais do sistema.

_CARACTERISTICA(descricao_caracteristica, codigo_caracteristica, valor_fator_caracteristica, exercicio_caracteristica)

Parâmetros:

descricao_caracteristica Descrição da característica.

codigo_caracteristica Código da característica.

valor_fator_caracteristica Campo a se extrair o conteúdo. (VALOR ou FATOR)

exercicio_caracteristica Exercício da característica.

Exemplo:

var esgoto = _CARACTERISTICA("ESGOTO", "01", "Valor", 2019);

_PARAMETRO

A função _PARAMETRO, através de consulta a base de dados retorna o conteúdo da coluna valor do Parâmetro Valor associado ao parâmetro informado.

_PARAMETRO(nome, exercicio [, codigo])

Parâmetros:

text Nome do parâmetro.

exercicio Exercício referente ao parâmetro.

codigo (Opcional) Código do valor do parâmetro.

Exemplo:

lista parametros = _PARAMETRO("ReferenciaBaixaFebrabanMovCxIt", 2019);

_CARACTERISTICATABELA

A função _CARACTERISTICATABELA, através de consulta a base de dados retorna o conteúdo da coluna valor ou fator da característica da tabela informada.

_CARACTERISTICATABELA(tabela, descricao, coluna, exercicio [, campo])

Parâmetros:

tabela Tabela a consultar a característica.

descricao Descrição da característica.

coluna Coluna da característica.

exercicio Exercício da característica.

campo (Opcional) Campo a se extrair o conteúdo. (VALOR ou FATOR)

Exemplo:

lista caracteristicas = _CARACTERISTICATABELA("FisicoCaracteristicas", "Descricao", "Coluna", 2019, "VALOR");

_ATIVIDADETABELA

A função _ATIVIDADETABELA, através de consulta a base de dados retorna o valor da Atividade da tabela informada.

_ATIVIDADETABELA(tabela, descricao, coluna, coluna_filtro, exercicio [, campos[]])

Parâmetros:

tabela Tabela a consultar a atividade.

descricao Descrição da atividade.

coluna Coluna da atividade.

coluna_filtro Coluna para realizar a filtragem.

exercicio Exercício da atividade.

campos (Opcional) Lista de campos a se extrair o conteúdo.

Exemplo:

lista atividades = _ATIVIDADETABELA("CCMAtividades", "SERVIÇOS116", "ccm", "IdAtividade", 2019, ["Atividades.VlrAtividade", "Atividades.Aliquota", "AtividadesVlrs.Valor", "AtividadesVlrs.DtInicio"]);

Constantes de Suporte

As constantes de suporte são valores referentes ao registro sendo processado, assim se uma fórmula é feita para o Setor Origem Imobiliário, por exemplo, terá disponível os valores de Fisico, FisicoAreas, FisicoOutros e FacesdaQuadra para realizar o cálculo, além dos resultados das fórmulas anteriores na ordem de execução, identificados por @Roteiro e valores externos referentes a execução identificados por @Variavel.

Constantes de suporte são identificadas pelo caractere '@' no início do identificador.

Exemplo:

retorno @Fisico.AreaComum;

Referências

Esta definição teve como base para estruturação e definições a referência de linguagem do C#, disponível em https://docs.microsoft.com/pt-br/dotnet/csharp/language-reference/.