Как я могу создать конкретный синтаксис `X?`

У меня есть этот конкретный синтаксис:

syntax SomeMore = [...] SyncBlock? sync;
syntax SyncBlock = "sync" "{" SyncStatement* stats "}";
syntax SyncStatement = [...];

[SyncBlock]"sync { <syncStrings> }" кажется, работает, но когда я пытаюсь использовать его как SyncBlock? и назначьте это:

SyncBlock? sync = [SyncBlock?]"sync { <syncStrings> }"

это не работает: inline parsing not supported on SyncBlock?какой самый простой способ создать значение этого X?-тип?

Могу ли я преобразовать SyncBlock к SyncBlock? каким-то образом?

Нечто подобное также не работает:syncBlock = (SyncBlock?)`sync { <SyncStatement* syncs>}`;

PS SyncBlock? syncBlock = … результаты в Ambiguous code (internal error), SyncBlock? syncBlock = …, Вероятно, из-за неопределенности троичного оператора?

1 ответ

Решение

Я нашел обходной путь, не идеальный, но он работает. Кажется, что ? в типах вводит некоторые трудности, но может быть обойдено с помощью "псевдонима" для этого типа:

Я изменил грамматику на:

syntax SomeMore = [...] MaybeSyncBlock sync;
syntax MaybeSyncBlock = SyncBlock?;
syntax SyncBlock = "sync" "{" SyncStatement* stats "}";
syntax SyncStatement = [...];

Теперь это работает:

MaybeSyncBlock syncBlock = [MaybeSyncBlock]"sync { <syncStrings> }";
Другие вопросы по тегам