Архитектура синтаксического анализатора XAMLИсточник: msdnmicrosoft
Конструктор Конструктор WPF для Visual Studio загружает документы XAML и создает объекты WPF для отображения в Visual Studio. Ошибки, обнаруженные во время загрузки, отображаются в окне "Список ошибок". Конструктор сред. Конструктор WPF загружает документ XAML и создает соответствующее дерево абстрактного синтаксиса (AST). Дерево абстрактного синтаксиса является структурой данных, представляющей разобранный код XAML. Это ограниченное, размеченное, ориентированное дерево, в котором внутренние узлы помечены операторами, а листовые узлы представляют собой операнды операторов узла. Листья имеют нульарные операторы, которые являются переменными или константами. Загрузка XAML-документа происходит поэтапно, как показано в следующей таблице.
узлы, имеющие ошибки из предыдущих этапов, помечаются как ошибочные и больше не проверяются во время всех последующих этапов. Если возникли ошибки на этапе сканера и синтаксического анализатора, этап создания экземпляра модели и объекта не выполняется. Проверка синтаксиса XMLНа этапе сканера и синтаксического анализатора проверяется, что загружаемый документ является XML-документом правильного формата, не содержащим ошибок синтаксиса XML. Примером синтаксической ошибки XML является тег <Button> без соответствующего закрывающего тега</Button>. Синтаксический анализатор пытается исправить ошибку; поэтому одна попытка разбора документа может выявить несколько ошибок. Проверка синтаксиса XAMLСинтаксический анализатор обходит дерево абстрактного синтаксиса XML в несколько проходов для проверки допустимости XAML документа, которая означает, что он соответствует XML-схеме XAML и не содержит недопустимого XAML-кода. Примером недопустимого XAML-кода является элемент, использующий недопустимые объявления свойства, например <Button SomeProperty="Mark">. Эти проходы включают разрешение типов, чтобы сведения, например имена элементов и имена свойств, могли быть проверены по типу элемента.Например, синтаксический анализатор проверяет, является ли SomeProperty свойством Button. Отсутствие типов приводит к ошибкам. Синтаксический анализатор пытается исправить ошибку; поэтому одна попытка разбора документа может выявить несколько ошибок. Однако сообщается не обо всех возможных ошибках. Например, если неправильно написаны имя элемента и имя свойства внутри элемента, изначально будет сообщено только об ошибке элемента, так как имена свойств не могут быть проверены до исправления элемента.
Создание экземпляра модели и объектаВ конце проверки синтаксиса создается соответствующее XAML-коду дерево абстрактного синтаксиса, которое является деревом документов, относящимся к XAML, действующим как представление или курсор в дереве абстрактного синтаксиса. На последнем этапе создается экземпляр модели и базовые экземпляры, а значения свойств преобразуются из строк и назначаются свойствам. Для этого синтаксический анализатор создает дерево документов с помощью класса диспетчера дерева документов. При создании дерева документов для XAML также создаются базовые экземпляры WPF. Эти экземпляры используются в качестве представления в конструкторе. При вызове исключения во время создания модели и экземпляров создание любых объектов для дочерних узлов того узла, где произошла ошибка, не будет выполнено. Модель создается для остальной части дерева. Это приводит к индикации большого количества ошибок. Например, в фрагменте кода <Button Background="Test"/> преобразователь TypeConverter для типа Brush пытается преобразовать Test в экземпляр Brush. Поскольку Test не является допустимым значением Brush, преобразователь типа вызывает исключение, которое останавливает процесс синтаксического анализа для всех дочерних узлов, но не влияет на синтаксический анализ остальной части документа. Значения свойств преобразуются из строк во время создания экземпляра объекта-владельца. Это происходит, когда объект-владелец используется на поверхности разработки. Многие ошибки диапазона значений не выводятся до тех пор, пока родительский объект не будет использоваться конструктором. Такое поведение аналогично WPF-компиляции. Компилятор WPF не проверяет и не пытается преобразовать во время компиляции значения атрибутов (свойств). Преобразователи типов не вызываются до тех пор, пока системой WPF не будет создан экземпляр дерева объектов во время выполнения.
В подразделе справки по сообщениям об ошибках сред. Конструктор WPF описывается, какой из этапов загрузки XAML порождает ошибку. В следующей таблице показаны соответствия между сообщениями и этапами.
|