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