Analisador léxico, sintático e avaliador de expressões matemáticas.
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).
- 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:
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>
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
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)
Não é permitido o emprego de mais de um operador sem uso de parênteses, conforme ilustrado abaixo.
- 10 - 9 - 8
- 2 + 3 + 4
- MathParser é uma inspiração para a presente biblioteca. Contudo, com recursos mais elaborados do que aqueles estabelecidos para o presente projeto.
- exp4j