Вы можете иметь столько правил, сколько вам нужно, с одной и той же правой стороной, независимо от того, пусто оно или нет, если только они никогда не применимы.
Это нормально:
foo_list: %empty
| foo_list foo
bar_list: %empty
| bar_list bar
Но возникает двусмысленность, если вы затем попробуете это:
either_list: foo_list | bar_list
, потому что тогда неясно, к какой альтернативе относится пустая either_list
.Применяются оба пустых правила.
С другой стороны, это нормально:
both_list: foo_list bar_list
Здесь пустое both_list
однозначно содержит пустое foo_list
, за которым следует пустое bar_list
.
( Примечание: во втором примере требуется, чтобы foo
и bar
можно было различить по их первому токену. Если нет, вы получите конфликт сдвиг-уменьшение.)