Декорирование дерева разбора с использованием атрибутной грамматики - PullRequest
4 голосов
/ 13 октября 2011

Учитывая следующую грамматику атрибута для объявлений типов, мне нужно иметь возможность создать дерево разбора для любой заданной строки, например «A, B: C;», а затем украсить дерево.

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

decl -> ID decl_tail
    decl.t := decl_tail.t
    decl_tail.in_tab := insert(decl,in_tab, ID.n, decl_tail.t)
    decl.out_tab := decl_tail.out_tab
decl_tail -> , decl
    decl_tail.t := decl.t
    decl.in_tab := decl_tail.in_tab
    decl_tail.out_tab := decl.out_tab
decl_tail -> : ID ;
    decl_tail.t := ID.n
    decl_tail.out_tab := decl_tail.in_tab

1 Ответ

2 голосов
/ 31 октября 2013

Через несколько лет, я надеюсь, вы хорошо закончили свою домашнюю работу:)

о вашем упражнении:

decl.t и decl_tail.t - это синтезированные атрибуты, которые копируют имя типа (ID.n) и передают его для каждого родительского производства в дереве синтаксического анализа

при достижении производства decl -> ID decl_tail атрибут in_tab сохраняет своего рода список взаимосвязей между идентификаторами и типами (неясно, тип in_tab, но мы можем принять список кортежей (identifier; type) ). Этот атрибут наследуется, поэтому список начнет составляться в самом верхнем производстве (крайний левый идентификатор), продолжит его конструирование слева направо и завершит его в крайнем правом идентификаторе.

Затем список заканчивается для построения, когда достигается decl_tail -> : ID;, поэтому синтезированный атрибут (out_tab) используется для повторного синтеза результата с начальным символом.

этот рисунок был лучшим, что я мог сделать для рисования декорированного дерева и графика зависимости:

enter image description here

Синие стрелки - это синтез атрибута t, зеленые стрелки - как составлен список in, а красные стрелки - как результат синтезируется в исходный символ

...