【问题标题】:How can I contruct a `X?` concrete syntax value?如何构造一个“X?”具体的语法值?
【发布时间】:2016-12-22 09:02:00
【问题描述】:

我有这个具体的语法:

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?-type 的值的最简单方法是什么?

我可以将SyncBlock 转换为SyncBlock? 吗?

这样的事情也行不通: syncBlock = (SyncBlock?)`sync { &lt;SyncStatement* syncs&gt;}`;

附: SyncBlock? syncBlock = … 导致 Ambiguous code (internal error), SyncBlock? syncBlock = …。可能是由于三元运算符的歧义?

【问题讨论】:

  • X* 语法元素似乎也会出现同样的问题。

标签: rascal concrete-syntax-tree


【解决方案1】:

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

我把语法改成:

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

现在可以了:

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

【讨论】:

  • 这是一个已知问题。我们正在计划一个通用的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 2012-09-09
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多