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/.