在运行时从RPN构造一个可调用函数的对象

姆巴托夫

我正在设计一个程序,该程序将对流数据执行某些操作。操作由运行时提供的RPN(反向抛光表示法)表达式定义。正在从文件源流式传输数据,一次传输一个固定大小的部分。操作引用了数据的当前输入部分,例如data[1]该程序将相同的操作应用于所有输入部分(并输出结果)。

实现一个RPN解析器非常容易,该解析器对数字进行运算并进行算术运算以得出结果。但是,使用这种实现方式将意味着为每个数据部分重新解析RPN。

我要实现的是以某种方式构建一个对象,该对象将基于对数据的基本操作的字母来保存曾经解析过的RPN实现,其中程序将提供输入数据(或填写输入),调用该对象的operator()获取并输出结果。

如何callable expression使用“非现代” C ++(否C++11C++14实现这样的类(a )并构造这样的对象

雅克·德·豪格(Jacques de Hooge)

由于具有RPN,因此可以将操作建模为堆栈的一系列转换。将一个输入部分加载到堆栈上,然后按顺序执行您的操作即可解决问题。不需要树,它按操作顺序是隐式的。无需重新解析,它实际上是一系列操作(函数或函子),而不是一系列表示操作的符号。

我会选择函子,因为我喜欢存储对象的引用或指针要比存储函数的引用或指针更好。您可以将其实现为具有重载的operator()的类,该类执行所需的堆栈转换(例如,如果是乘法函子,则将两个顶部元素相乘)。

古老的设备就是这样工作的...

上图:以这种方式运行的古老设备...

至于什么存储在堆栈上,什么不是:

  • 首先,您的操作数将存储在与输入顺序匹配的队列中
  • 一次解析且永不更改的结果运算符对象将分别存储在运算符队列中。
  • 应用'get'运算符会将一个操作数从队列转移到操作数堆栈

因此,例如,如果您想计算

sin (3 + 4) / (5 + 6)

您的操作数队列是:

[start] 3 4 5 6 [end]

您的操作员对象队列(它包含指向函子的指针,而不包含符号,每个函子只有一个实例,但可能被多次引用)是:

[start] &getFunctor &getFunctor &addFunctor &sinFunctor &getFunctor &getFunctor &addFunctor &divideFunctor [begin]

您的操作数堆栈开始为emptpy:

[top][bottom]

应用操作员队列将随后为您提供:

(get)    [top] 3 [bottom]
(get)    [top] 3 4 [bottom]
(add)    [top] 7 [bottom]
(sin)    [top] 0.657 [bottom]
(get)    [top] 5  0.657 [bottom]
(get)    [top] 5 6  0.657 [bottom]
(add)    [top] 11  0.657[bottom]
(divide) [top] 0.0597 [bottom]

如果您随后想要将完全相同的操作应用于例如

[start]10 20 30 40[end]

只需替换操作数队列(或使操作数队列的起始指针指向操作数文件的下一个“块”,然后针对此新的操作数序列再次运行操作符队列即可。

请注意,如上所述,运算符队列不包含运算符,而是指向立即可用的函数对象的指针,这些对象将在您调用它们后立即执行其操作,而无需重新解析或重新生成代码。

因此,如果您有大量数据:

[start of file]3 4 5 6   10 20 30 40   -1 -10 15 80 ...[end of file]

您只需继续应用相同的操作员队列,一切便会正常进行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

基本构造函数根据输入调用派生的构造函数-在运行时选择对象子类型

想要在运行时创建一个类的多个对象

Eiffel:在运行时创建一个类型化对象

如何在另一个方法仍在运行时调用一个方法-Python

如何在运行时使用C#声明一个委托并在运行时调用其方法?

调用另一个递归函数的递归函数的运行时分析

在运行时通过@AutoWired通过构造函数初始化对象

使用structuremap在运行时将对象传递给类构造函数

如何在运行时修改函数内部变量并将其传递给另一个函数?

CMake:两个库,共享对象的相同位置,一个在运行时找不到

构造要在运行时调用的方法的名称

当另一个PHP脚本正在运行时,AJAX不会调用其PHP脚本

Scala在运行时获取构造函数参数

未在代码中调用的函数在运行时被调用

当某个函数运行时删除一个 EventListener

调用仅在运行时已知的函数

Autofac-在运行时解析实现同一接口的一个或多个类型

我做了一个函数,但得到一个“NoneType”对象不可调用

Java-在运行时按参数类选择可调用方法的最佳选项

当应用未运行时,在后台按固定的时间间隔重复调用一个函数

在运行时构造按钮

SpringBootTest-如何在运行时配置中替换一个bean?

Android布局在运行时将视图替换为另一个视图

一个特定的整数在运行时需要多少字节?

确定某个方法在运行时是否覆盖另一个方法

在运行时设置下一个 LaunchScreen

在运行时从头开始建立一个数据库

创建一个新的窗体并在运行时添加事件处理程序

Java在运行时使用String [] stringArray参数实例化一个类