- •2.2 Определение непроизводящих символов.
- •2.5 Исключение леворекурсивных правил.
- •3.4.2 Построение функции перв(µ)
- •Построение Магазинного автомата по кс-грамматике.
- •Построение нисходящих магазинных распознавателей.
- •Описание перевода. Су-схемы.
- •Описание перевода. Т-грамматики.
- •17.Соответствие между т-грамматики и су-схемы.
- •Определение магазинного нисходящего преобразователя и его работа.
- •Построение нисходящего преобразователя.
- •20.Атрибутные грамматики. Типы атрибутов. Правила вычисления атрибутов.
- •Грамматики простого присваивания. Построение формы простого присваивания.
- •Правила работы нисходящего атрибутного преобразователя.
- •Построение нисходящего атрибутного преобразователя.
- •Программная реализация нисходящего атрибутного преобразователя.
Построение нисходящего преобразователя.
Построение преобразователя.
Покажем теперь, как по заданной СУ - схеме можно построить детерминированный преобразователь. В начале по заданной СУ - схеме построим транслирующую грамматику Г. Это всегда можно сделать, поскольку заданная СУ - схема должна быть простой. Если входная грамматика заданной СУ - схемы относится к классу LL(1) -грамматик, то и входная грамматика транслирующей грамматики также должна относиться к этому классу, поскольку при построении Т - грамматики входные правила изменениям не подвергались. Учитывая, что искомый преобразователь должен в процессе формирования выхода осуществлять и распознавание входной цепочки, будем его строить по правилам транслирующей грамматики, используя правила построения распознавателя.Такой преобразователь должен воспроизводить левый вывод входной цепочки в магазине и удалять терминальные символы, на ходящиеся в вершине, при совпадении их с очередным символом на входной ленте. Однако при этом в магазин будут записываться выходные символы, содержащиеся в правилах Т - грамматики, и возникнут неопределенные ситуации при появлении выходного символа в вершине магазина. Чтобы исключить такие ситуации, дополним этот правила построения преобразователя следующим правилом: при появлении выходного символа в вершине магазина он должен передаваться на выход независимо от того, какой символ находится под входной головкой.Построение функции переходов МП (1) для всех правил вида<A> --> b, где bVтвх и(VтвхU VтвыхU Va)*, строим команды:( s0, b, A)=( s0, ', $ ), где' - зеркальное отображение цепочки. (2) Для всех правил вида<A> --> <B>, где BVa и(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}, таких что uVтвыхU {$}, строим команды: *( s0, z, {u} ) = ( s0, $, {u} ),где zVтвх. Точнее команды строятся для сочетаний {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*+, представляющая постфиксную запись заданной входной цепочки.