Mathematica解析器和转换器
FoxySheep的Python项目详细描述
这是robertjacobson的Python实现的FoxySheep解析器和lexer for Mathematica。它已经被剥离和重组了一点。在
示例
安装后,命令行转换器称为foxy-sheep 它可以将Mathematica InputForm转换为 Mathematica FullForm没有 安装Mathematica:以交互方式运行代码:
$ foxy-sheep Enter a Mathematica expression. Enter either an empty line, Ctrl-C, or Ctrl-D to exit. In[1]:= 1+2 Plus[1,2] In[1]:=D[4 x^2] D[Times[4,Power[x,2]]] In[1]:= $
来自Fast Introduction for Math Students的前几个示例
^{pr2}$从Python调用:
fromFoxySheepimportif2ff,if2pythonprint(if2ff("x^2-3x+4")# Prints: Plus[Power[x,2],Times[-1,3,x],4]print(if2ff("x^2-3x+4")# Prints (x ** 2 + -1 * 3)
如需更多演示,请运行foxy-sheep--file pytest/parse_expressions/SO1.m,或与其他 pytest/parse_expressions中的Mathamatica文件。在
有关foxy-sheep的帮助,请运行foxy-sheep--help。在
转换为Python
一个非常粗糙的Python翻译程序已经启动。虽然有 还有很多细节需要填写,一些基本的东西已经准备好了。在
以下是一些示例:
167.5 -> decimal.Decimal(167.5) 15^^8 -> int(15, 8) 132` -> (132) 1 / 10 3 -> (1 / 10 * 3) x^2 + y^2 -> (x ** 2 + y ** 2) GCD[12, 15] -> math.gcd(12, 15) Range[10] -> range(10) {a, b, c, d}[[3]] -> [a, b, c, d][2] # Handles 0-1 conversion {a, b, c, d, e, f}[[2 ;; 4]] -> [a, b, c, d, e, f][1:3] # ditto
通过将“InputForm”输入转换为 “OutputForm”解析树,然后使用它转换为Python AST。 最后使用Python模块astor将其转储到文本。在
为什么我们要经历更复杂的转换一个字符串到另一个字符串?在
通过保持结构为AST,我们可以考虑更强大的 转换和使用Python AST中存在的例程
例如,将{1,2,3}+2翻译成Python,虽然现在还没有处理,但是可以 通过观察加号的操作数类型来完成,注意其中一个是标量 另一个是列表。在
重新生成lexer/parser
要更改语法,您需要ANTLR解析器生成器 (antlr4),已安装4.7.x版。在
要(重新)生成所需的lexer/parser
$ make
生成的文件放在FoxySheep/generated中。在
ANTLR4生成的文件假定位于名为generated的子目录中,其中包含一个空的__init__.py文件。有关详细信息,请参见Makefile。在
FoxySheepLexer必须子类Lexer
为了使生成的antlr4 lexer正常工作,我们需要修补生成的Python lexer FoxySheep.lexer.py;补丁文件FoxySheep.lexer.py.patch执行此操作。 FoxySheepParser.py的Makefile目标包含patch命令。在
如果修补没有完成,您将在尝试运行的lexer中得到一个AttributeError异常,例如通过foxy-sheep。在
AttributeError: 'FoxySheepLexer' object has no attribute 'checkAdditiveOp'
另请参见
- 项目
标签: