如何以编程方式获取公式的派生形式?

苏雷什·苏贝迪(Suresh Subedi)

例如,如果我有I = V / R作为输入,我希望V = I * R和R = V / I作为输出。我知道这可能是一个广泛的问题,但是我应该如何开始呢?构建后缀符号/解释器时,应该使用堆栈/树吗?

艾拉·巴克斯特(Ira Baxter)

您需要能够用符号表示公式,并应用代数规则来操纵这些公式。

最简单的方法是定义将接受您的公式的语法。最好明确定义为BNF。这样,您可以为此类公式构建解析器;完成适当的解析器即可构建代表该公式的抽象语法树。您可以使用lex和yacc或ANTLR之类的工具。这是我关于如何使用自定义递归下降解析器的建议:是否有8位嵌入式系统上可用的flex / bison替代方案?

一旦有了对公式进行编码的树,就可以实现根据代数定律修改树的过程,例如:

 X=Y/Z => X*Z = Y if Z ~= 0

现在,您可以通过编写程序代码来实现这样的规则,该程序代码遍历树,找到与模式的匹配项,然后粉碎树以产生结果。这是非常简单的编译器技术。如果您很热心,则可以很快地编写半打代数定律。您会发现执行此操作的代码非常复杂,在树上爬升,下降,匹配节点以及粉碎节点之间的链接以产生结果的过程。

另一种方法是使用程序转换系统,该系统可以让您

  • 直接为您的公式定义语法,
  • 直接根据您的语法定义(树)重写规则(例如,基本上您直接在上面提供了代数规则),
  • 根据需要应用重写规则
  • 从AST重新生成符号公式

我公司的DMS软件再造工具包可以做到这一点。您可以在“变换规则定义的代数”中看到一个完整的代数和微积分示例(无法在此处复制)。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何以编程方式获取jmap直方图?

如何以编程方式获取AppBar的高度?

如何以编程方式获取?attr /值

如何以编程方式获取设备DPI?

如何以编程方式获取工作区?

如何以编程方式获取 {% url '...' %} 的值?

如何以编程方式设置 wxPanel 派生类维度?

Wicket:如何以编程方式呈现页面并以字符串形式获取结果?

如何以编程方式向重力形式添加条目

如何以编程方式提交Angular反应形式?

如何以编程方式验证反应形式控件?

如何以编程方式获取 UWP(apps) 目标 appversion?

如何以编程方式获取android动画缩放速度?

如何以编程方式从spring-boot-actuator获取指标?

Android:如何以编程方式获取布局的宽度

如何以编程方式获取结构的字段数?

如何以编程方式获取 gRPC / protobuf 版本?

Godot如何以编程方式获取碰撞对象的碰撞层?

如何以编程方式获取nim编译器版本?

如何以编程方式从apt获取软件包列表?

如何以编程方式从 OSGI 蓝图中获取 bean?

如何以编程方式获取Gradle模块名称

如何以编程方式获取VC ++包含目录?

如何以编程方式获取按钮名称 xamarin 表单

如何以编程方式获取Rails路线约束?

如何以编程方式获取Lantronix XPort IP地址

如何以编程方式获取python.exe位置?

ImageView,如何以编程方式获取可绘制对象的getSrc?

Android-如何以编程方式获取屏幕截图