Архитектура синтаксического анализатора XAML

Конструктор Конструктор WPF для Visual Studio загружает документы XAML и создает объекты WPF для отображения в Visual Studio. Ошибки, обнаруженные во время загрузки, отображаются в окне "Список ошибок".

Конструктор сред. Конструктор WPF загружает документ XAML и создает соответствующее дерево абстрактного синтаксиса (AST). Дерево абстрактного синтаксиса является структурой данных, представляющей разобранный код XAML. Это ограниченное, размеченное, ориентированное дерево, в котором внутренние узлы помечены операторами, а листовые узлы представляют собой операнды операторов узла. Листья имеют нульарные операторы, которые являются переменными или константами.

Загрузка XAML-документа происходит поэтапно, как показано в следующей таблице.

Этап загрузки XAML-документа

Описание

Проверка синтаксиса XML

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

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

Проверка синтаксиса XAML

Средство ConvertToXaml ищет все типы, помещает сведения о типах в дерево абстрактного синтаксиса XAML и размечает дерево абстрактного синтаксиса XAML.

Выполняет проверку ошибок и проверяет расположение узлов в дереве.

Создание экземпляра модели и объекта

Дискретный этап с отдельной проверкой всего дерева абстрактного синтаксиса, на котором создается модель редактирования и объекты WPF.

узлы, имеющие ошибки из предыдущих этапов, помечаются как ошибочные и больше не проверяются во время всех последующих этапов. Если возникли ошибки на этапе сканера и синтаксического анализатора, этап создания экземпляра модели и объекта не выполняется.

Проверка синтаксиса XML

На этапе сканера и синтаксического анализатора проверяется, что загружаемый документ является XML-документом правильного формата, не содержащим ошибок синтаксиса XML. Примером синтаксической ошибки XML является тег <Button> без соответствующего закрывающего тега</Button>. Синтаксический анализатор пытается исправить ошибку; поэтому одна попытка разбора документа может выявить несколько ошибок.

Проверка синтаксиса XAML

Синтаксический анализатор обходит дерево абстрактного синтаксиса XML в несколько проходов для проверки допустимости XAML документа, которая означает, что он соответствует XML-схеме XAML и не содержит недопустимого XAML-кода. Примером недопустимого XAML-кода является элемент, использующий недопустимые объявления свойства, например <Button SomeProperty="Mark">.

Эти проходы включают разрешение типов, чтобы сведения, например имена элементов и имена свойств, могли быть проверены по типу элемента.Например, синтаксический анализатор проверяет, является ли SomeProperty свойством Button. Отсутствие типов приводит к ошибкам.

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

Примечание Примечание

Этот этап не включает проверку значений свойств. Например, ошибка <Button Background="xBlue"/> не будет найдена на этом этапе. См. обсуждение ниже в этом разделе.

Создание экземпляра модели и объекта

В конце проверки синтаксиса создается соответствующее XAML-коду дерево абстрактного синтаксиса, которое является деревом документов, относящимся к XAML, действующим как представление или курсор в дереве абстрактного синтаксиса.

На последнем этапе создается экземпляр модели и базовые экземпляры, а значения свойств преобразуются из строк и назначаются свойствам. Для этого синтаксический анализатор создает дерево документов с помощью класса диспетчера дерева документов. При создании дерева документов для XAML также создаются базовые экземпляры WPF. Эти экземпляры используются в качестве представления в конструкторе.

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

Например, в фрагменте кода <Button Background="Test"/> преобразователь TypeConverter для типа Brush пытается преобразовать Test в экземпляр Brush. Поскольку Test не является допустимым значением Brush, преобразователь типа вызывает исключение, которое останавливает процесс синтаксического анализа для всех дочерних узлов, но не влияет на синтаксический анализ остальной части документа.

Значения свойств преобразуются из строк во время создания экземпляра объекта-владельца. Это происходит, когда объект-владелец используется на поверхности разработки. Многие ошибки диапазона значений не выводятся до тех пор, пока родительский объект не будет использоваться конструктором.

Такое поведение аналогично WPF-компиляции. Компилятор WPF не проверяет и не пытается преобразовать во время компиляции значения атрибутов (свойств). Преобразователи типов не вызываются до тех пор, пока системой WPF не будет создан экземпляр дерева объектов во время выполнения.

Примечание Примечание

Для загрузки словарей внешних ресурсов предусмотрено взаимодействие между моделью редактирования и синтаксическим анализатором. Когда модель редактирования должна загрузить дополнительные XAML-файлы, она инициирует операцию загрузки XAML.

В подразделе справки по сообщениям об ошибках сред. Конструктор WPF описывается, какой из этапов загрузки XAML порождает ошибку. В следующей таблице показаны соответствия между сообщениями и этапами.

Этап загрузки XAML-кода

Сообщение об ошибке

Проверка синтаксиса XML

Эта ошибка возникает в случае, когда XAML-файл не является XML-документом правильного формата.

Проверка синтаксиса XAML

Эта ошибка возникает, когда файл является допустимым XML-документом, но не является XAML-документом правильного формата.

Создание экземпляра модели и объекта

Эта ошибка возникает, когда файл является документом XAML правильного формата, но содержит одно или несколько несоответствий типов.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=29628