/parser

Avaliador de expressões matemáticas em Java

Primary LanguageJava

parser

Analisador léxico, sintático e avaliador de expressões matemáticas.

Dependency Status Coverage Status Codacy Badge Javadocs Sonarqube


Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.
Fábio Nogueira de Lucena - Fábrica de Software - Instituto de Informática (UFG).

Melhorias

  • Expressões matemáticas não incluem funções e estão restritas a casos simples. Estender com lexer e parser mais elaborados. Possivelmente fazer uso de Antlr.
  • São interpretadas em tempo de execução, o que reduz o desempenho da execução. Verificar as alternativas:
    • Usar ASM para gerar em tempo de execução bytecodes a serem executados? (veja aqui).
    • Combinar Antlr e LLVM para geração de código executável (aqui)
    • Exemplos de Antlr e LLVM em conjunto: aqui e aqui
    • Usar Antlr com Javassist ou ByteBuddy.

Como usar?

Obtenha a versão mais recente

Seu projeto precisa de uma única dependência, indicada abaixo.

<dependency>
  <groupId>com.github.kyriosdata.parser</groupId>
  <artifactId>parser</artifactId>
  <version>1.0.2</version>
</dependency>

Avaliação de uma expressão

O parser é o principal componente da biblioteca. Ele recebe uma sequência de tokens produzida pelo lexer e produz como saída uma expressão, que pode ser avaliada conforme ilustrado abaixo.

List<Token> tokens = new Lexer("2.3 * 10").tokenize();
Parser parser = new Parser(tokens);
float resultado = parser.expressao().valor(); // 23.0

Expressões podem conter variáveis e, nesse caso, valores a serem utilizados devem ser fornecidos. Caso contrário, o valor 0f é assumido.

Map<String, Float> ctx = new HashMap<>();
ctx.put("a", 10);

List<Token> tokens = new Lexer("2.3 * a").tokenize();
Parser parser = new Parser(tokens);
float resultado = parser.expressao().valor(ctx); // 23.0

Especificação das expressões

Expressões admitidas incluem o uso de constantes, variáveis (sequências iniciadas por caractere, seguidas ou não de dígitos e abre/fecha parênteses. Os operadores incluem soma, subtração, multiplicação e divisão. Uma expressão também pode ser uma condição e, nesse caso, os operadores são E, OU e igualdade. As expressões lógicas produzem o valor 0 (caso verdadeira) ou diferente de zero (caso falsa). Alguns exemplos são ilustrados abaixo.

  • a + b * (x - y)
  • x
  • 10.2
  • a*(b - (c * d))
  • feriado & comDinheiroNoBolso
  • feliz | vitoriaDoTimao
  • (5 - 3) = (10 / 5)

Expressões consideradas inválidas

Não é permitido o emprego de mais de um operador sem uso de parênteses, conforme ilustrado abaixo.

  • 10 - 9 - 8
  • 2 + 3 + 4

Referências, links

  • MathParser é uma inspiração para a presente biblioteca. Contudo, com recursos mais elaborados do que aqueles estabelecidos para o presente projeto.
  • exp4j