Nearley语法将相同的文本作为终端和非终端匹配,产生错误的结果

时间:2018-05-23 07:50:51

标签: parsing grammar abstract-syntax-tree symbolic-math nearley

语法菜鸟在这里。

我需要解析类似于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的孩子)。循环问题仍然存在。我正在调查,但我可能会发现另一个可怕的黑客。如果可能的话,我宁愿看到语法修正而不是转换函数。

0 个答案:

没有答案