如何构造一个`X?`具体的语法值?

时间:2016-12-22 09:02:01

标签: rascal concrete-syntax-tree

我有这个具体的语法:

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 = …。可能是由于三元运算符模糊不清?

1 个答案:

答案 0 :(得分:0)

我发现了一种解决方法,并不理想,但它确实有效。 似乎类型中的?引入了一些困难,但可以使用此类别的“别名”来规避:

我将语法改为:

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

现在可行:

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