Грамматика Nearley соответствует одному и тому же фрагменту текста терминалу и нетерминалу один за другим, что приводит к неверному результату - PullRequest
0 голосов
/ 23 мая 2018

Грамматика noob здесь.

Мне нужно разобрать математические формулы, подобные тем, которые приняты SymPy, и преобразовать их в некое синтаксическое дерево слева направо, используя Nearley эту грамматику .

Проблема возникает, когда у меня есть выражение типа 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 с тем же именем) с ужасным хаком.Круговая проблема остается.Я расследую, но, вероятно, найду еще один ужасный взлом.Я предпочел бы увидеть исправление для грамматики, а не для функций преобразования, если это вообще возможно.

...