Опубликован: 27.09.2006 | Уровень: для всех | Доступ: платный | ВУЗ: Московский государственный индустриальный университет
Лекция 12:

Проект "Компилятор формул"

Грамматики языка правильных арифметических формул

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

В качестве алфавита \Sigma возьмем то же самое множество, что и раньше, состоящее из двух круглых скобок (открывающей и закрывающей), четырех знаков арифметических операций ( +, -, * и / ) и 26-и идентификаторов от a до z, которыми будут обозначаться произвольные целые числа:

\Sigma = \{ (, ), +, -, *, /, a, b, \ldots, z \}.

В качестве метаалфавита рассмотрим множество из трех нетерминалов:

N=\{\alpha,\beta,\gamma\},
где символ \alpha будет обозначать формулу, \betaимя переменной, а \gamma — арифметическую операцию.

Множество правил P грамматики G_1 = (\Sigma, N, P,
S) зададим так:

$\alpha$ $\rightarrow$ $(\alpha)$ $\mid$ $\beta$ $\mid$ $\alpha            \ \gamma\ \alpha$
$\beta$ $\rightarrow$ 
$a$ $\mid$ $b$ $\mid$
$\ldots$
            $\mid$ $z$ \\
$\gamma$ $\rightarrow$
$+$ $\mid$ $-$ $\mid$
$*$ 
            $\mid$ $/$
Деревья вывода формулы x+y*z

Рис. 12.2. Деревья вывода формулы x+y*z

Стартовым метасимволом этой грамматики является нетерминал \alpha, а примером вывода в ней может служить следующий вывод формулы x+y:

\alpha \rightarrow \alpha\ \gamma\ \alpha \rightarrow x\ \gamma\
\alpha
\rightarrow x +\alpha \rightarrow x+y.

Для формулы x+y*z существует два существенно различных множества эквивалентных между собой цепочек вывода, каждому из которых соответствует свое дерево вывода. Эти деревья изображены на рис. 12.2 и отличаются друг от друга порядком появления в формуле операций + и *. Хотя в результате различных выводов получается одна и та же формула, вычисления по ним дадут различные результаты. В одном случае выражение x+y*z трактуется как (x+y)*z, а в другом — как x+(y*z).

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

Множество нетерминалов для этой грамматики будет состоять из четырех метасимволов — F, T, M и V, обозначающих соответственно формулу, терм, множитель и имя переменной. Множество правил P грамматики G_2 зададим так:

$F$ $\rightarrow$ $T$
$\mid$ $T+F$ $\mid$ $T-F$
$T$ $\rightarrow$ $M$
$\mid$ $M*T$ $\mid$ $M/T$
$M$ $\rightarrow$ $(F)$
$\mid$ $V$
$V$ $\rightarrow$ $a$
$\mid$ $b$ $\mid$ $\ldots$
$\mid$ $z$

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

Грамматика G_0 отличается от только что рассмотренной G_2 порядком следования нетерминалов в правой части первых двух правил:

$F$ $\rightarrow$ $T$
$\mid$ $F+T$ $\mid$ $F-T$
$T$ $\rightarrow$ $M$
$\mid$ $T*M$ $\mid$ $T/M$
$M$ $\rightarrow$ $(F)$
$\mid$ $V$
$V$ $\rightarrow$ $a$
$\mid$ $b$ $\mid$ $\ldots$
$\mid$ $z$

Важные свойства именно этой грамматики определяют ее обозначение. Именно грамматика G_0 языка правильных арифметических формул будет использоваться в целом ряде последующих учебных курсов.

Еще один вариант грамматики (назовем ее G_3 ) таков:

$F$ $\rightarrow$ 
$T\{+T\}$ $\mid$ $T\{-T\}$
$T$ $\rightarrow$ 
$M\{*M\}$ $\mid$ $M\{/M\}$
$M$ $\rightarrow$  $(F)$
$\mid$ $V$
$V$ $\rightarrow$ $a$
$\mid$ $b$ $\mid$ $\ldots$
$\mid$ $z$

Фигурные скобки в этой записи означают повторение фрагмента, в них стоящего, нуль или более раз. Таким образом, первое правило этой грамматики означает, что метасимвол F может быть преобразован в T, T+T, T-T, T+T+T, T+T-T, T-T+T, T-T-T и т.д.

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

Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева
Ирина Тютрина
Ирина Тютрина
Россия, Усолье-Сибирское
Глеб Бочкарёв
Глеб Бочкарёв
Россия