Parser Generator
Инструментарий для построения компиляторов. |
Главная О сайте Документация Download Ссылки Библиография О нас |
Лексический анализ.Любой текст представляет собой набор символов, который необходимо проанализировать. Самая первая задача, которая встает перед компилятором- выделение из этого набора символов лексем- синтаксически значимых единиц. К лексемам относятся ключевые слова, знаки операций, числа, строки, разделители, идентификаторы. Таким образом, лексический анализ "укрупняет" единицы анализа. Можно, конечно, написать грамматику, на вход которой можно подавать простой поток символов, но это связано с большими трудностями и неэффективно. Лексические анализаторы еще называют сканерами. Лексический анализ требует значительного времени, так как ему достается самая "черновая" работа. В его задачи входит: выделять из текста лексемы и определять, к какому классу они относятся (какой терминал представляют). В некоторых реализациях еще необходимо строить различные таблицы (например идентификаторов, в которые заносится информация о типах идентификаторов и их значениях). Результат своей работы лексический анализатор передает синтаксическому анализатору в виде последовательности лексем. Существует две стратегии лексического анализа: Каждый из подходов имеет свои преимущества и недостатки: пошаговый анализатор не тратит время на составление списка всех лексем, что выгодно, если вероятно появление синтаксической ошибки в тексте. С другой стороны реализация лексического анализа для всего текста несколько проще и эффективней. В дальнейшем будет рассматриваться реализация пошагового сканера.
Интерфейс ITokenizerРазличных реализаций лексического анализа может быть великое множество, однако для парсеров все они схожи в одном- все они должны "поставлять" лексемы. Таким образом, можно определить общий для всех сканеров интерфейс, реализовывая который они будут использоваться сканерами.
Класс ITokenizer определят общий для всех сканеров интерфейс. С помощью этого интерфейса все классы-наследники будут использоваться сканерами.
Хочется также отметить, что второй вариант лексического анализатора также
может использовать данный интерфейс. Например при первом своем запуске,
он целиком сканирует входной поток, составляет список лексем, а затем по
одной возвращает через метод Применение регулярных выражений для лексического анализа. Класс RETokenizerМощным инструментом для лексического анализа являются регулярные выражения. Регулярные выражения (РВ) успешно используются во многих приложениях. Фактически РВ- это краткий способ описания множества цепочек. Когда они только появились, они полностью соответствовали автоматным грамматикам и можно было сказать, что РВ- другой способ записи автоматной грамматики. Однако вскоре появились множество расширений, которые увеличили класс языков, определяемых РВ. Но даже классический вариант РВ позволяет эффективно описывать цепочки символов определенного вида. Однако простое описание не то преимущество, которое позволяет использовать РВ как средство лексического анализа. Существуют очень эффективные алгоритмы распознавания РВ на основе конечных автоматов. Эти алгоритмы позволяют за линейное время выделить из текста цепочку, которая описывается сколь угодно сложным РВ. Вот пример, описывающий лексемы практически любого языка программирования.
Как видно практически любой тип лексемы можно задать с помощью
регулярного выражения. Однако возникает проблема: одна лексема может
подходить под шаблоны нескольких регулярных выражений. Например,
ключевое слово
Еще одна проблема заключается в том, что начало одно лексемы может
совпадать с другой, например начало идентификатора переменной
Для лексического анализа на основе РВ используется класс RETokenizer. Этот класс осуществляет анализ входного текста поставляя лексемы через реализуемый интерфейс ITokenizer.
Класс RETokenizer реализует интерфейс ITokenizer. Для того, чтобы сконфигурировать сканер нужно задать РВ и приоритет для каждого терминала.
|
|||||||||||||||
© С. Григорчук 2001, Содержание, дизайн |
|