Я пытаюсь разобрать простую грамматику с помощью генератора синтаксических анализаторов LALR (1) (Bison, но проблема не связана с этим инструментом), и я вступаю в конфликт с уменьшением сдвига. В документах и других источниках, которые я нашел об их исправлении, обычно говорится об одном или нескольких из следующих:
- Если грамматика неоднозначна (например, неопределенность if-then-else), измените язык, чтобы исправить неоднозначность.
- Если это проблема приоритета оператора, укажите приоритет явно.
- Примите разрешение по умолчанию и попросите генератор не жаловаться на него.
Однако ни один из них, похоже, не применим к моей ситуации: насколько я могу сказать, грамматика однозначна (хотя, конечно, она неоднозначна только с одним символом предвкушения), у нее только один оператор, и разрешение по умолчанию приводит разобрать ошибки на правильно сформированном вводе. Существуют ли какие-либо методы для доработки определения грамматики для устранения конфликтов с уменьшением смещения, которые не попадают в указанные выше области?
Для конкретности, вот грамматика, о которой идет речь:
%token LETTER
%%
%start input;
input: /* empty */ | input input_elt;
input_elt: rule | statement;
statement: successor ';';
rule: LETTER "->" successor ';';
successor: /* empty */ | successor LETTER;
%%
Цель состоит в том, чтобы разобрать разделенные точкой с запятой строки вида "[A-Za-z] +" или "[A-Za-z] -> [A-Za-z] +".