- •2.2 Определение непроизводящих символов.
- •2.5 Исключение леворекурсивных правил.
- •3.4.2 Построение функции перв(µ)
- •Построение Магазинного автомата по кс-грамматике.
- •Построение нисходящих магазинных распознавателей.
- •Описание перевода. Су-схемы.
- •Описание перевода. Т-грамматики.
- •17.Соответствие между т-грамматики и су-схемы.
- •Определение магазинного нисходящего преобразователя и его работа.
- •Построение нисходящего преобразователя.
- •20. Атрибутные грамматики. Типы атрибутов. Правила вычисления атрибутов.
- •Грамматики простого присваивания. Построение формы простого присваивания.
- •Правила работы нисходящего атрибутного преобразователя.
- •Построение нисходящего атрибутного преобразователя.
- •Программная реализация нисходящего атрибутного преобразователя.
Построение нисходящего преобразователя.
Построение преобразователя.
Покажем теперь, как по заданной СУ - схеме можно построить детерминированный преобразователь. В начале по заданной СУ - схеме построим транслирующую грамматику Г. Это всегда можно сделать, поскольку заданная СУ - схема должна быть простой. Если входная грамматика заданной СУ - схемы относится к классу LL(1) -грамматик, то и входная грамматика транслирующей грамматики также должна относиться к этому классу, поскольку при построении Т - грамматики входные правила изменениям не подвергались. Учитывая, что искомый преобразователь должен в процессе формирования выхода осуществлять и распознавание входной цепочки, будем его строить по правилам транслирующей грамматики, используя правила построения распознавателя. Такой преобразователь должен воспроизводить левый вывод входной цепочки в магазине и удалять терминальные символы, на ходящиеся в вершине, при совпадении их с очередным символом на входной ленте. Однако при этом в магазин будут записываться выходные символы, содержащиеся в правилах Т - грамматики, и возникнут неопределенные ситуации при появлении выходного символа в вершине магазина. Чтобы исключить такие ситуации, дополним этот правила построения преобразователя следующим правилом: при появлении выходного символа в вершине магазина он должен передаваться на выход независимо от того, какой символ находится под входной головкой. Построение функции переходов МП (1) для всех правил вида <A> --> b, где b Vтвх и (Vтвх U Vтвых U Va)*, строим команды: ( s0, b, A)=( s0, ', $ ), где ' - зеркальное отображение цепочки . (2) Для всех правил вида <A> --> <B>, где B Va и (Vтвх U Vтвых U Va)*, строим команды: *( s0, u, A ) = ( s0, B , $ ), где u ВЫБОР(<A> --> <B>вх) и вх - цепочка, полученная из путем удаления из нее всех выходных символов. . (3) Для всех правил вида <A> --> $ строим команды: *( s0, u, A ) = ( s0, $, $ ), где u ВЫБОР(<A> --> $). (4) Для всех символов b, принадлежащих, Vтвх , стоящих на первом месте в правой части правил транслирующей грамматики, т.е. символов,заносимых в магазин, строим правило: ( s0, b, b ) = ( s0, $, $ ). (5) Для всех выходных символов {u}, таких что u Vтвых U {$}, строим команды: *( s0, z, {u} ) = ( s0, $, {u} ), где z Vтвх. Точнее команды строятся для сочетаний {u}z, таких что z может следовать за {u} в цепочках, выводимых в за данной грамматике. (6) Заключительное правило строим так: ( s0, $, h0 ) = ( s0, $, $ ).
Пример построения преобразователя. Применение правил построения команд преобразователя рассмотрим на примере транслирующей грамматики Г, которая описывает перевод инфиксных выражений, состоящих из идентификаторов и знаков + и *, в постфиксные польские выражения. Эта грамматика имеет следующую схему: Г 4. 2 : R = {<E> +<E><E>{+}, <E> x<E><E>{x}, <E> a{a}}
Используя правило построения команд преобразователя (1) для правил грамматики, начинающихся входным терминальным символом, получаем команды преобразователя Мп1: q(s0, +, <E>) = (s0, {+}<E><E>, $), q(s0, *, <E>) = (s0, {*}<E><E>, $), q(s0, a, <E>) = (s0, {a}, $)
Правила построения команд вида (2),(3),(4) к заданной грамматике неприменимы, поэтому с помощью правил вида (5) построим команды, обеспечивающие передачу выходных символов на выход. Эти команды имеют вид: q*(s0, +, {+}) = (s0, $, +), q*(s0, *, {+}) = (s0, $, +), q*(s0, a, {+}) = (s0, $, +), q*(s0, $', {+}) = (s0, $, +), q*(s0, *, {*}) = (s0, $, *), q*(s0, +, {*}) = (s0, $, *), q*(s0, *,{a}) = (s0, $, *), q*(s0, $',{*}) = (s0, $, *), q*(s0, a,{a}) = (s0, $, a), q*(s0, +{a}) = (s0, $, a), q*(s0, *,{a}) = (s0, $, a), q*(s0, $', {a}) = (s0, $, a)
Для перехода в заключительное состояние s1 в соответствии с правилом (6) построим команду:
q(s0, $', h0) = (s1, $, $) Чтобы посмотреть как работает построенный преобразователь, рассмотрим построение выходной цепочки для входа +a*aa. Последовательность конфигураций, получаемых с помощью команд преобразователя имеет вид: (s0, +a*aa, h0E, $) |-- (s0, a*aah0{+}EE, $) |-- (s0, *aa, h0{+}T{a}, $) |-- (s0, *aa, h0{+}E, a) |-- (s0, aa, h0{+}{*}T{a}, a) |-- (s0, a, h0{+}{*}E, aa) |-- (s0, $, h0{+}{*}{a}, aa) |-- (s0, $, h0{+}{*}, aaa) |-- (s0, $, h0{+}, aaa*)|-- (s0, $, h0, aaa*+) |-- (s0, $, $, aaa*+).
Результатом работы преобразователяявляется выходная цепочка aaa*+, представляющая постфиксную запись заданной входной цепочки.
