использовать переменные в парсере Lemon?

Я хочу разрешить математические переменные в моем приложении, управляемом парсером Lemon. Например, если пользователь вводит x ^ 2 + y, я хочу иметь возможность оценить это для 100 000 различных пар значений x и y, надеюсь, без повторного анализа каждый раз. Единственный способ, который я могу придумать, - это заставить синтаксический анализатор генерировать дерево объектов, которое затем оценивает выражение при получении ввода. Есть ли способ лучше/проще/быстрее?

Производительность может быть проблемой здесь. Но я также забочусь о простоте кодирования и сопровождения кода.


person William Jockusch    schedule 08.05.2012    source источник


Ответы (2)


Если вам нужен наиболее удобный для сопровождения код, оценивайте выражение при разборе. Не стройте дерево.

Если вы хотите много раз выполнять выражение повторно, а выражение сложное, вам нужно будет избегать повторного анализа (в порядке от наиболее к наименее поддерживаемому): построить дерево и оценить, сгенерировать многопоточный код и оценить, сгенерировать собственный код и оценивать.

Если выражения, как правило, такие же простые, как в вашем примере, синтаксический анализатор рекурсивного спуска с ручным кодированием, который оценивает на лету, вероятно, будет очень быстрым и будет работать довольно хорошо даже для 100 000 итераций. Такие синтаксические анализаторы, скорее всего, потребуют гораздо меньше времени для выполнения, чем Lemon.

person Ira Baxter    schedule 12.05.2012

Это действительно то, как вы обычно это делаете, если только вы не хотите генерировать фактический (реальный или виртуальный) код. x и y будут просто переменными в вашем случае, поэтому вы должны заполнить фактические значения, а затем вызвать свою функцию Evaluate для оценки выражения. Тогда узел дерева будет содержать указатели на переменные x и y и так далее. Не нужно разбирать его для каждой пары тестовых значений.

person 500 - Internal Server Error    schedule 08.05.2012