Я пытаюсь описать грамматику в бизоне, но я не уверен, что это можно сделать. Моя предназначена грамматика это:Сдвиг-сокращение конфликтов в простой грамматике (?)
%token A B C D SEP
%%
items : /* empty */
| items_nonempty
;
items_nonempty : item
| items_nonempty SEP item
;
item : B
| B SEP D
| B SEP C
| B SEP C SEP D
| A SEP B
| A SEP B SEP D
| A SEP B SEP C
| A SEP B SEP C SEP D
;
«items
» является (возможно, пустой) последовательность item
элементов, разделенных SEP
маркером.
Каждый элемент состоит из 4 жетонов (A B C D
), в указанном порядке, разделенных SEP
. Знаки A
, C
и D
в элементе являются необязательными.
Обратите внимание на повторное использование одного и того же разделительного маркера SEP внутри каждого элемента и между самими элементами.
Я надеюсь, что предполагаемый грамматик ясен. Я думаю, что это однозначно, но я совершенно не уверен, если он достаточно ограничен, чтобы разобраться с бизоном - к сожалению, знание моего парсера довольно ржавое.
Используя грамматику, как указано, зубры сообщают о 4 смещениях/сокращениях конфликтов. Глядя на «выход», я понимаю, где они происходят и почему; но я в недоумении, как (и если) намеченная грамматика может быть написана, чтобы избавиться от конфликтов S/R.
Я не желаю использовать объявление %expect
. Точно так же я не хочу, чтобы мой сканер потреблял токены разделителя, а не передавал их парсеру.
Любые подсказки о том, как дезинформировать эту грамматику, будем очень благодарны.