Эффективное разграничение между ключевым словом и идентификаторами - PullRequest
2 голосов
/ 04 февраля 2012

Я строю компилятор и на этапе лексического анализатора:

Первоначально установите зарезервированные слова в таблицу символов. Поле записи таблицы символов указывает, что эти строки никогда не являются обычными идентификаторами, иговорит, какой токен они представляют.Мы предположили, что этот метод используется на рис. 3.14.Когда мы находим идентификатор, вызов installID помещает его в таблицу символов, если его там еще нет, и возвращает указатель на запись таблицы символов для найденной лексемы.Конечно, любой идентификатор, отсутствующий в таблице символов во время лексического анализа, не может быть зарезервированным словом, поэтому его токен является id.Функция getToken проверяет запись в таблице символов для найденной лексемы и возвращает любое имя токена, обозначенное в таблицах символов, где этот лексема представляет собой либо идентификатор, либо один из токенов ключевых слов, который был изначально установлен в таблице.ключевое слово, мне придется пройти через всю таблицу символов, это все равно, что сравнивать 'n' элементов для каждого ключевого слова / Id распознавания.Не будет ли это слишком неэффективно.Что еще я могу сделать?

Пожалуйста, помогите.

Ответы [ 3 ]

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

Если вы строите конечные автоматы для идентификации лексем, то их терминальные состояния должны соответствовать лексемам языка.

Вы можете оставить ключевые слова вне FSA, и вы получите только одно состояние терминала для строк, которые выглядят как идентификаторы. Это распространенная реализация при ручном кодировании FSA. У вас будет проблема, которую вы имеете сейчас. На практике для таблицы символов, независимо от того, что вы делаете с ключевыми словами, вам понадобится чрезвычайно быстрый поиск идентификатора, который в значительной степени предполагает, что вам нужно решение для хеширования. Если у вас есть это, то вы можете быстро выполнить поиск и проверить свой бит «это должно быть ключевое слово». Существует множество хороших хеш-схем; Как обычно, Википедия по хеш-функциям - неплохое место для начала. Это практическое решение; Я использую его в моем компиляторе PARLANSE (см. Мою биографию), который обрабатывает файлы с миллионами строк за несколько десятков секунд.

Это не самое быстрое решение. Лучше включать ключевые слова в FSA (это способствует использованию генератора лексеров, поскольку добавление всех ключевых слов в FSA с ручным кодированием неудобно, но не сложно). Если вы сделаете это, и у вас есть ключевые слова, которые выглядят как идентификаторы, например, goto , будут конечные состояния, которые фактически указывают на то, что вы узнали идентификатор, который, как оказалось, записан как конкретное ключевое слово.

Как вы интерпретируете это конечное состояние, зависит от вас. Один очевидный выбор заключается в том, что такие конечные состояния указывают на то, что вы нашли ключевое слово. Поиск по хеш-таблице не требуется.

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

Вы можете использовать совершенный хеш , такой как сгенерированный с gperf .

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

вы можете использовать хэш-таблицу для списка ключевых слов. Это делает ваш поиск O (1) сложность

...