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