[Nitra] Работа с опциональными ast
От: meadow_meal  
Дата: 15.02.16 10:54
Оценка:
Здравствуйте,

В dsl есть понятия variant (ближайшая аналогия — абстрактный класс) и record (неабстрактный). Record может иметь или не иметь variant-предка.

Соответствующие ast (значимые для вопроса фрагменты):

declaration VariantDefinition
{
  symbol
  {
    out Descendants : List[RecordDefinitionSymbol];
  }
}

declaration RecordDefinition
{
  symbol
  {
    in Ancestor : VariantDefinitionSymbol;
  }

  AncestorReference.Scope = OuterScope;
  Symbol.Ancestor = AstUtils.ResolvedSymbol(AncestorReference.Ref);

  AncestorReference : VariantReference?;
}


Вопрос 1:
AstUtils.ResolvedSymbol преобразует ValueOption[Ref[T]] в T (или null если reference не задан или символ не найден). Это нормальный подход? Если нет, то как хранить в символах ссылки на опциональные символы?

Вопрос 2:
Мне нужен список Descendants в VariantDefinitionSymbol, но я не могу понять, как его вычислить.
Я пробовал в RecordDefinitionSymbol:
when (Ancestor != null)
  Ancestor.Descendants.Add(this);

Но это не работает (NullReferenceException в NitraVisualizer) (да и вообще, какой код можно выполнять в декларациях и символах? — в примерах можно найти when|unless(...) Error(...), а что еще можно?)

Не работает и через коллектор — when|unless(...) Ancestor.Descendants |= this; вообще не скомпилируется.

Как можно добиться нужного результата?
Отредактировано 15.02.2016 14:48 VladD2 . Предыдущая версия . Еще …
Отредактировано 15.02.2016 11:47 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.