S-атрибутная грамматика

S-атрибутная грамматика

Атрибутная грамматика, все атрибуты которой являются синтезируемыми

Link to original

Проведение семантического анализа для S-атрибутных грамматик

Замечание: естественный способ вычисления синтезируемых атрибутов “снизу-вверх” совпадает с восстановлением “снизу-вверх” дерева вывода при LR-анализе. Следовательно, синтаксическй анализ можно совместить с семантическим анализом

То есть, если имеем бесконфликтный LR-анализатор для S-атрибутной грамматики, то можем за одну работу анализатора (проведение синтаксического анализа) заодно вычислить значения всех атрибутов с использованием того же анализатора (то есть провести семантический анализ)

Чтобы провести вычисление атрибутов при работе анализатора, рядом с основным стеком заводится второй стек , в котором будут храниться дополнительная информация для вычисления значения всех атрибутов всех грамматических символов. В нем будут храниться значения атрибутов, необходимые для вычисления.

Модификация алгоритма работы LR-анализатора

Считаем, что для каждого грамматического символа в рассматриваемой S-атрибутной грамматике задан только один атрибут

Логика работы LR-анализатора (правила, по которым меняются конфигурации) не меняются, добавляются лишь новые правила для работы с семантическими полями в записях стека, а именно:

Действия при переносе

Если во время работы анализатора на очередном такте будет выполняться операция перенос , а на каретке в этот момент находится терминал , имеющий “явно заданный” атрибут (лексическое значение терминала):

Если же

Действия при свертке

Если во время анализатора на очередном такте

List<AttributeValues> parameters = new ArrayList(r);
for(int i = 0; i < r; i++) {
	parameters.add(STACK.pop());
}
Collections.reverse(parameters);
STACK.push(f(parameters))

Пример проведения семантического анализа для S-атрибутных грамматик

Распишем подробно, как происходит семантический анализ числового выражения w = (2+4)+5*3, которому соответствует слово в расширенной грамматике:

Для этого пронумеруем ее правила вывода:

НомерПравило вывода
0
1
2
3
4
5
6

Построим LR-анализатор для этой грамматики (не важно какой именно. Главное, что он бесконфликтный)

ACTIONGOTO

Зададим атрибуты (синтезируемые) и правила для их вычисления:

Номер правилаПравило выводаСемантическое правило
1
2
3
4
5
6

В случае слова атрибут имеет символ и может принимать значения

ТактСтекОбрабатываемое словоДействиеДействия со
1Перенос Ничего не кладем в стек, так как символ не имеет атрибут
2Перенос Кладем в 2, так как символ имеет атрибут . Здесь атрибут
3Свертка Достаем 1 символ из стека и запоминаем. 1, так как правая часть правила , по которому происходит свертка имеет длину 1. Применяем правило 6. В качестве параметра подставляем взятый элемент стека. Результат вычисления кладем в стек
4Свертка Рассуждения, аналогичные такту 3
5Свертка Рассуждения, аналогичные такту 3
6Перенос Рассуждения, аналогичные такту 1
7