Excel-подобный разбор игрушечной формулы - PullRequest
0 голосов
/ 03 июня 2011

Я хотел бы создать грамматику для разбора игрушечного языка формул, напоминающего синтаксис S-выражения.

Я прочитал книгу «Начало работы с PyParsing», и она включила в себя очень хороший раздел, который охватывает подобную грамматику.

Два примера данных для анализа:

sum(5,10,avg(15,20))+10
stdev(5,10)*2

Теперь я пришел к грамматике, которая как бы разбирает формулу, но игнорирует расширение функций и приоритета операторов.

Что было бы лучше продолжать с ним: следует ли добавить parseActions для слов, которые соответствуют одному из имен функций (sum, avg ...). Если я строю вложенный список, я мог бы сделать первый анализ глубины анализа результатов и оценить функции?

1 Ответ

3 голосов
/ 04 июня 2011

Немного сложно посоветовать, не видя больше вашего кода. Тем не менее, из того, что вы описываете, кажется, что вы в основном разбираетесь в символах, чтобы распознать различные биты пунктуации и отличить имена переменных от числовых констант от алгебраических операторов. nestedExpr придаст некоторую структуру, но только базовую вложенность в скобках - это все еще оставляет обработку приоритета оператора для вашей работы после разбора.

Если вы изучаете синтаксический анализ инфиксной нотации, существует последовательность примеров анализа и просмотра (см. На странице Примеры випинга ). Начнем с fourFn.py, который на самом деле является пять парсером записи инфиксных функций. Посмотрите его метод BNF () и получите представление о том, как работают рекурсивные определения (пока не беспокойтесь о действиях разбора pushFirst). Путем структурирования синтаксического анализатора таким образом, приоритет оператора встроен прямо в анализируемые результаты. Если вы анализируете 4 + 2 * 3, простой токенизатор просто дает вам ['4','+','2','*','3'], а затем вам нужно выяснить, как сделать 2 * 3, прежде чем добавлять 4, чтобы получить 10, а не только грубую силу, добавить 4 и 2, а затем умножить на 3 (что дает неправильный ответ 18). Анализатор в fourFn.py даст вам ['4','+',['2','*','3']], что является достаточной структурой, чтобы вы могли оценить часть 2 * 3, прежде чем добавить ее в 4.

Вся эта концепция синтаксического анализа инфиксной записи с приоритетом операций настолько распространена, что я написал вспомогательную функцию, выполняющую большую часть тяжелой работы, которая называется operatorPrecedence. Вы можете увидеть, как это работает в примере simpleArith.py, а затем перейти к eval_arith.py, чтобы увидеть, что расширения должны создать оценщик анализируемой структуры. simpleBool.py - еще один хороший пример, показывающий приоритет для логических терминов AND и ED вместе.

Наконец, поскольку вы делаете что-то, похожее на Excel, взгляните на excelExpr.py. Он пытается справиться с некоторыми безумными угловыми случаями, которые возникают при попытке оценить ссылки на ячейки Excel, в том числе ссылки на другие листы и другие рабочие книги.

Удачи!

...