Проект "Компилятор формул"
Грамматики языка правильных арифметических формул
Разобравшись с языком программ стекового калькулятора, на который мы будем осуществлять перевод, попробуем теперь формально описать язык правильных арифметических формул, с которого этот перевод будет производиться. Для простоты ограничимся случаем, когда в формулах фигурируют только односимвольные переменные, запрещено использование унарных операций, а символ , обозначающий умножение, не может быть опущен.
В качестве алфавита возьмем то же самое множество, что и раньше, состоящее из двух круглых скобок (открывающей и закрывающей), четырех знаков арифметических операций ( , , и ) и 26-и идентификаторов от до , которыми будут обозначаться произвольные целые числа:
В качестве метаалфавита рассмотрим множество из трех нетерминалов:
где символ будет обозначать формулу, — имя переменной, а — арифметическую операцию.Множество правил грамматики зададим так:
Стартовым метасимволом этой грамматики является нетерминал , а примером вывода в ней может служить следующий вывод формулы :
Для формулы существует два существенно различных множества эквивалентных между собой цепочек вывода, каждому из которых соответствует свое дерево вывода. Эти деревья изображены на рис. 12.2 и отличаются друг от друга порядком появления в формуле операций и . Хотя в результате различных выводов получается одна и та же формула, вычисления по ним дадут различные результаты. В одном случае выражение трактуется как , а в другом — как .
Таким образом, грамматика хотя и задает язык правильных арифметических формул, не отражает старшинства операций (приоритетов). Тот же самый язык может быть задан с помощью иной грамматики , в которой этот недостаток устранен.
Множество нетерминалов для этой грамматики будет состоять из четырех метасимволов — , , и , обозначающих соответственно формулу, терм, множитель и имя переменной. Множество правил грамматики зададим так:
По ряду причин чуть позже нам понадобятся другие грамматики рассматриваемого языка.
Грамматика отличается от только что рассмотренной порядком следования нетерминалов в правой части первых двух правил:
Важные свойства именно этой грамматики определяют ее обозначение. Именно грамматика языка правильных арифметических формул будет использоваться в целом ряде последующих учебных курсов.
Еще один вариант грамматики (назовем ее ) таков:
Фигурные скобки в этой записи означают повторение фрагмента, в них стоящего, нуль или более раз. Таким образом, первое правило этой грамматики означает, что метасимвол может быть преобразован в , , , , , , и т.д.
Докажите самостоятельно, что все приведенные выше грамматики задают один и тот же язык правильных арифметических формул.