Архитектура синтаксического анализатора XAML
Обновлен: Ноябрь 2007
Конструктор Windows Presentation Foundation (WPF) для Visual Studio (конструктор) загружает XAML-документы и создает объекты WPF для отображения в Visual Studio. Ошибки, обнаруженные во время загрузки, отображаются в окне «Список ошибок».
Этапы загрузки XAML-документов
Конструктор 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 Foo="Mark">.
Эти проходы включают разрешение типов, чтобы сведения, например имена элементов и имена свойств, могли быть проверены по типу элемента. Например, синтаксический анализатор проверяет, является ли Foo свойством Button. Отсутствие типов приводит к ошибкам.
Синтаксический анализатор пытается исправить ошибку; поэтому одна попытка разбора документа может выявить несколько ошибок. Однако сообщается не обо всех возможных ошибках. Например, если неправильно написаны имя элемента и имя свойства внутри элемента, изначально будет сообщено только об ошибке элемента, так как имена свойств не могут быть проверены до исправления элемента.
Примечание. |
---|
Этот этап не включает проверку значений свойств. Например, ошибка <Button Background="xBlue"/> не будет найдена на этом этапе. См. обсуждение ниже в этом разделе. |
Создание экземпляра модели и объекта
В конце проверки синтаксиса создается соответствующее XAML-коду дерево абстрактного синтаксиса, которое является относящимся к XAML объектом DocumentTree, действующим как представление или курсор в дереве абстрактного синтаксиса.
На последнем этапе создается экземпляр модели и базовые экземпляры, а значения свойств преобразуются из строк и назначаются свойствам. Синтаксический анализатор делает это путем создания дерева DocumentTree с помощью класса ModelDocumentTreeManager. При создании экземпляра DocumentTree для 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 правильного формата, но содержит одно или несколько несоответствий типов. |