com.github.kyriosdata.parser:parser

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

License

License

Categories

Categories

Data
GroupId

GroupId

com.github.kyriosdata.parser
ArtifactId

ArtifactId

parser
Last Version

Last Version

1.0.2
Release Date

Release Date

Type

Type

jar
Description

Description

com.github.kyriosdata.parser:parser
Analisador léxico, analisador sintático e avaliador de expressões matemáticas.
Project URL

Project URL

https://github.com/kyriosdata/parser
Project Organization

Project Organization

Instituto de Informática (UFG) - Fábrica de Software
Source Code Management

Source Code Management

https://github.com/kyriosdata/parser

Download parser

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.kyriosdata.parser/parser/ -->
<dependency>
    <groupId>com.github.kyriosdata.parser</groupId>
    <artifactId>parser</artifactId>
    <version>1.0.2</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.kyriosdata.parser/parser/
implementation 'com.github.kyriosdata.parser:parser:1.0.2'
// https://jarcasting.com/artifacts/com.github.kyriosdata.parser/parser/
implementation ("com.github.kyriosdata.parser:parser:1.0.2")
'com.github.kyriosdata.parser:parser:jar:1.0.2'
<dependency org="com.github.kyriosdata.parser" name="parser" rev="1.0.2">
  <artifact name="parser" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.kyriosdata.parser', module='parser', version='1.0.2')
)
libraryDependencies += "com.github.kyriosdata.parser" % "parser" % "1.0.2"
[com.github.kyriosdata.parser/parser "1.0.2"]

Dependencies

compile (3)

Group / Artifact Type Version
org.junit.jupiter : junit-jupiter-api jar 5.0.0-M3
org.junit.jupiter : junit-jupiter-engine jar 5.0.0-M3
org.apache.maven.plugins : maven-surefire-plugin jar 2.19.1

Project Modules

There are no modules declared in this project.

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

Versions

Version
1.0.2
1.0.1
1.0.0