文章 "计算数学表达式(第一部分)。 递归下降解析器"

 

新文章 计算数学表达式(第一部分)。 递归下降解析器已发布:

本文研究数学表达式解析和计算的基本原理。 我们基于预建语法树,实现运行于解释器和快速计算模式的递归下降解析器。

在自动执行交易任务时,可能需要在其执行阶段提供计算算法的灵活性。 例如,当微调程序以闭合(编译)模式分布时,我们可以从众多可能的组合中选择目标函数类型。 特别是在优化智能交易系统或快速评估指标原型时,这很有用。 除了更改对话框中的参数之外,用户还可以更改计算公式。 在这种情况下,我们只需从其文本表达形式计算其数学表达式,而无需更改 MQL 程序代码。

可以通过各种解析器来解决此任务,这些解析器可以即时解释公式,将其“编译”为语法树,生成所谓的字节码(计算指令序列),进而执行从而得出计算结果 。 在本文中,我们将研究几种类型的解析器和表达式计算方法。

问题的陈述

在本文中,算术表达式是单行序数据项和运算符的相关操作描述。 数据项是数字和已命名变量。 变量值可从外部设置和编辑,即并非在表达式内部,而是用特殊的解析器属性。 换句话说,没有赋值运算符('=')来存储中间结果。 以下是受支持的运算符列表,按计算优先级顺序显示:

  • !, - , + — 一元逻辑非,减号和加号
  • () — 括号分组
  • *, /, % — 乘法,除法和除法模
  • +, - — 加法和减法
  • >, <, >=, <= — 大、小比较
  • ==, != — 相等或不等比较
  • &&, || — 逻辑与 AND 和逻辑或 OR(请注意,优先级相同,因此应使用括号)
  • ?: — 三元条件运算符,可令您根据条件分支计算

我们还将允许在表达式中使用 MQL 的标准数学函数,共计 25 个。 其中之一是用于幂运算的 pow 函数。 有因于此,运算符列表中没有指数运算符('^')。 另外,运算符 '^' 仅支持整数幂,而该函数则无此限制。 还有一个更特殊的功能,即把 “^” 与其他研究的运算符区分开。

作者:Stanislav Korotky

原因: