Есть граматика, похожая на JSON. После парсинга и маппинга, обрабатываю результат в RefreshProject.
Допустим, у меня есть набор правил вроде: "Корневой элемент должен иметь имя ABC". Что делать, если встречаю элемент с другим именем? Каким образом показать эту ошибку пользователю?
Здравствуйте, ionoy, Вы писали:
I>Есть граматика, похожая на JSON. После парсинга и маппинга, обрабатываю результат в RefreshProject.
I>Допустим, у меня есть набор правил вроде: "Корневой элемент должен иметь имя ABC". Что делать, если встречаю элемент с другим именем? Каким образом показать эту ошибку пользователю?
В AST-е пишешь что-то вроде:
when (твои проверки)
Error("сообщение об ошибке.");
Пример с описанием есть
здесьАвтор(ы):
, разделе "Коллекторы". Вот он:
abstract declaration Type : BindableAst
{
symbol
{
in Flags : ModifierSet; // 3
}
Symbol.Flags |= Modifiers.Flags; // 4
Modifiers.Flags = ModifierSet(context); // 5
Attributes.NameScope = Scope;
unless (Modifiers.Flags.IsEmpty || Modifiers.Flags.Equals(Symbol.Flags)) // 6
Error("Partial declarations of type have conflicting accessibility modifiers.");
Attributes : Attribute*;
Modifiers : Modifier*;
}
Общая идея такая. Кроме вычислений на зависимых свойствах так же допустимы и вызовы методов (обычных, дотнетных). Их можно "защищать" с помощью "when" и "unless". Все их содержимое расценивается нитрой как зависимые вычисления по этому сообщение будет выдано только после того как все значения будут доступны.
Ну, еще есть императивный вариант. После всех обработок можно тупо пройтись Посетителем. Для этого нужно реализовать IAstVisitor. Но думаю тебе это не понадобится. Если понадобится, просто поищи его реализации. Там все очевидно.
Здравствуйте, VladD2, Вы писали:
I>>Допустим, у меня есть набор правил вроде: "Корневой элемент должен иметь имя ABC". Что делать, если встречаю элемент с другим именем? Каким образом показать эту ошибку пользователю?
VD>В AST-е пишешь что-то вроде:
VD>VD> when (твои проверки)
VD> Error("сообщение об ошибке.");
VD>
Добавил
when (true)
Error("ERROR!");
сразу в несколько AST. Visualiser нигде ошибку не показывает. Ast не должен являться для этого декларацией?
Здравствуйте, ionoy, Вы писали:
I>Добавил
I>I>when (true)
I> Error("ERROR!");
I>
I>сразу в несколько AST. Visualiser нигде ошибку не показывает.
Странно.
I>Ast не должен являться для этого декларацией?
Это по фигу.
Здравствуйте, VladD2, Вы писали:
I>>Добавил
I>>I>>when (true)
I>> Error("ERROR!");
I>>
I>>сразу в несколько AST. Visualiser нигде ошибку не показывает.
Понял, нужно обязательно вызывать
AstUtils.EvalProperties
Здравствуйте, ionoy, Вы писали:
I>Понял, нужно обязательно вызывать
I>AstUtils.EvalProperties
Ну, это — да. Вся магия по вычислению зависимых свойств ею осуществляется. Причем ее нужно вызывать столько, сколько есть явных стадий.