Discussão do artigo "Cálculo de expressões matemáticas (Parte 1). Analisadores descendentes recursivos"

 

Novo artigo Cálculo de expressões matemáticas (Parte 1). Analisadores descendentes recursivos foi publicado:

Neste artigo são abordados os princípios básicos de análise e cálculo de expressões matemáticas, são implementados analisadores descendentes recursivos que funcionam nos modos interpretador e cálculo rápido com base numa árvore de sintaxe pré-construída.

Ao automatizar tarefas de negociação, às vezes é necessário adicionar flexibilidade à execução de algoritmos computacionais. Assim, por exemplo, para configurar programas vindos numa forma fechada (compilada), podemos selecionar o tipo de função objetivo a partir de uma ampla gama de possíveis combinações. Em particular, isso ocorre ao otimizar um EA ou avaliar rapidamente um protótipo de indicador. Quando é assim, na caixa de diálogo de propriedades, o usuário pode alterar não apenas os parâmetros, mas também a fórmula de cálculo. Nesses casos, é necessário calcular a expressão aritmética com base na sua representação textual sem alterar o código MQL do programa.

Para resolver este problema, são utilizados distintos tipos de analisadores que permitem interpretar fórmulas em tempo real, compilando-as numa árvore sintática, gerando o chamado bytecode (sequências de instruções computacionais) e executando-o para calcular o resultado. Neste artigo, veremos alguns tipos de analisadores e como avaliar expressões.

Formulação do problema

Por expressão aritmética entenderemos uma sequência unilinear de itens de dados e de operadores que descrevem ações. Nossos itens de dados serão números e variáveis nomeadas. Os valores das variáveis poderão ser atribuídos e alterados externamente, ou seja, não dentro de uma expressão, mas, sim, usando atributos especiais do analisador. Em outras palavras, não há operador de atribuição ('=') para armazenar resultados intermediários. Eis a lista de operadores suportados com ordem de precedência de cálculos:

  • !, - , + — negação lógica unária, menos e mais
  • () — agrupamento usando colchetes
  • *, /, % — multiplicação, divisão e módulo de divisão
  • +, - — adição e subtração
  • >, <, >=, <= — comparação mais-menos
  • ==, != — comparação é igual ou diferente
  • &&, || — E e OU lógicos (atenção, a prioridade é a mesma, são necessários colchetes)
  • ?: — operador condicional ternário que permite desviar cálculos de acordo com condições

Além disso, permitimos que nas expressões sejam usadas funções matemáticas MQL padrão, que no total são 25. Dentre eles, em particular, existe uma função pow para exponenciação. Por esse motivo, na lista de operadores não existe um operador de exponenciação ('^'). Ademais, o operador '^' permite elevar apenas a uma potência inteira, já a função não está sujeita a essa restrição. Existe mais uma nuance que distingue o operador '^' dos outros considerados.

Autor: Stanislav Korotky