ЛЕКСИЧЕСКИЙ АНАЛИЗАТОР

advertisement
РАСШИРЕНИЯ ЯЗЫКОВ
Как обычно расширяются возможности языков программирования? Во-первых, с
помощью библиотек функций. С появлением ООП, стало возможным расширение типов.
В данной работе рассматривается новая альтернативная возможность расширения языков
– это расширение их синтаксиса, то есть фактически, расширение транслятора.
Для того, чтобы лучше пояснить суть идеи, рассмотрим пример кода на гипотетическом
языке с расширяемым синтаксисом.
ПРИМЕР
Сначала в исходном файле подключается расширение синтаксиса, добавляющее
поддержку технологии sql-запросов.
Это даёт возможность дальше использовать специфические синтаксические конструкции:
в частности, писать sql запросы прямо в исходном коде. Благодаря этому среда разработки
может подсвечивать синтаксис sql запроса, а компилятор проверять его корректность
прямо на этапе компиляции.
В запросе можно использовать локальные переменные, что безусловно очень удобно.
И, наконец, созданный запрос можно выполнить.
ЧТО ЭТО ДАЁТ?
Как было видно из примера, подобный подход даёт несколько преимуществ:

Каждое расширение предлагает удобный синтаксис для решения своей конкретной
задачи.

Многие проверки переносятся с этапа выполнения на более ранний этап
компиляции. В нашем примере, это случилось с проверкой корректности sqlзапросов.

Всё это даёт возможность гибко и качественно поддерживать множество
различных технологий и парадигм прямо на уровне синтаксиса языка.
ТРАНСЛЯЦИЯ
Расширение синтаксиса означает расширение транслятора. В классической схеме
построения транслятора, исходный код программы в виде последовательности символов
сначала поступает на вход лексическому анализатору, который выделяет из текста
отдельные лексемы. Затем поток лексем преобразуется синтаксическим анализатором в
некоторое внутреннее представление программы, с которым потом работают дальнейшие
этапы трансляции.
Расширение транслятора подразумевает, что каждый из этих этапов станет расширяемым.
Само расширение выглядит примерно так. К каждому из этапов подключается модуль
расширения, добавляющий поддержку дополнительных возможностей (в нашем примере
– поддержку sql)
В данной работе рассматриваются вопросы
синтаксических и лексических анализаторов.
создания
расширяемых
версий
ЛЕКСИЧЕСКИЙ АНАЛИЗАТОР
При создании ЛА наиболее распространены два способа. Первый основан на теории
регулярных выражений и конечных автоматов. Во втором способе тип очередной лексемы
определяется по одному или двум первым символам лексемы.
На базе каждого из этих способов мной были разработаны расширяемые версии ЛА-ов.
В чём же особенности расширяемых анализаторов?
РАСШИРЯЕМЫЙ ЛА. Особенности
Лексический анализатор перестаёт быть чем-то монолитным и неизменным, а гибко
настраивается и расширяется. В результате расширения, в процессе добавления новой
лексемы может возникнуть конфликт с добавленными ранее лексемами. В качестве
примера тут приведён знак «меньше либо равно», который может интерпретироваться
двояко.
Для обоих способов построения ЛА мной были разработаны алгоритмы диагностирования
подобных конфликтов и их автоматического разрешения в случаях, когда это возможно.
СИНТАКСИЧЕСКИЙ АНАЛИЗАТОР
Этап синтаксического анализа обычно управляется формальной грамматикой.
Суть расширения синтаксического анализатора – это модификация грамматики.
Итак, как же модифицировать грамматику?
СИНТАКСИЧЕСКИЙ АНАЛИЗАТОР. Совместимость расширения
При расширении важно, чтобы
исходной. То есть программы
расширенным СА-ом точно в то
Вообще говоря, проверка этого
неразрешимой задачей.
расширенная грамматика оставалась совместимой с
исходной грамматики должны преобразовываться
же внутреннее представление, что исходным СА-ом.
условия в общем случае является алгоритмически
СИНТАКСИЧЕСКИЙ АНАЛИЗАТОР. Расширение
Для того, чтобы не решать эту неразрешимую задачу, можно поступить так. Расширение
можно свести к серии безопасных преобразований грамматики: в результате каждого из
таких безопасных преобразований получаются грамматики заведомо совместимые с
исходной.
Система таких безопасных преобразований мной и была разработана.
ПРАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ
Теоретические разработки были проверены на практике. А именно, на языке Java были
реализованы следующие вещи:
•
Расширяемый «подглядывающий» ЛА
•
Расширяемый предсказывающий LL(1) синтаксический анализатор
•
Для модельного языка Pascal-S разработана грамматика ядра этого языка и
несколько независимых расширений этого ядра, которые в совокупности и
формируют полную грамматику языка Pascal-S.
ВЫВОДЫ
В этой работе показано, что столь нетривиальные этапы как лексический и
синтаксический анализ допускают расширение. Это означает, что изначальная идея –
создание ЯП с расширяемым синтаксисом не является утопией и вполне реализуема на
практике.
А учитывая свойственные этому подходу преимущества, можно предположить, что
будущее промышленного программирования будет именно за этим подходом.
Download