https://github.com/kyriosdata/parser
Avaliador de expressões matemáticas em Java
https://github.com/kyriosdata/parser
Last synced: 5 months ago
JSON representation
Avaliador de expressões matemáticas em Java
- Host: GitHub
- URL: https://github.com/kyriosdata/parser
- Owner: kyriosdata
- Created: 2016-10-18T12:03:45.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-01-22T17:31:10.000Z (over 4 years ago)
- Last Synced: 2025-07-13T23:03:11.335Z (11 months ago)
- Language: Java
- Size: 114 KB
- Stars: 0
- Watchers: 2
- Forks: 3
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# parser
Analisador léxico, sintático e avaliador de expressões matemáticas.
[
](https://travis-ci.org/kyriosdata/parser)
[](https://www.versioneye.com/user/projects/5816220fd33a7126e32ff001)
[](https://coveralls.io/github/kyriosdata/parser?branch=master)
[](https://www.codacy.com/app/kyriosdata/parser?utm_source=github.com&utm_medium=referral&utm_content=kyriosdata/parser&utm_campaign=Badge_Grade)
[](http://javadoc.io/doc/com.github.kyriosdata.parser/parser)
[](https://sonarqube.com/dashboard?id=com.github.kyriosdata.parser%3Aparser)

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](https://www.antlr.org/).
- 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](https://stephenfox.dev/a-language-on-the-jvm)).
- Combinar Antlr e LLVM para geração de código executável ([aqui](https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687062/LLVM))
- Exemplos de Antlr e LLVM em conjunto: [aqui](https://github.com/AndreaOrru/Lucy) e [aqui](https://github.com/alongubkin/modern)
- Usar Antlr com [Javassist](https://www.javassist.org/) ou [ByteBuddy](https://bytebuddy.net).
## 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](http://mathparser.org) é uma inspiração para a presente biblioteca. Contudo, com recursos mais elaborados do que aqueles estabelecidos para o presente projeto.
- [exp4j](https://lallafa.objecthunter.net/exp4j/)