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-анализатор для этой грамматики (не важно какой именно. Главное, что он бесконфликтный)
| ACTION | GOTO | ||||||||
|---|---|---|---|---|---|---|---|---|---|
Зададим атрибуты (синтезируемые) и правила для их вычисления:
| Номер правила | Правило вывода | Семантическое правило |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 | ||
| 6 |
В случае слова атрибут имеет символ и может принимать значения
| Такт | Стек | Обрабатываемое слово | Действие | Действия со | |
|---|---|---|---|---|---|
| 1 | Перенос | Ничего не кладем в стек, так как символ не имеет атрибут | |||
| 2 | Перенос | Кладем в 2, так как символ имеет атрибут . Здесь атрибут | |||
| 3 | Свертка | Достаем 1 символ из стека и запоминаем. 1, так как правая часть правила , по которому происходит свертка имеет длину 1. Применяем правило 6. В качестве параметра подставляем взятый элемент стека. Результат вычисления кладем в стек | |||
| 4 | Свертка | Рассуждения, аналогичные такту 3 | |||
| 5 | Свертка | Рассуждения, аналогичные такту 3 | |||
| 6 | Перенос | Рассуждения, аналогичные такту 1 | |||
| 7 |