Применение посетителя к синтаксическому дереву - PullRequest
1 голос
/ 04 февраля 2012

Я строю переводчик переменного тока.Мой AST использует составной шаблон.Чтобы проверить семантику и выполнить действия, я хочу использовать шаблон посетителя.Теперь есть одна проблема.Это грамматическое правило препроцессора c: if-section = if-group [elif-groups] [else-group] endif-line.Посетителю if-section требуется информация о дочерних узлах, чтобы узнать, какие группы необходимо пропустить.В шаблоне "посетитель" каждый метод "посещения" возвращает пустоту.Поэтому я не могу получить информацию об этих узлах (только с добавлением информации в узлы, но это ужасно ...).Есть ли возможности?

1 Ответ

2 голосов
/ 04 февраля 2012

Вы прибили проблему: у вас должна быть дополнительная информация помимо необработанных данных, входящих в AST.

Вы можете связать всю эту дополнительную информацию только с отдельными узлами дерева: если вы сделаете это, вы в конечном итоге создадите так называемое атрибутивное дерево. Теоретически (и если вы работаете), вы заставляете эту идею работать полностью. Вашему посетителю может потребоваться проверить / обновить информацию, связанную не только с узлом AST, который он посещает, но и с ключевыми детьми и родителями.

На практике полезно создавать вспомогательные структуры данных (например, таблицы символов), к которым может обращаться посетитель (и обновлять) по мере его прохождения по дереву. В результате вы получаете вид вырожденного атрибутивного дерева: вы связываете фрагменты таблицы символов с узлами AST, которые образуют области.

Вы искусственно запретили посетителю возвращать любое значение; если вы этого не сделаете, дочерний посетитель может передать полезные значения родительскому посетителю, что позволит родителю делать меньше специальных действий, достигая дерева.

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

...