Проверка корректности построенной модели заключается в сравнении текущей лексемы с ожидаемой конструкцией метамодели. Для этого с помощью метода рекурсивного вызова анализатор выполняет получение нужного узла дерева разбора и пытается интерпретировать текущий рассматриваемый символ модели, передаваемый лексическим анализатором, как ожидаемый символ.
В соответствие с алгоритмом проверки синтаксиса модели, описанным в главе анализа, неотъемлемой частью является хранение истории разбора программы. Для данных целей используется список объектов класса CCompileState, экземпляры которого определяют один уровень прохождения по синтаксическому дереву. Поскольку правила, включающие в себя альтернативные или повторяющиеся конструкции, образуют вложенный уровень иерархии разбора модели, в классе CCompileState предусмотрено поле GroupText, включающее список лексем текущей группы.
В процессе анализа программы методом List Compile (string s, int iCaret) компонент описания синтаксиса каждой конструкции ставит в соответствие определенный стиль для дальнейшего выделения цветом, после чего компонент проверки синтаксиса составляет разметку текста программы и заносит ее в поле CompiledText. Если вариант разбора признан некорректным (в частности невозможен дальнейший анализ текста программы), то при выборе нового варианта список CompiledText возвращается к разметке до текста, с которого будет происходить дальнейший разбор по алгоритму, описанному в разделе 2.5. Поле CompileError определяет наличие ошибок в последнем разобранном тексте программы и обуславливает цвет индикатора корректности модели в редакторе. Результатом работы метода является список элементов контекстного меню для заданного параметрами положения курсора. Если анализ программы невозможен из-за ошибок в языке, метод возвращает null.
Поскольку анализ программы происходит динамически важно в каждый конкретный момент формировать актуальный список подсказок с возможными вариантами продолжения текста программы. Первый раз меню для символов модели создается после разбора метамодели с помощью метода MakeMenu класса CDefined, после чего результат записывается в поле menus. Данные процессы протекают непараллельно, так как направление формирования меню (справа налево) не совпадает с направлением анализа программы. Обратный порядок разбора правила обусловлен необходимостью определения меню группы, которое включает в себя символы, следующие за данной конструкцией. При редактировании метамодели выполняется проверка на наличие значения в поле menus, поэтому повторное создание меню для конструкций языка не происходит, а лишь при необходимости редактируется его содержание, что позволяет сэкономить ресурсы.
Символы, которые могут служить возможным продолжением текста программы, отображаются при равенстве индекса конструкции текста модели, задаваемого курсором, и текущим анализируемым символом. Таким образом, меню редактора программы формируется на основе меню рассматриваемой конструкции, созданного в момент разбора метамодели (рис. 4.1).
Рисунок 4.1. Пример меню со списком терминальных символов.