Диссертация (1150733), страница 12
Текст из файла (страница 12)
Конечный преобразователь, построенный повходной спецификации, описывается с виде кода на языке F# и сохраняется вфайле (Lexer.fs). Далее данный файл может быть использован в пользовательском приложении, в рамках которого разрабатывается лексический анализатор,который устроен следующим образом. На вход принимается конечный автомат62над символами, результатом работы является конечный автомат над алфавитомтокенов анализируемого языка, полученный с помощью интерпретатора и преобразователя, построенного генератором. Входной конечный автомат может бытьпостроен с помощью компоненты построения регулярной аппроксимации. Основные структуры данных — конечный автомат и конечный преобразователь —и функции работы с ними описаны в соответствующей библиотеке.Рисунок 11: Архитектура лексического анализатораЛексический анализатор реализован на основе инструмента FsLex [87], который является стандартным генератором лексических анализаторов для языкаF#.
При реализации был переиспользован язык описания лексики и некоторыеструктуры данных.Реализованный генератор лексических анализаторов обладает следующимиособенностями.– Поддерживаются разрывные токены, то есть токены формируемые изнескольких строковых литералов.– Сохраняется привязка лексических единиц к исходному тексту программы:сохраняется информация о строковом литерале, из которого был создан токен, и его координаты внутри этой строки. Так как одна лексическая единица может формироваться из нескольких строковых литералов, то привязкасохраняется отдельно для каждой части.– Поддерживается обработка входных конечных автоматов, содержащихциклы.63– Так как значение токена может формироваться с помощью цикла и, какследствие, быть бесконечным, то каждый токен содержит конечный автомат, порождающий все его возможные значения, а не единственное значение, как это делается в классическом лексическом анализе [11, 88].Генератор синтаксических анализаторов, названный ARNGLR (AbstractRNGLR), реализован на основе алгоритма, описанного в разделе 2.2.
Его архитектура представлена на рисунке 12.Рисунок 12: Архитектура синтаксического анализатораГенератор реализован как один из модулей YC и может принимать на входвнутреннее представление грамматики (Intermidiate Language, IL), которое может быть получено с помощью различных фронтендов (Frontends). В рамкахYC.SEL.SDK основным фронтендом является YARD, так как он предоставляетнаиболее развитые средства для описания грамматик. По грамматике обрабатываемого языка строятся управляющие таблицы анализатора, которые сохраняются в файле Parser.fs.
Построенные таблицы должны быть включены в разрабатываемое приложение (компонента UserApplication). Интерпретатор, предназначенный для синтаксического разбора конечного автомата, полученный после лексического анализа, реализован в виде отдельной библиотеки ARNGLR.Runtime,которая также должна быть подключена к разрабатываемому приложению. В64результате работы интерпретатора будет получен SPPF, который может быть использован для дальнейшей обработки (например, подсчёта метрик). Для упрощения работы с SPPF реализован ряд вспомогательных функций.3.1.2Архитектура YC.SEL.SDK.ReSharperReSharper — это расширение к Microsoft Visual Studio IDE, предоставляющее широкий спектр дополнительной функциональности по анализу и рефакторингу кода. ReSharper поддерживает несколько языков, например C#, VisualBasic .NET, JavaScript, и этот список может быть расширен благодаря наличиюсвободно распространяемого ReSharper SDK, описание которого было представлено ранее в разделе 1.7.2.
ReSharper.SDK позволяет получить деревья разборадля поддерживаемых языков, предоставляет набор готовых анализов и упрощаетвзаимодействие с Microsoft Visual Studio IDE и её компонентами. Более того, онпредоставляет возможность разработки собственных расширений для ReSharperна основе ReSharper.SDK.Microsoft Visual Studio является достаточно распространённой средой разработки, но не поддерживает встроенные языки, поэтому было решено разработать ряд расширений к ReSharper с использованием разработанного инструментария, которые будут устранять данный недостаток. Стоит отметить, что неставилось задачи поддержать все встроенные языки, так как встроенным можетбыть любой язык программирования. Также не было необходимости поддержать все внешние языки программирования. Необходимо на базе разработанного YC.SEL.SDK создать инфраструктуру, позволяющую реализовывать поддержку новых встроенных языков в Microsoft Visual Studio через расширения кReSharper и реализовать несколько расширений, демонстрирующих возможности созданной инфраструктуры.Так как была поставлена задача поддерживать различные языки, то былонеобходимо обеспечить расширяемость новыми языками.
Обычно поддержканового языка реализуется в виде независимой компоненты. Если пользовательхочет получить поддержку какого-либо языка в своей среде разработки, то ондолжен установить соответствующий пакет. При этом поддержка различныхязыков осуществляется независимо, однако часто выделяется общая функцио-65нальность, которая может быть оформлена в виде отдельного повторно используемого пакета.Для предоставления описанных выше возможностей была реализована надстройка над YC.SEL.SDK, упрощающая создание расширений для ReSharperназванная YC.SEL.SDK.ReSharper. В неё включены компоненты, реализующиефункции, которые упрощают взаимодействие YC.SEL.SDK и ReSharper.SDK.Назначение основных из них описаны ниже.– Общая точка расширения, необходимая для подключения функциональности для различных встроенных языков, которая может быть реализована вразличных расширениях, к ReSharper через общий интерфейс.
Также общая точка расширения позволяет использовать общую функциональность,необходимую для работы со встроенными языками.– Отображение в IDE информации, полученной в ходе анализа. Например,подсветка синтаксиса и ошибок. Вывод диагностических сообщений с информацией об ошибках.– Преобразование данных, из формата, используемого в ReSharper.SDK, вформат для YC.SEL.SDK. Например, преобразование графа потока управления внешнего языка, построенного ReSharper.SDK, в формат, пригодныйдля построения регулярной аппроксимации средствами YC.SEL.SDK.– Управление работой анализаторов, необходимое, с одной стороны, дляобеспечения своевременной реакции на изменения в коде, совершённыепользователем, а с другой, для прекращения вычислений, результаты которых уже не актуальны.
Управление построено на основе общего дляReSharper механизма, обеспечивающего асинхронную работу анализов.При этом вычисления могут быть прерваны, если, например, пользовательвнёс в код изменения, делающие анализ или его результаты некорректными.При использовании встроенных языков могут использоваться различные способы выполнения сформированного запроса. Таким образом, необходимо предоставить возможность настройки расширений конечным пользователем. Для это-66го в рамках YC.SEL.SDK.ReSharper была реализована возможность управленияследующими параметрами расширений.– Подсветка синтаксиса для каждого языка. Предоставлена возможность указать цвет для каждого типа токена.– Указание парных элементов, то есть для каждого языка можно указать, какие лексические единицы считать парными: для каждой пары указывается“левый” (открывающая скобка) и “правый” (закрывающая скобка) элементы.
При расположении курсора в тексте рядом с одним из элементов парыбудут подсвечены соответствующие элементы. Пример подсветки парныхэлементов приведён на рисунке 23.– Точки интереса или хотспоты (hotspot) — места в программе, в которыхдолжно быть сформировано финальное выражение. При этом необходимо знать, какой хотспот какому языку соответствует.
При этом нужноучитывать, что одному языку может соответствовать несколько хотспотов. Например, динамически сформированный SQL-запрос в программена языке программирования C# может быть выполнен с помощью методаExecuteQuery класса DataContext 1 или же текст запроса может бытьпередан как аргумент конструктора класса SqlCommand 2 с последующимвыполнением с помощью метода ExecuteReader.Настройка указанных выше параметров хранится в соответствующих конфигурационных файлах в формате XML, которые на данный момент редактируются вручную. Настройка подсветки синтаксиса и парных элементов совмещена водном файле, и для каждого языка создаётся отдельный такой файл.
Конфигурационный файл с точками интереса является общим для всех языков и, соответственно, для всех установленных расширений поддержки встроенных языков.В листинге 15 приведён пример конфигурации подсветки синтаксиса и парных скобок для языка Calc. Для указания цвета используются имена, принятые1Документация метода ExecuteQuery .NET класса DataContext (дата обращения: 28.06.2015): https://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery(v=vs.110).aspx2Документация класса SqlCommand (дата обращения: 28.06.2015): https://msdn.microsoft.com/ru-ru/library/sebfsz50(v=vs.110).aspx67в ReSharper (например, "CONSTANT_IDENTIFIER_ATTRIBUTE"), что должносделать настройку цветов более единообразной.