数学表达式的自定义解释器

2024-01-01

我必须评估大量包含变量的表达式,并且我正在考虑编写一个小型自定义解释器以保持编译快速且小型。但是我对这个主题没有经验,并且有一些问题。

假设我们有一个包含数学表达式和一组有限对象的文件。该文件可能如下所示:

expr[x,y,z] = 2*x*y + x^2 + 28/14*z*(x*y^2 + 15*z) + ...

我想以某种方式解析它,以便我可以在我的应用程序中对表达式进行数值计算 通过简单地调用一个函数expr(float x, float y, float z)。参数的数量不应该是固定的(EDIT -:每个表达式都有自己的定义,并带有适当数量的参数或接受数组),并且应允许括号嵌套以使输入文件保持相当小的大小。

由于表达式都是多项式类型,我可以想到数据结构应该是什么样子,但是解析看起来很困难。我已经在这里找到了一些类似问题的答案,例如使用Lua.

然而,最大的问题是,与从自动生成的 C 代码直接编译这些表达式相比,创建和调用这些对象时的性能损失是什么。

提前致谢!


EDIT -:请考虑以下示例expr()以上仅如此。我想最好的方法是使用模板类的对象来保存稀疏数组中变量的系数和幂。


性能有点像字符串的长度问题。在计算算术表达式时,解释型语言几乎总是比编译的 C 代码慢。但并不是很多程序将大部分时间都花在算术上,所以大多数时间这并不重要。无论您每次评估表达式时都解析表达式还是(从您所说的看来更有可能)将其解析为某种中间形式,这也会产生影响。

从你所说的内容中无法判断这对你是否重要,或者你的解释器的编写速度有多快,但就评估表达式所花费的时间而言,我不认为它会比慢 10 倍更好被关注到。最初的解释尝试要糟糕得多。

至于中间形式 - 通常开始的地方是使用 Dijkstra 的“调车场”算法将中缀表达式转换为逆波兰形式。这为您提供了一系列“符号”、“字节代码”,您可以随意称呼它们,并且很容易为该形式编写表达式求值器 - 每个运算符只需从堆栈中弹出其操作数,执行操作,然后将其压入结果入栈,直到最后只剩下表达式的最终值。数字文字和变量名就像“运算符”,不弹出任何操作数,而是压入其值。

[编辑 - 根据您的用户是谁,您的程序可能可以获取该文本文件,从中生成 C 程序,运行编译器,然后运行生成的程序(或者打开并调用生成的 dll)。显然,这依赖于许多特定于系统的东西(例如正在安装的编译器),并且需要对表达式进行足够多次的计算才能克服编译的开销。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数学表达式的自定义解释器 的相关文章

  • Dapper 强类型查询返回默认对象值

    刚刚开始使用 Dapper 并喜欢它 我遇到了问题 它返回正确数量的对象 但它们的属性都有默认值 using var dbConnection Connection await dbConnection OpenAsync const st
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • WPF - 按多列排序时使用自定义比较器

    我有一个 ListView GridView 我想按 2 列排序 因此如果第 1 列中有 2 个以上的项目具有相同的值 它将按第 2 列排序 非常简单 但是在对 A Z 进行排序时 空字符串会出现在顶部 我想把它们移到底部 我制作了一个比较
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • C# ConfigurationManager 从 app.config 检索错误的连接字符串

    我有一个简单的 WinForms 应用程序 它最终将成为一个游戏 现在 我正在研究它的数据访问层 但遇到了障碍 我创建了一个单独的项目 名为DataAccess在其中 我创建了一个本地 mdfSQL Server 数据库文件 我还创建了一个
  • 禁用除滚动之外的 DataGridView

    我如何配置 datagridview 以便用户只能在行中移动并使用滚动 而没有其他 如果我禁用网格不允许我使用滚动 将您的 datagridview 设置为只读 这将禁用任何编辑 dataGridView1 ReadOnly true 在你
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • CMake 警告:无法为目标生成安全的链接器搜索路径

    在为 pcl 项目运行 CMake 时 我收到一条警告消息 Configuring done CMake Warning at CMakeLists txt 12 add executable Cannot generate a safe
  • 我们应该使用 Eval 还是 Databind 事件?

    当使用 Asp Net 并使用 ListView 等控件创建网站时 使用 Eval 命令是一个好习惯吗 还是应该在 databind 事件中填充文字和数据 取决于您是否想在更新事件上写回数据 在这种情况下数据绑定 如果您只想读取该数据 可以
  • C++ 析构函数:何时释放内存?

    如果我删除一个导致其析构函数被调用的对象 那么内存是在析构函数完成函数中的任何操作之前还是之后被释放 仅当最小派生类子对象被销毁后才会释放内存 所以如果你有 class Base class Derived public Base publ
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 在非指针变量和类成员上放置 new

    考虑以下示例 include
  • 为什么在 .net 中使用 Invoke on Controls? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 NET不允许跨线程操作 https stackoverflow com questions 2896504 why net does not allow cross thread operat
  • IBM Watson 对话服务错误:无法从“方法组”转换为“conversation.onMessage”

    我正在尝试运行 IBM Watson会话服务团结和下面是代码片段 https github com watson developer cloud unity sdk conversation private Conversation m C
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一
  • printf 参数不足

    我的问题是关于缺少参数的 printf 之后的行为 printf s blah blah d int integer was given as argument and not int written 我已经知道 如果格式参数不足 则行为是
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一

随机推荐

  • 无法在 Azure 中访问我的 X509Certificate 2 私钥

    我将我的 X509Certificate 存储在数据库中 在byte 以便我的应用程序可以检索证书并使用它来签署我的 JWT 我的 x509Certificate 是通过我在计算机上生成的 pfx 文件传递 的 但现在它作为字节字符串位于数
  • 通过 AirDrop 发送即时创建的 QR 码 UIImage 失败

    我正在动态创建一个 QR 码并将其存储为 UIImage 现在我希望能够使用 UIActivityViewController 发送它 但不知何故它失败了 func generateQRCode from string String gt
  • PHP:如何防止代码的多次执行(如果它已经在处理中)

    解释 通常需要 10 20 秒响应的 API 调用 对另一个服务 存储在数据库中 存储后 系统会立即尝试使用API 将结果显示给用户 但可能会失败 并显示失败 但我们会自动重试 因此还有一个Cron Job设置为每 30 秒运行一次并再次尝
  • RavenDB 对列表属性进行 Map/Reduce

    刚刚学习 Map Reduce 我错过了一个步骤 我读过这篇文章 使用 NET 客户端的 RavenDB Map Reduce 示例 https stackoverflow com questions 4253334 ravendb map
  • 命名参数什么时候有用?

    C 代码中是否存在位置参数不够用的情况 我真的没有看到命名参数有任何好处 相反 我可以看到过度使用命名参数会使代码难以阅读 所以我的问题是 为什么有人会使用它们以及它如何帮助编写更好的代码 因为我确信它们不是毫无理由地实现的 这对我来说看起
  • 如何在 WSO2 APIM 中处理外部/第三方 API 的外部身份验证

    我正在使用 WSO2 APIM 2 5 0 和 IS 5 6 0 它们都是集成的并且运行良好 现在 如果我在 API 管理中加入第三方 API 并使用 oauth 令牌 我就可以访问它 但问题是如何处理具有自己的身份验证的任何外部或第三方
  • const_cast 和 UB

    5 2 11 7 注 取决于 对象的类型 写操作 通过指针 左值或指针 到由 a 产生的数据成员 const cast 抛弃 a const 限定符68 may生产 未定义的行为 7 1 5 1 本节 C 03 的措辞令我惊讶 令人惊讶的是
  • 两次时间差

    我想以 hh mm 格式显示两个时间之间的差异 第一个时间来自数据库 第二个时间是系统时间 时差每秒更新一次 我怎样才能做到这一点 目前 我正在使用两个手动时间 如果效果完美 那么我会将其实施到我的应用程序中 public class Ma
  • 将星星添加到 p 值

    我计算了多个变量均值差异的 Anova F 检验 p 值 现在我想添加 星星 来指示 p 值的显着性水平 我希望 表示 10 水平的显着性 表示 5 水平的显着性 表示 1 水平的显着性 我的数据如下所示 structure list Va
  • 如果未安装应用程序,如何获取 Facebook 应用程序链接

    如果用户点击 Facebook 应用程序中的深层链接时未安装我的应用程序 如何获取应用程序链接数据 令人惊讶的是 Facebook 关于这个问题的文档很少 我有一个深层链接https fb me 635533123230265 返回 HTM
  • 在 ASP.NET MVC 组织帐户中访问 Azure AD Graph API

    我正在尝试根据登录用户的 AD 组限制页面访问 我对以下代码有问题 var tenantId incomingPrincipal FindFirst GraphConfiguration TenantIdClaimType Value cr
  • 如何在 Eclipse 中为编辑器创建大纲视图?

    我在 eclipse 中创建了一个自定义编辑器 其大纲视图显示大纲不可用 我尝试搜索此内容 发现了以下链接 常见问题解答 如何为我自己的语言编辑器创建大纲视图 http wiki eclipse org FAQ How do I creat
  • 在 Ruby 中生成高斯(正态分布)随机数的代码

    在 ruby 中生成正态分布随机数的代码是什么 注 我回答了我自己的问题 但我会等几天再接受 看看是否有人有更好的答案 EDIT 为了搜索这个 我查看了两次搜索产生的 SO 上的所有页面 正态分布 红宝石 and 高斯 随机红宝石 蟒蛇的随
  • 使用 [NSDate date] 获取当前日期和时间

    我的系统的日期时间是 5 月 26 日 22 55 但是当我与 NSDate date 日期时间是 5 月 27 日 02 35 是因为时区的原因吗 如果是 如何解决这个问题 当我得到日期时间时 给我系统的日期并且不检查时区 NSLocal
  • yii:尝试获取非对象的属性

    嗯 我发现this https stackoverflow com questions 18335513 trying to get property of non object error in yii 但我看不到与我的错误的关系 我是新
  • Python - 从其他内部类引用内部类

    我试图从另一个内部类引用一个内部类 我都尝试过 class Foo object class A object pass class B object other A and class Foo object class A object
  • SVG - 单击不是函数[重复]

    这个问题在这里已经有答案了 我有一个这样的元素
  • AJAX更新数据库

    抱歉没有说出我的问题 实际上我想更新数据库中的数据 但现在的问题是 即使我尝试选择批准或拒绝ajax仍然不会更新 我是 ajax 新手 尝试在网络上搜索 但我的代码仍然有问题 这是我的 php 页面
  • HTML 报纸专栏

    我正在尝试使用文本块创建报纸样式的专栏 我希望文本均匀分布在两列中 这样可以对文本长度的变化做出反应 仅使用 HTML CSS 可以吗 如果不行 可以使用 javascript 吗 Thanks 两个注意事项 适用于印刷媒体的内容不适用于显
  • 数学表达式的自定义解释器

    我必须评估大量包含变量的表达式 并且我正在考虑编写一个小型自定义解释器以保持编译快速且小型 但是我对这个主题没有经验 并且有一些问题 假设我们有一个包含数学表达式和一组有限对象的文件 该文件可能如下所示 expr x y z 2 x y x