2015-07-07 3 views
4

Я новичок в разработке lex и yacc и компилятора. Хотелось бы узнать, на какой стадии (лексической, синтаксической или любой другой фазе) и как создается таблица символов?lex and yacc (генерация символов)

Могу ли я получить краткое описание файла y.output, который генерируется путем предоставления опции -v для yacc.I, и попытался заглянуть в нее, но не получил много информации.

Могу ли я узнать другие приложения, в которых lex и yacc используются отдельно от проектов компилятора.

+0

Вы прочитали документацию? Вы можете использовать lex/yacc также для проверки операторов sql, короче говоря: любой язык с четким синтаксисом. –

ответ

5

Таблица символов - это глобальная структура данных, которая может использоваться на всех этапах/этапах/проходах компилятора. Это означает, что его можно использовать/получить доступ как из компонентов, созданных lex, так и из yacc.

Обычно для доступа к записи таблицы символов из лексического анализатора, когда он находит маркер, который будет храниться в таблице, такой как идентификатор, он может найти запись и обновить ее с информацией, доступной только для lexer как номер строки и позиция символа, а также может хранить значение lexeme, если оно еще не существует. Указатель таблицы символов теперь может быть возвращен в lval токена.

Некоторые люди предпочитают возвращать указатель на сам лексем (как lval) из лексера в синтаксический анализатор и открывать туда начальную таблицу символов. Это имеет то преимущество, что таблица символов не должна быть видимой для лексера, но имеет тот недостаток, что информация лексера, описанная выше, может быть недоступна для хранения с символом. Это часто имеет недостаток, заключающийся в том, что действия парсера от yacc немного более «заняты», поскольку они могут быть задействованы в управлении таблицей символов, а также деревом разбора.

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

Таблица символов - это структура данных, которую вы создатель компилятора создайте для себя. Нет никакой функции lex или yacc, которая сделает это за вас. Он генерируется так же, как и когда создается любой написанный вами код!

Файл y.output не имеет ничего общего с таблицами символов. Это запись о том, как yacc преобразовал контекстную свободную грамматику в таблицу разбора. Это полезно, когда у вас есть неоднозначная грамматика и вы хотите знать, какие правила вызывают ошибки сдвига/уменьшения или уменьшения/уменьшения при отладке вашей грамматики.

Последняя часть вопроса, что использует этот инструмент? lex - это инструмент, который генерирует код для конечного автомата, который распознает указанные вами шаблоны. Он не должен использоваться при написании компиляторов. Одно интересное использование заключается в обработке сетевых протоколов, которые могут обрабатываться конечным автоматом, например, датаграмм TCP/IP и т. Д. Аналогично, yacc используется в совпадающих последовательностях, которые описываются контекстно-свободными грамматиками. Они не должны быть программами, но могут быть другими сложными последовательностями символов, полей или элементов данных. Они обычно являются кусочками текста, и это ортодоксальное использование инструмента.

Эти части вашего вопроса действительно звучат как вопрос экзамена, который кто-то может написать для студентов, которые посетили курс в компиляторах!

+0

Спасибо Брайан за ответ. Концепция таблицы символов ясна благодаря вашему времени. –