2016-12-22 3 views
0

У меня есть этот конкретный синтаксис:Как я могу определить конкретное значение синтаксиса «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>}`;

P.S. SyncBlock? syncBlock = … Результаты Ambiguous code (internal error), SyncBlock? syncBlock = …. Возможно, из-за двусмысленности оператора двусмысленность?

+0

Такая же проблема возникает для элементов синтаксиса 'X *'. – Tim

ответ

0

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

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

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

Сейчас это работает:

MaybeSyncBlock syncBlock = [MaybeSyncBlock]"sync { <syncStrings> }"; 
+0

это известная проблема. мы планируем общее решение. – jurgenv

Смежные вопросы