Как принять во внимание область при создании таблицы символов с помощью yacc? - PullRequest
5 голосов
/ 01 декабря 2009

Мой парсер yacc создает таблицу символов, но мне нужно принять во внимание область видимости. Как бы я это сделал? Я слышал кое-что о том, как при выходе из области видимости таблица символов уничтожается. Все еще не очень ясно, как это сделать.

Ответы [ 2 ]

3 голосов
/ 01 декабря 2009

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

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

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

2 голосов
/ 01 декабря 2009

Эта проблема только косвенно связана с yacc, как вы, кажется, правильно определили. (Все, что делает yacc - это сопоставляет входные строки со строками в вашей грамматике.)

Итак, вы можете выполнять все управление символами и всю другую семантическую обработку в коде. У вас есть любая структура данных, которую вы можете себе представить.

Некоторые мысли, которые нужно организовать:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...