Теория и реализация языков программирования



             

Абсолютно незацикленные атрибутные грамматики - часть 3


p] of состояние; {локальный вектор состояния правил} A : set of атрибут;{состояние правила p} stop: boolean; begin if (EVAL [Stv[p], I] пуст) then A := I [ Stv[p], s := пусто , LStv := Stv; stop := false, EVAL [Stv[p], I] :='@' repeat if (
fpa<k> готовая к вычислению) then s := s || fpa<k>, A := A + a<k> else if (
поддерево k, результат Y которого не пуст) then s := s || V ISIT(k, I(Xk)
A), A := AUY ; for pi : Xk
u do PLAN(pi, I(Xk)
A, LStv) {в этой точке меняется значение LStv[pi]} end else stop := true end end until stop; EVAL [Stv[p], I] := s || st(A), Stv := A {Stv[p] меняется в точке вызова} end end; {тело программы} begin for I := 1 to p do St[i] := множество атрибутов терминалов правила i; PLAN({}, {}, St) end end.

Вычисление атрибутов на дереве t заключается в выполнении построенных планов в соответствии с изменениями состояний правил и осуществляется следующей программой:

begin каждое правило дерева t перевести в начальное состояние, определяемое множеством атрибутов терминалов; V ISIT(корень, {}) end.




Содержание  Назад  Вперед