Размер шрифта:
Средство анализа языковой службы и сканер (MPF)
Play

Средство анализа языковой службы и сканер (MPF)

Средство синтаксического анализа является основой языковой службы. Управляемые классы языка .NET Framework пакета (MPF) требуют средство синтаксического анализа языка, выбираются данные о показыванными коде. Средство синтаксического анализа разделяет текст на лексических токены, а затем определяет эти токены типом и функцией.

Обсуждение

Следующий метод c.

В этом примере токены машинные слова и символы пунктуации. Типы маркеров следующим образом.

пространство имен, класс public, void, int

MyNamespace, MyClass, MyFunction, аргумент1, var1

Роль средства синтаксического анализа определения токены. Некоторые токены могут иметь более одного типа. После того как средство синтаксического анализа определяет токены языка, служба может использовать сведения, чтобы предоставить полезные функции, такие как выделение синтаксиса, фигурная скобка соответствующий и операции IntelliSense.

Типы средств синтаксического анализа

Средство анализа языковой службы не то же, что и средство синтаксического анализа, используемое как часть компилятора. Однако этот тип средства синтаксического анализа необходимо использовать анализатор и средство чтения, и, тем же самым способом, что и средство синтаксического анализа компилятора.

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

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

Как реализуется средство чтения, и средство синтаксического анализа языка до для службы. Доступны несколько ресурсов, описать как средства синтаксического анализа и, как разработать собственное средство синтаксического анализа. Кроме того, некоторые выпуск и коммерческие продучты справка доступны, что при создании синтаксического анализатора.

Средство синтаксического анализа ParseSource

В отличие от синтаксического анализатора, которое используется как часть компилятора (где токены преобразованы к некоторой форму исполняемого кода), средство анализа языковой службы могут вызываться по разным причинам и в различных контекстах. Способ реализации такого подхода в ParseSource метод LanguageService класс до вас. Важно помнить, ParseSource метод может быть вызван в фоновом потоке.

ParseRequest структура содержит ссылку на IVsTextView объект.This IVsTextView объект не может использоваться отдельно в фоновом режиме потоком.В действительности, многие классы базы MPF не могут использоваться отдельно в фоновом режиме потоком.К ним относятся Source" ViewFilter" CodeWindowManager классы и любой другой класс, прямо или косвенно взаимодействуют с представлением.

Это средство синтаксического анализа, как правило анализирует весь файл источника в первый раз она вызывается при анализе или значение причины Check присваивает. Последующие вызовы ParseSource дескриптор метода небольшая часть проанализированного кода и может быть выполнен намного быстрее, используя результаты предыдущей полной анализирует операции. ParseSource метод передает результаты операции анализа посредством AuthoringSink и AuthoringScope объекты. AuthoringSink объект используется для сбора сведений для конкретной причины синтаксического анализа, например, сведения о диапазонах соответствия фигурных скобок или сигнатурам методов, имеющих списки параметров. AuthoringScope предоставляет коллекции объявлений и сигнатур метода, а также поддерживает для Перехода в расширенный параметр правки (Перейти к определению" Перейти к объявлению" Перейти по ссылке).

Средство чтения IScanner

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

Анализ для соответствующего фигурных скобок

Этот пример показывает поток элемента управления для сопоставления заключительной открывающей, которую пользователь типизированные. В этом процессе модуль чтения, который используется для колоризации также используются для указания типа токена и ли маркер может активировать операция спичк-расчалки. Если найден, то триггер ParseSource метод вызывается, чтобы найти соответствующий фигурная скобка. Наконец, 2 скобки.

Даже если скобки используются имена триггеров и анализа причины этот процесс не ограничен фактическим расчалкам. Все пары символов которых то, что соответствующим ключом поддерживаются. Примеры включают (и), < и > и [и].

Предположим, что языка, соответствующего фигурные скобки.

Пользовательские типы заключительная фигурная скобка (>).

Фигурная скобка вставлена на курсор в исходный файл перемещен и курсор на единицу.

OnCommand метод Source класс называется с типизированным заключительной расчалкой.

OnCommand вызовы метода GetTokenInfo метод Source класс, чтобы получить токен в позиции перед текущим положением курсора. Этот маркер соответствует типизированный заключительной открывающей).

GetLineInfo вызовы метода Colorizer метод GetTokenInfo объект, для которого необходимо получить все токены в текущей линии.

GetLineInfo вызовы метода SetSource метод IScanner объект с текстом текущей линии.

ScanTokenAndProvideInfoAboutIt повторно вызывает метод IScanner метод GetLineInfo объект для сбора все токены из текущей линии.

GetLineInfo вызовы метода закрытый метод GetTokenInfo класс, чтобы получить токен, который содержит нужное положение, и передает в список маркеров, полученных из Source метод.

OnCommand метод ищет пометить триггера токена MatchBraces на токене, возвращаемый GetTokenInfo метод; это значит, что маркер, представляющий заключительную расчалку).

Если пометить триггера MatchBraces находит Source метод MatchBraces класс называется.

MatchBraces метод запускается операция со значением причины анализ синтаксического анализа HighlightBraces. Эта операция в конечном счете вызовет ParseSource метод LanguageService класс. Если анализ асинхронного включен, то этот вызов ParseSource метод происходит в фоновом потоке.

Если при анализе завершении операции внутренний обработчик с именем завершения (также известный как метод обратного вызова) HandleMatchBracesResponse вызывает Source класс. Этот вызов выполняется автоматически LanguageService базовый класс, не синтаксическим анализатором.

HandleMatchBracesResponse метод возвращает список диапазонов из AuthoringSink объект, хранящийся в ParseRequest объект. (Диапазон a a TextSpan структура, которая определяет диапазон линий и символов в файле источника.) Этот список диапазонов обычно содержит 2 диапазона, один открывающий и по каждому для заключительных фигурных скобок.

HighlightMatchingBrace вызовы метода IVsTextView метод ParseRequest объект, хранящийся в HandleBracesResponse объект. Это выбирает заданный диапазон.

Если LanguagePreferences свойство EnableShowMatchingBrace включает HandleBracesResponse метод возвращает текст, который включается соответствующий диапазоном и выводит первые 80 символов данного диапазона в строке состояния. Это работает лучше всего, если ParseSource метод включает элемент языка, поставляемом вместе с соответствующей пары. Дополнительные сведения см. в описании свойства EnableShowMatchingBrace.

Сводка

Соответствующая операция фигурных скобок обычно ограничивается простым паре элементов языка. Более сложные элементы, как сопоставить утраивают ("if(…)"""или"else"""), может быть выбран в качестве части операции машинное слово-возобновлена. Например, если "другие" машинное слово завершения поиска"if"оператор для выбора. Если был рядов if/else if выписки, все они могут быть выбраны с помощью того же механизма, что и соответствующие фигурные скобки. Source базовый класс уже поддерживает это следующим образом: Модуль чтения должен возвращать значение токена триггера MatchBraces объединяется со значением триггера MemberSelect для токена, до позиции курсора.

Дополнительные сведения см. в разделе Парные фигурные скобки (MPF).

Анализ для колоризации

Исходный код Colorizing является прямолинейным, просто указывает тип данных цвета токена и возвращать сведения об этом типе. Colorizer выступает как посредник между редактором и модулем чтения предоставляет класс данные о цвете о каждом токене. Colorizer класс использует IScanner объект, который необходимо помочь в colorizing линия, а также для сбора сведений о состоянии всех линий в файле источника. В классах службы языка, MPF Colorizer класс не должен быть переопределен, поскольку он взаимодействует с модулем чтения только через IScanner интерфейс. Необходимо указать объект, реализующий IScanner интерфейс путем переопределения GetScanner метод LanguageService класс.

IScanner получает средство чтения через линию исходного кода SetSource метод. Вызовы ScanTokenAndProvideInfoAboutIt метод повторенн, чтобы получить следующий токен в линии до тех пор, пока линии не исчерпана маркеров. Для колоризации, MPF рассматривает весь код источника, как последовательность линий. Поэтому модуль чтения должен быть способен справиться с источником, поступающих на его как линии. Кроме того, любая линия, можно передать читателю в любое время, а линия гарантии, что средство чтения возвращает фазовую переменную из линий перед рядом с линией для просмотра.

Colorizer класс также используется для определения триггеры токена. Эти триггеры MPF говорят, что указанный маркер может инициировать более сложная операцию, например скобки завершения машинного слова или совпадать. Поскольку определение подобные триггеры должен быть быстрым и должен происходить в любом расположении, средство чтения наилучшим образом подходит для данной задачи.

Дополнительные сведения см. в разделе раскраска синтаксиса (MPF).

Анализ для получения соответствующих функций и области

Анализ для получения соответствующих функций и области требуется больше усилий, чем просто определение типов маркеров, которые встречаются. Средство синтаксического анализа должно задавать не только тип токена, но также функциональность, для которой маркер используется. Например, идентификатор только имя, но в своем языке, идентификатор может быть именем класса пространства имен, метода или переменной, в зависимости от контекста. Общий тип токена может быть идентификатором, однако идентификатор может иметь другие значения, в зависимости от того, что он и где он определен. Это идентификатор необходим синтаксический анализатор имеет больше основные сведения о языке, проанализировать. Здесь AuthoringSink класс. AuthoringSink класс собирает сведения об идентификаторах, методы эквивалентен языковым сопоставления (фигурные скобки и круглые скобки) и язык утраивает (аналогично языковым ключам, за исключением того, что 3 частей, например, "foreach()"""). Кроме того, можно переопределить AuthoringSink класс для поддержки идентификацию кода, которое используется в предыдущей проверке точки останова, что отладчик не должен быть загружен и Видимые окно отладки, указывающее локальные переменные и параметры автоматически, если программа отлаживается и требует средство синтаксического анализа определяет соответствующие локальных переменных и параметров в дополнение к тем, которые он представляет.

AuthoringSink объект передается средству синтаксического анализа в рамках ParseRequest объект, а новой AuthoringSink объект создается каждый раз новой ParseRequest объект создается. Кроме того, ParseSource метод должен возвращать AuthoringScope объект, который используется для обработки различных операции IntelliSense. AuthoringScope объект ведет список объявлений и список методов, что заполняет в зависимости от причины для синтаксического анализа. AuthoringScope класс должен быть реализован.

📎📎📎📎📎📎📎📎📎📎