语法菜鸟在这里。
我需要解析类似于SymPy接受的数学公式,并使用Nearley this grammar将它们转换为某种从左到右的语法树。
如果我的表达式为a*sin(x)*y
,其中sin
首先被识别为SY
,然后又被FN
,则会出现问题。如果我想能够解析变量(这就是SY
的用途),我认为这是一种必要的恶魔。结果类似于
[ { type: 'Symbol',
properties: { letter: 'a' },
children:
{ right:
{ type: 'Symbol',
properties: { letter: 'sin' },
children:
{ right:
{ type: 'Fn',
properties: { name: 'sin' },
children:
{ argument: { type: 'Symbol', properties: { letter: 'x' }, children: {} },
right: { type: 'Symbol', properties: { letter: 'y' }, children: {} } } } } } },
position: { x: 200, y: 200 } } ]
更糟糕的是,当表达式为a*sin(x)^y
时,我得到了
[ { type: 'Symbol',
properties: { letter: 'a' },
children:
{ right:
{ type: 'Symbol',
properties: { letter: 'sin' },
children:
{ right:
{ type: 'Fn',
properties: { name: 'sin' },
children:
{ argument: { type: 'Symbol', properties: { letter: 'x' }, children: {} },
superscript: { type: 'Symbol', properties: { letter: 'y' }, children: {} },
right: [Circular] } } } } },
position: { x: 200, y: 200 } } ]
我认为[Circular]
意味着某处存在某种邪恶的循环。
我怀疑我可以解决上面的第一个问题,如果两个“匹配”,则使用正确的SY
替换FN
的检查,但我宁愿避免这样的问题。我不知道第二个发生了什么 - 虽然我已经在这一整天了,我的思绪可能会变得模糊不清。我今天到办公室后会进行更多调查。
任何线索?
编辑:我设法用一个可怕的黑客“解决”第一个问题(Fn
作为同名Symbol
的孩子)。循环问题仍然存在。我正在调查,但我可能会发现另一个可怕的黑客。如果可能的话,我宁愿看到语法修正而不是转换函数。