Как предотвратить уменьшение / уменьшение конфликтов для нескольких пустых правил? - PullRequest
0 голосов
/ 18 июня 2019

Я только начинаю изучать веревки с Бизоном и очень смущен пустым правилом. Итак, мой первый вопрос: может ли только одно правило соответствовать пустому? Я читаю здесь и мне интересно, что если мне потребуются 2 правила, которые могут иметь «0 или более чего-либо». Разве это не создаст двусмысленность для парсера? Я проверил это, и это дает мне конфликт уменьшить / уменьшить.

Еще больше меня смущает то, что я проверил некоторые правила игры, такие как:

rule1: TOKEN { printf("rule1"); }
    | ANOTHER_TOKEN { printf("rule1"); }
;

rule2: ANOTHER_TOKEN { printf("rule2"); }
;

Это, очевидно, неоднозначно, поскольку rule1 и rule2 совпадают с одним и тем же входом (я проверял это), но это не дает мне предупреждение о конфликте уменьшения / уменьшения. Есть ли причина, почему? Следует ли избегать таких вещей, как приведенный выше код любой ценой?

1 Ответ

0 голосов
/ 18 июня 2019

Вы можете иметь столько правил, сколько вам нужно, с одной и той же правой стороной, независимо от того, пусто оно или нет, если только они никогда не применимы.

Это нормально:

 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 можно было различить по их первому токену. Если нет, вы получите конфликт сдвиг-уменьшение.)

...