Проще всего определить тип (обычно структуру) для каждого терминала и нетерминал в вашем языке.Затем каждое использование (не) терминала имеет доступ к типу, и каждое назначение атрибута идет против соответствующего временного интервала в структуре, связанной с (не) терминалом.
Я предлагаю вам назвать ваши структуры реализации после грамматических токенов.Таким образом, тип структуры атрибута для T будет "T_attributes {...}"
Для вашего примера, "type" будет слотом в T_attributes.Вероятно, вы хотели написать в аннотации:
TYPE -> 'integer' ; -- 'integer is a keyword'
TYPE.type = "int"; -- the type of an 'integer' is "int"
Учитывая, что вы делаете это вручную, вы вручную скомпилируете присвоение атрибута для выполнения, когда обход дерева достигает узла TYPE.