Почему в Rascal, когда на позиции необязательной части продукции находится макет, это вызывает двусмысленность? Например. "{ }"
неоднозначен, как Start1
, в то время как он отлично анализируется как Start2
из следующей грамматики, которая, как я ожидал, будет точно идентичной.
layout Layout = " "?;
start syntax Start1 = "{" "c"? "}";
start syntax Start2 = "{" "c" "}"
| "{" "}";
Кроме того, я хотел бы знать, есть ли другой способ представления Start2
без дублирования, чем Start1
, который не вызывает такой же двусмысленности.
Очевидно, что в этом коде нет большого количества дубликатов, и Start2
здесь хороший вариант, но это всего лишь пример. Я работаю с грамматикой со многими продуктами, которые содержат три или четыре необязательные части, и в последнем случае обозначение, отображаемое в Start2
, уже требует дублирования необязательных частей продукта 2 ^ 4 = 16 раз, что действительно проблематично в моем случае. мнение.