wik*_*kke 5 compiler-construction parsing wolfram-mathematica octave parser-generator
我必须将很多文件从Mathematica移植到Octave.我在1991年找到了一个Lisp Mathematica解析器,但我并不熟悉Lisp,所以我想知道是否有人有任何移植方向的经验.在研究并向WolframAlpha发送电子邮件并且没有实际结果之后,我将不得不使用Lex和Yacc来生成交叉编译器.这对我来说似乎有些过分.
任何提示或指示将不胜感激.
澄清:
我开始使用很多Mathematica文件,他们的功能必须移植到Octave.我只是希望在尽可能短的时间内实现这一目标,因为这是我老板在节假日期间给我做的一项任务.感谢您的帮助,我将查看FullForm并检查Mathematica文件中的非便携式内容.如果只能转换一定数量的文件,我将不得不手工完成其余的工作,这需要一些时间.所以这基本上是从一个程序转移到另一个程序的一次性事情.
正如列昂尼德的帖子所述,任务似乎过多,但我是学生研究助理,这正是我必须在我的部门完成的任务.
abc*_*bcd 18
我经常使用MATLAB(Octave的$$$$版本)和Mathematica,我非常有信心不可能实现自动从Mathematica转换到另一个的解析器/移植器.对于初学者,MATLAB/Octave不支持模式匹配或术语重写或函数编程,所有这些都是Mathematica中最常见和最优的编码风格.
例如,考虑纯函数(Mathematica)
f = #^2&;
Run Code Online (Sandbox Code Playgroud)
在MATLAB/Octave中确实没有相同的东西.匿名函数足够接近你可以写成(MATLAB/Octave)
g=@(x)x.^2;
Run Code Online (Sandbox Code Playgroud)
但是,Mathematica将象征性地对传递给函数的任何东西进行平方,而MATLAB仅适用于标量/向量/矩阵.因此,即使您遇到纯函数,也无法在不了解传递给纯函数的内容的情况下自动将其重写为匿名函数.
MATLAB/Octave中缺少的另一个概念是懒惰评估/ SetDelayed或:=mathematica.所以,如果你的纯函数是
f := a #^2 &;
Run Code Online (Sandbox Code Playgroud)
然后,f使用被调用a时的值f.但是,将其写为匿名函数:
g = @(x)a*x.^2;
Run Code Online (Sandbox Code Playgroud)
将捕获a定义时的值,形成一个闭包.我在这个答案中提供了一个更好的例子
如果你有一个主要以Mathematica中的程序风格编写的代码库,那么理论上可能会转换为八度音程.但是,我很难想象一个完全以程序方式编写的严肃的Mathematica项目.简而言之,需要一个人以一种习惯的方式将逻辑翻译成每种语言
最后,如果您尝试将表达式从Mathematica转换为MATLAB/Octave,那么您可能需要查看该ToMatlab包.我经常使用它来转换Mathematica中计算的表达式,以便在MATLAB中的不同代码库中使用.一个简单的例子是:
expr = Sin[x + x^3] + ArcSin[y];
ToMatlab[expr]
Out[1]= sin(x + x.^3) + asin(y)
Run Code Online (Sandbox Code Playgroud)
Leo*_*rin 11
您不需要Mathematica解析器来移植.您需要在Mathematica中编写移植程序并重用Mathematica自己的解析器.这与方向相同SymbolicC.如果我是你,我将构建一些Mathematica子语言(称之为SymbolicOctave),具有完全惰性的头部,然后编写一个名为say的函数ToOctaveCodeString.您可以参考实现SymbolicC来了解如何为C完成此操作 - 它可以在Mathematica发行版中使用.
第二个也是最复杂的部分是将Mathematica代码子集中的翻译器编写成这种惰性SymbolicOctave表示.这部分非常简单,因为(大概)Mathematica语言有许多Octave语言本身不支持的功能,你必须在Octave中实现它们.在这里,您还需要使用某些技术来生成Mathematica Mathematica代码,其中一个我在本答案中描述.这一切都假设您可以访问Mathematica.
说完这一切之后,如果有这样的选择,我会放弃一般任务并使用Mathematica.这项任务似乎只适用于Mathematica的一个非常狭窄和特定的子集,即使这样也是非平凡的.如果有一个选项链接Mathematica并使用Octave而不是将所有内容移植到Octave,我就会这样(技术上这应该很容易).鉴于现在Mathematica的商业许可证成本相当低(与竞争产品相比,特别是考虑到与Octave类似的产品),考虑到开发转换器的开发成本,它在财务上也可能是更好的选择.这将是任何好事.