[Nitra] Как вручную добавить ошибку?
От: ionoy Эстония www.ammyui.com
Дата: 06.12.15 16:43
Оценка:
Есть граматика, похожая на JSON. После парсинга и маппинга, обрабатываю результат в RefreshProject.
Допустим, у меня есть набор правил вроде: "Корневой элемент должен иметь имя ABC". Что делать, если встречаю элемент с другим именем? Каким образом показать эту ошибку пользователю?
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re: [Nitra] Как вручную добавить ошибку?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.15 07:30
Оценка:
Здравствуйте, 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. Но думаю тебе это не понадобится. Если понадобится, просто поищи его реализации. Там все очевидно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nitra] Как вручную добавить ошибку?
От: ionoy Эстония www.ammyui.com
Дата: 07.12.15 10:29
Оценка:
Здравствуйте, VladD2, Вы писали:

I>>Допустим, у меня есть набор правил вроде: "Корневой элемент должен иметь имя ABC". Что делать, если встречаю элемент с другим именем? Каким образом показать эту ошибку пользователю?


VD>В AST-е пишешь что-то вроде:

VD>
VD>  when (твои проверки)
VD>    Error("сообщение об ошибке.");
VD>


Добавил

when (true)
  Error("ERROR!");


сразу в несколько AST. Visualiser нигде ошибку не показывает. Ast не должен являться для этого декларацией?
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[3]: [Nitra] Как вручную добавить ошибку?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.15 13:24
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Добавил

I>
I>when (true)
I>  Error("ERROR!");
I>

I>сразу в несколько AST. Visualiser нигде ошибку не показывает.

Странно.

I>Ast не должен являться для этого декларацией?


Это по фигу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nitra] Как вручную добавить ошибку?
От: ionoy Эстония www.ammyui.com
Дата: 07.12.15 14:52
Оценка:
Здравствуйте, VladD2, Вы писали:

I>>Добавил

I>>
I>>when (true)
I>>  Error("ERROR!");
I>>

I>>сразу в несколько AST. Visualiser нигде ошибку не показывает.

Понял, нужно обязательно вызывать
AstUtils.EvalProperties
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[5]: [Nitra] Как вручную добавить ошибку?
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.12.15 17:28
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Понял, нужно обязательно вызывать

I>
AstUtils.EvalProperties


Ну, это — да. Вся магия по вычислению зависимых свойств ею осуществляется. Причем ее нужно вызывать столько, сколько есть явных стадий.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.